我有一个表单文本字段,接受一个网址.提交表单时,我使用适当的反sql注入将此字段插入数据库.我的问题是关于xss.
此输入字段是一个网址,我需要在页面上再次显示它.如何在进入数据库的过程中保护它免受xss的影响(我认为没有必要,因为我已经处理了sql注入)并且在离开数据库的路上?
让我们假装我们这样,我正在简化它,请不要担心SQL注入.之后我会从哪里出发?
$url = $_POST['url'];
谢谢
假设这将被投入的HTML内容(如间和
或之间
),则需要以编码5个特殊XML字符(&,<,>,","),和OWASP建议包括斜杠(/)作为PHP内置,htmlentities()
将为您完成第一部分,简单的str_replace()
可以做斜杠:
function makeHTMLSafe($string) { $string = htmlentities($string, ENT_QUOTES, 'UTF-8'); $string = str_replace('/', '/', $string); return $string; }
但是,如果您要将受污染的值放入HTML属性(例如href=
an 的子句)中,则需要对不同的字符集进行编码([space]%*+, - /; < => ^和|) - 您必须双引号HTML属性:
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)] = '' . $hex . ';'; } $string = strtr($string, $translationTable); return $string; }
最后一个问题是非法的UTF-8字符 - 当传送到某些浏览器时,格式错误的UTF-8字节序列可能会突破HTML实体.为了防止这种情况,只需确保您获得的所有UTF-8字符都有效:
function assertValidUTF8($string) { if (strlen($string) AND !preg_match('/^.{1}/us', $string)) { die; } return $string; }
u
正则表达式上的修饰符使其成为Unicode匹配正则表达式.通过匹配单个分层次结构,.
我们可以确保整个字符串都是有效的Unicode.
由于这完全取决于上下文,因此最好在最近可能的时刻执行任何此编码 - 就在将输出呈现给用户之前.在这种练习中也可以很容易地看到你错过的任何地方.
OWASP提供有关其XSS预防备忘单的大量信息.