输入是URL,如何保护它免受xss

时间:2009-11-09 05:27:58

标签: php security url xss

我有一个接受网址的表单文本字段。提交表单时,我使用适当的反sql注入将此字段插入数据库。我的问题是关于xss。

此输入字段是一个网址,我需要在页面上再次显示它。如何在进入数据库的过程中保护它免受xss的影响(我认为没有必要,因为我已经处理了sql注入)并且出了数据库?

让我们假装我们这样,我正在简化它,请不要担心SQL注入。之后我会从哪里离开?

$url = $_POST['url'];

由于

2 个答案:

答案 0 :(得分:9)

假设这将被放入HTML内容(例如<body></body>之间或<div></div>之间),您需要对5特殊内容进行编码XML字符(&amp;,&lt;,&gt;,“,”)和OWASP也建议包含斜杠(/).PHP内置函数htmlentities()将为您完成第一部分,简单str_replace() 3}}可以做斜杠:

function makeHTMLSafe($string) {
    $string = htmlentities($string, ENT_QUOTES, 'UTF-8');
    $string = str_replace('/', '&#x2F;', $string);
    return $string;
}

但是,如果您要将受污染的值放入HTML属性(例如href=的{​​{1}}子句),则需要对另一组进行编码字符([空格]%* +, - /;&lt; =&gt; ^和|) - 您必须双引号HTML属性:

<a

最后一个问题是非法的UTF-8字符 - 当传送到某些浏览器时,格式错误的UTF-8字节序列可能会突破HTML实体。为了防止这种情况发生,只需确保您获得的所有UTF-8字符都有效:

function makeHTMLAttributeSafe($string) {
    $scaryCharacters = array(32, 37, 42, 43, 44, 45, 47, 59, 60, 61, 62, 94, 124);
    $translationTable = array();
    foreach ($scaryCharacters as $num) {
        $hex = str_pad(dechex($num), 2, '0', STR_PAD_LEFT);
        $translationTable[chr($num)] = '&#x' . $hex . ';';
    }

    $string = strtr($string, $translationTable);
    return $string;
}

该正则表达式上的function assertValidUTF8($string) { if (strlen($string) AND !preg_match('/^.{1}/us', $string)) { die; } return $string; } 修饰符使其成为Unicode匹配正则表达式。通过匹配单个分层符u,我们可以确保整个字符串都是有效的Unicode。

由于这完全依赖于上下文,因此最好在最近可能的时刻执行任何此编码 - 就在将输出呈现给用户之前。通过这种练习,您可以轻松查看错过的任何地方。

OWASP提供了有关XSS prevention cheat sheet的大量信息。

答案 1 :(得分:1)

在向用户显示之前,您需要使用htmlspecialchars对其进行编码。通常,当处理&lt; script&gt;之外的数据时,这就足够了。标记和/或HTML标记属性。