在PHP中保护所见即所得输入免受XSS攻击


Protect WYSIWYG input from XSS attacks in PHP?

我在我的地方读到,为了防止XSS攻击,最佳实践是先对用户输入执行stripslashes,然后执行htmlspecialchars。然而,在某些情况下,这是不可能的,例如当允许用户使用所见即所得编辑器进行一些基本标记时。

PHP是否为此提供任何方法,允许基本标签的某些白名单(b, i, u, a, img,…),但剥离它们所有潜在危险的参数,以及转义除了<, >"以外的所有html特殊字符属于白名单标签集&标签参数?

或者我应该忘记这样做,并切换到一个不同的方法,如使用BBcode用户输入标记?

您应该在输出富文本的任何页面上实现内容安全策略,除了通过使用诸如HTML净化器之类的消毒程序使文本对HTML输出安全之外。这应该可以有效地防止注入的脚本命令运行。

CSP允许您有效地阻止浏览器执行内联脚本。目前Chrome和Firefox等现代浏览器都支持它(尽管IE目前只有部分支持)。

这是由你的页面的HTTP响应头完成的。

Content-Security-Policy: script-src 'self' https://apis.google.com
如果用户设法将内联JavaScript注入到您的页面中,

将阻止执行它(它将被忽略并发出警告),但将允许脚本标记引用您自己的服务器或https://apis.google.com。这可以根据您的需要进行定制。对于不支持CSP的浏览器,仍然需要HTML杀毒器,因此您仍然应该首先运行所有用户提供的输入。