我有一个接受网址的表单文本字段。提交表单时,我使用适当的反sql注入将此字段插入数据库。我的问题是关于xss。
此输入字段是一个网址,我需要在页面上再次显示它。如何在进入数据库的过程中保护它免受xss的影响(我认为没有必要,因为我已经处理了sql注入)并且出了数据库?
让我们假装我们这样,我正在简化它,请不要担心SQL注入。之后我会从哪里离开?
$url = $_POST['url'];
由于
答案 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('/', '/', $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标记属性。