我想让我的网站安全抵御XSS攻击。
我有一个模块允许用户将文本(带有特殊字符)插入数据库。此文本显示在起始页面上。
现在我的问题:在将用户输入插入数据库之前,我应该使用htmlentities($_POST["userinput"], ENT_QUOTES, 'UTF-8')
吗?
或者我可以将用户输入直接插入数据库并只显示htmlentities
吗?
答案 0 :(得分:5)
有些人认为你应该在输入和输出时对XSS进行消毒。我认为这不是很有价值。首先,只有你在输出上做这件事真的很重要,因为那是你试图减轻的漏洞存在的地方。在我看来,任何依赖于将来自数据库的东西视为可信输入的解决方案都会被打破。
问题是,在某个地方,你(或跟在你后面的人)可能会决定他们需要以不同的方式插入数据 - 一些外部API - 谁知道。关键是,现在您的页面中存在安全漏洞,因为您决定信任来自数据库的数据。
反对在和的方式上做这件事的论点是我的两个部分:
您没有添加任何额外的安全性,因此您实际上只是让人们感觉就像安全的两倍 - 这不是我们想要创建的感觉。我们希望证明某些东西是安全的,而不仅仅是让它感觉双安全。
您也可能会写一个搞砸原始数据的错误。如果在渲染时发生这种情况,那就没那么大了,因为你可以修复并正确显示它。如果在存储时发生,则该数据无法恢复。