0

我正在为 Expression Engine 编写一些脚本,并且被告知我们输出到页面的每一条数据都需要“清理”以防止 XSS。

例如在这里,我从数据库中获取所有类别,排序到一个数组并返回到表达式引擎。

PHP 函数

public function categories()
{
    $query = $this->crm_db->select('name, url_name')
        ->order_by("name", "asc")
        ->get_where('activities_categories', array('active'=>1));

    foreach($query->result() as $row)
    {
        $activityCategories[0]['cats'][] = array(
                    'categoryName' => $row->name,
                    'categoryURL' => $row->url_name,
                );
    }   
    return $this->EE->TMPL->parse_variables($this->EE->TMPL->tagdata, $activityCategories);
}

模板代码

            {exp:activities:categories}
                {cats}
                    <a href="/{categoryURL}">{categoryName}</a>
                {/cats}
            {/exp:activities:categories}

有人告诉我,我需要对正在输出的每条数据使用 htmlspecialchars() 函数。

这是必要的吗?

这个对吗?

例子:

foreach($query->result() as $row)
{
    $activityCategories[0]['cats'][] = array(
                'categoryName' => htmlspecialchars($row->name),
                'categoryURL' => htmlspecialchars($row->url_name),
            );
}   

非常感谢!:)

4

3 回答 3

3

htmlspecialchars()除非另有说明,否则所有HTML输出都需要。

其他输出媒体(例如JSJSON)需要自己的转义。

于 2013-07-23T14:50:16.690 回答
1

是否htmlspecialchars足够取决于数据所在的上下文。因为它只使用字符引用来转义某些字符,这只是在某些上下文中的一种缓解:

  • 如果是 HTML 文本(在 HTML 标记之外),就足够了:

    <p>❌&lt;/p>
    
  • 如果它在带引号的 HTML 属性值内,就足够了(另请参见单引号属性的标志参数):

    <span title="❌"> … </span>
    

    然而,有些属性仍然可以用于 XSS,例如 URI 的属性。

任何其他上下文可能需要转义其他字符。例如,未引用的属性值将需要任何空白字符也被转义,否则它将结束属性值。

另请注意,上下文可能需要不同类型的编码。例如,如果要打印嵌入到的 JavaScript 值<script>,则必须同时遵守 JavaScript 和 HTML 语法规则。

于 2013-07-23T17:46:38.070 回答
0

好吧,如果您不想出现 XSS 问题,那么使用htmlspecialchars()是一个好主意。如果您不这样做,有人可能会在您的代码中存储恶意<iframe>, 或。<script>

现在,您不一定需要保护输出。如果您对传入的数据进行清理,则可以改为存储清理后的数据。这样做可以让您有目的地存储未经清理的数据,以用于可能准备输出的样式目的。

就您的示例而言,它是正确的。这是你可以做到的一种方式。

编辑:您只需要适用htmlspecialchars()于字符串。

于 2013-07-23T14:26:10.830 回答