所有输出都需要htmlspecialchars()吗?

时间:2013-07-23 14:17:33

标签: php security codeigniter xss expressionengine

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

例如,在这里,我从数据库中获取所有类别,排序到数组并返回到Expression Engine。

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),
            );
}   

非常感谢! :)

3 个答案:

答案 0 :(得分:3)

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

htmlspecialchars()

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

答案 1 :(得分:1)

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

  • 如果是HTML文本(HTML标签之外),则足以:

    <p>❌</p>
    
  • 如果它在引用的HTML属性值中,它就足够了(另请参阅单引号属性的 flags 参数):

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

    但是,某些属性仍可用于XSS,例如URI的属性。

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

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

答案 2 :(得分:0)

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

现在,您不一定需要保护输出。如果您清理进来的数据,则可以存储已清理的数据。通过这种方式,您可以有目的地存储未经过消毒的数据,以便进行样式处理,以便输出。

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

编辑:您只需将htmlspecialchars()应用于字符串。