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