我有一个PHP网络应用程序。我不想让用户张贴HTML到我的网站。
如果在将所有数据保存到数据库之前,我只是对所有数据运行strip_tags
(),strip_tags
()是否足以防止XSS?
我这样问是因为我不阅读documentation of strip_tags是否被阻止了。浏览器似乎有一些bug允许<0/script>
(是的,一个零)作为有效的HTML。
更新
我意识到我可以简单地对所有输出数据运行htmlspecialchars
;然而,我的想法是--因为我一开始就不想使用HTML,所以在保存到数据库之前一次性地清理数据更容易(而且在学术上更好),然后每次输出数据时都要担心数据是否安全。
6条答案
按热度按时间sf6xfgos1#
我坚决不同意“学术上更好”。
&
进行转义。strip_tags()
不足以保护属性中的值,例如,<input value="$foo">
可能会被$foo
=" onfocus="evil()
利用(不需要<
、>
!)因此正确的解决方案是根据生成的语言要求对数据进行转义。当您有纯文本并且要生成HTML时,您应该使用
htmlspecialchars()
或类似的格式将文本转换为HTML。当您要生成电子邮件时,您应该将文本转换为带引号的可打印格式,等等。t0ybt7op2#
strip_tags
本身是不够的,因为它删除了完全有效的非HTML内容。将输出:
还有:
<
之后的所有字符都被删除了。这对最终用户来说非常烦人!禁止保留HTML字符是一个糟糕的举动。当这些字符与HTML内联使用时,需要用htmlentities
或类似的函数进行转义。您需要一些更高级的
strip_tags
-HTML Purifier,它可以很好地工作,并允许用户使用HTML保留字符。oipij1gg3#
正如其他人所提到的,您可以使用
strip_tags
和htmlspecialchars
的组合来保护自己免受XSS的攻击。strip_tags
的一个缺点是它可能会删除用户意想不到的无害内容。我看到技术人员写了这样的东西:<edit> foo </edit>
,他们完全希望这些标签被视为是。而且,我看到“正常”的人甚至做像<g>
的“grin”。同样,他们会认为这是一个错误,如果它没有出现。所以我个人倾向于避免使用
strip_tags
,因为我自己的解析器允许我显式启用某些安全的HTML标签、属性和CSS,显式禁用不安全的标签和属性,并将任何其他特殊字符转换为无害的版本。因此,文本总是被视为人们所期望的。如果我没有这个解析器,我只需要使用
htmlspecialchars
来安全地对文本进行编码。tf7tbtn24#
应该是的,我以前从来没有听说过0的技巧。但是为了安全起见,你总是可以先做
strip_tags
,然后再做htmlspecialchars
。好的做法是在你的应用程序上自己测试一下,因为你知道你可以尝试输入和测试什么类型的数据,看看它是否会破坏它。我会至少每周检查一次新的漏洞,并不断测试您的脚本,以应对出现的新漏洞。fquxozlt5#
需要帮助将html作为文档中的纯文本处理吗?需要
echo
属性的值而不受<input value="<?php echo '" onkeydown="alert("XSS")'; ?>" />
之类的XSS攻击的攻击吗?使用
htmlentities()
。不需要
strip_tags()
,因为此函数已将<
和>
替换为<
和>
实体。您可能会问,
htmlentities()
和htmlspecialchars()
之间有什么区别?htmlentities()
将对任何字符进行编码,这些字符具有 * HTML实体等效项 *,而
htmlspecialchars()
仅编码 * 一小组最有问题的字符 *。myzjeezk6#
strip_tags()
可以提供帮助,但它不是防弹的。因为它不验证它剥离的HTML,一些聪明的人会发现一个HTML结构(损坏或其他),被剥离,但仍然导致一些讨厌的通过。但现在,它应该处理大多数的一切抛出它。只是不要假设这将永远是真的。同样,如果您允许任何标记通过'allowable tags'参数,这将允许通过任何javascript特定的属性,如那些特定标记的onclick。