好的,我有一些用户输入,我做了echo str_replace('<', '<', str_replace('&','&',$_POST['input']));
我想知道,无论如何 用户可能会破坏此过滤器吗?
最初我认为这个脚本非常防弹,但在阅读了一些关于php,字符集和安全性的文章后,我开始怀疑它的稳健性。
答案 0 :(得分:6)
这取决于输入的结束位置。
例如,如果在某些时候你最终得到一个像这样(很差)构造的模板......
<a href="<?php echo $somevar; ?>">a link</a>
然后有人可以通过简单地使用以下输入来注入代码:
javascript:do_whatever()
即使输出通常没有回显到href
字段,也就是这样......
<a title="<?php echo $somevar; ?>" href="http://www.google.com">Google</a>
如果输入是...... ,仍可能容易受到攻击
" href="javascript:do_whatever()
基本上......过滤器必须对使用它们的上下文敏感。一个常用的函数是htmlspecialchars()
,它可以处理很多常见的情况。
答案 1 :(得分:4)
是。在一些多字节字符集(UTF-7是最值得注意的)中,还有其他字符可以用作html中的尖括号。
此外,这不会保护html属性,因为他们可以使用引号注入javascript。那么,你在做什么:
<input value="<?= $replaced_value ?>" />
他们可以传递值
" onclick="alert(5)" x="
将导致
<input value="" onclick="alert(5)" x="" />
如果您不使用正确的方法,有许多不同的方法可以利用您的代码。使用OWASP的编码库Reform,您可以编码所需的一切。
最重要的是,除非绝对必要,否则在任何情况下都不应该使用自己的安全代码。从效率的角度和责任的角度来看,多个安全专家花费大量时间处理问题的第三方图书馆是您可以做的最好的事情。
答案 2 :(得分:1)
快速浏览htmlspecialchars()
function:
执行的翻译是:
'&' (ampersand) becomes '&' '"' (double quote) becomes '"' when ENT_NOQUOTES is not set. "'" (single quote) becomes ''' only when ENT_QUOTES is set. '<' (less than) becomes '<' '>' (greater than) becomes '>'
所以最重要的是>
在HTML中无效,除非它是标记的一部分,但可能浏览器会忽略它。
如果您将其置于某些引号内,则需要使用引号转义,例如:
echo "<input name='x' value='" . htmlspecialchars($input) . "'/>";
那说,为什么不使用htmlspecialchars
?