str_replace('<')可以保护我们免受用户注入的代码吗?

Pac*_*ier 3 javascript php security xss

好的,我有一些用户输入,我做了一个 echo str_replace('<', '&lt;', str_replace('&','&amp;',$_POST['input']));

我想知道,无论如何用户可以打破这个过滤器吗?

最初我认为这个脚本非常防弹,但在阅读了一些关于php,字符集和安全性的文章后,我开始怀疑它的健壮性.

Amb*_*ber 6

这取决于输入结束的位置.

例如,如果在某些时候你最终得到一个像这样(很差)构造的模板......

<a href="<?php echo $somevar; ?>">a link</a>
Run Code Online (Sandbox Code Playgroud)

然后有人可以通过简单地使用以下输入来注入代码:

javascript:do_whatever()
Run Code Online (Sandbox Code Playgroud)

即使输出通常不会回到href现场,这样的事情......

<a title="<?php echo $somevar; ?>" href="http://www.google.com">Google</a>
Run Code Online (Sandbox Code Playgroud)

如果输入是......可能仍然容易受到攻击

" href="javascript:do_whatever()
Run Code Online (Sandbox Code Playgroud)

所以基本上......过滤器必须对它们被使用的上下文敏感.常用的功能是htmlspecialchars()处理许多常见情况.