我有一个PHP Web应用程序.我不想让用户将HTML发布到我的网站.
如果我strip_tags
在保存到我的数据库之前只对所有数据运行(),那么strip_tags
()是否足以阻止XSS?
我问,因为如果XSS被阻止,我不清楚读取strip_tags的文档.浏览器允许<0/script>
(是的,零)作为有效的HTML 似乎存在一些错误.
UPDATE
我意识到我可以简单地运行htmlspecialchars
所有输出的数据; 但是,我的想法是 - 因为我不想首先允许HTML,所以在保存到我的数据库之前,一劳永逸地清理我的数据会更容易(并且在学术上更好),然后每次都要担心如果数据是安全的,我输出数据.
我强烈反对它"学术上更好".
它打破了用户输入(想象一下,如果他们"清除"所有标签中的帖子,那么StackOverflow将如何用于此讨论.
以HTML格式插入的文本仅删除标签将无效.HTML也需要&
进行转义.
它在HTML中甚至都不安全!strip_tags()
不足以保护属性中的值,例如,可能被利用
$foo
= " onfocus="evil()
(不<
,>
需要!)
因此,正确的解决方案是根据您生成的语言要求来转义数据.如果您有纯文本并且正在生成HTML,则应将文本转换为HTML htmlspecialchars()
等.在生成电子邮件时,应将文本转换为可引用的可打印格式,依此类推.
strip_tags
本身是不够的,因为它删除了完全有效的非HTML内容.例如:
将输出:
This could be a happy clown *和:
Hey guys初始化后的所有内容都
<
被删除了.最终用户非常讨厌!不接受保留的HTML字符将是一个不好的举动.htmlentities
当与HTML内联使用时,这些字符需要使用或类似的功能进行转义.您需要更高级的东西
strip_tags
- HTML Purifier工作得很好,并允许用户使用HTML保留字符.
3> Matthew..:正如其他人所提到的,您可以结合使用
strip_tags
并htmlspecialchars
保护自己免受XSS攻击.一个坏处
strip_tags
是它可能会删除用户不会期望的无害内容.我看到技术人员写的东西如下:,他们完全希望这些标签可以被视为原样.此外,我看到"正常"的人甚至做
foo 了"咧嘴笑"的事情.同样,如果没有出现,他们会认为这是一个错误.
所以个人而言,我首先避免
strip_tags
使用我自己的解析器,它允许我显式启用某些安全的HTML标签,属性和CSS,显式禁用不安全的标签和属性,并将任何其他特殊字符转换为无害的版本.因此,文本总是被视为人们所期望的.如果我没有那个解析器,我只会
htmlspecialchars
用来安全地编码文本.