我有一些用户输入我输入了echo str_replace('<', '<', str_replace('&','&',$_POST['input']));
我想知道,是否有用户可以打破这个过滤器?
最初我认为这个脚本是非常防弹的,但在阅读了一些关于php、字符集和安全性的文章后,我开始怀疑它的健壮性。
这取决于输入的最终位置。
例如,如果在某个时候,你最终得到了一个模板,它的构造(很差)是这样的…
<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()
,它处理了很多常见的情况。
是。在一些多字节字符集(UTF-7是最值得注意的)中,还有其他字符可以在html中用作尖括号。
此外,这不会保护html属性,因为它们可以通过使用引号注入javascript。那么,你在哪里做的:
<input value="<?= $replaced_value ?>" />
它们可以传递值
" onclick="alert(5)" x="
将导致
<input value="" onclick="alert(5)" x="" />
如果你没有使用正确的方法,别人可以通过许多不同的方式来利用你的代码。使用OWASP的编码库Reform,你可以编码任何你需要的东西。底线是,在任何情况下,除非你绝对有必要,否则你都不应该使用自己的安全代码。无论是从效率的角度还是从责任的角度来看,您可以做的最好的事情就是使用多个安全专家花费大量时间研究这个问题的第三方库。
快速查看htmlspecialchars()
函数:
执行的翻译为:
'&' (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
呢?