用strip_tags()防止XSS?

时间:2010-08-31 02:23:04

标签: php xss

我有一个PHP Web应用程序。我不想让用户将HTML发布到我的网站。

如果我只是在保存到我的数据库之前对所有数据运行strip_tags(),那么strip_tags()是否足以阻止XSS?

我问,因为如果XSS被阻止,我不清楚阅读documentation of strip_tags。浏览器似乎存在一些错误,允许<0/script>(是,零)作为有效的HTML。

更新

我意识到我可以在所有输出的数据上运行htmlspecialchars;但是,我的想法是 - 因为我不想首先允许HTML,所以在保存到我的数据库之前,一劳永逸地清理我的数据会更容易(并且在学术上更好),然后每次都要担心如果数据是安全的,我输出数据。

6 个答案:

答案 0 :(得分:18)

我强烈反对它“学术上更好”。

  • 它打破了用户输入(想象一下,如果他们“清除”所有标签中的帖子,那么StackOverflow对于这次讨论会有多么无用。)

  • 以HTML格式插入的文字仅删除了标签,将无效。 HTML也需要转义&

  • HTML中甚至都不安全! strip_tags()不足以保护属性中的值,例如,<input value="$foo">可能被$foo = " onfocus="evil()利用(不需要<> !)

因此,正确的解决方案是根据您生成的语言要求转义数据。如果您有纯文本并且正在生成HTML,则应使用htmlspecialchars()等将文本转换为HTML。当您生成电子邮件时,您应该将文本转换为带引号的可打印格式,依此类推。

答案 1 :(得分: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");

将输出:

This could be a happy clown *

Hey guys

初始<之后的所有内容都会被删除。最终用户非常讨厌!不接受保留的HTML字符将是一个不好的举动。当与HTML内联使用时,这些字符需要使用htmlentities或类似函数进行转义。

您需要更高级的内容strip_tags - HTML Purifier效果很好,并允许用户使用HTML保留字符。

答案 2 :(得分:5)

正如其他人所提到的,您可以结合使用strip_tagshtmlspecialchars来保护自己免受XSS攻击。

关于strip_tags的一个坏处是,它可能会删除用户不会期望的无害内容。我看到技术人员编写的内容如:<edit> foo </edit>,他们完全希望这些标签可以被视为原样。此外,我看到“正常”的人甚至做了<g>之类的事情,因为“咧嘴笑”。同样,如果没有出现,他们会认为这是一个错误。

所以个人而言,我避免使用strip_tags优先于我自己的解析器,它允许我明确启用某些安全的HTML标记,属性和CSS,显式禁用不安全的标记和属性,并将任何其他特殊字符转换为无害的版本。因此,文本总是被人们所期待。

如果我没有使用该解析器,我只需使用htmlspecialchars来安全地编码文本。

答案 3 :(得分:3)

它应该,我以前从未听说过那个0技巧。但是,为了安全起见,您可以随时执行strip_tags,然后执行htmlspecialchars。好的做法是在您的应用程序上自行测试,因为您知道可以尝试输入和测试的数据类型,看它是否会破坏它。只需搜索XSS漏洞利用方法,并将其用于测试数据。我会至少每周检查一次新的漏洞,并不断测试你的脚本是否有新的漏洞。

答案 4 :(得分:1)

strip_tags()可以提供帮助,但它不是防弹的。由于它没有验证HTML的剥离,一些聪明的人会发现一个HTML构造(损坏或其他)被剥离,但仍然会导致令人讨厌的事情。但就目前而言,它应该处理大多数被抛出的东西。只是不要认为这将永远是真的。

同样,如果您允许任何标签通过'allowable tags'参数传递,那么它将允许通过任何特定于JavaScript的属性,例如针对这些特定标签的onclick。

答案 5 :(得分:0)

是否需要帮助将html视为文档中的纯文本? 是否需要echo属性值而不遭受<input value="<?php echo '" onkeydown="alert(&quot;XSS&quot;)'; ?>" />这样的XSS攻击?

使用htmlentities()

echo htmlentities('<p>"..."</p>');
// result: &lt;p&gt;&quot;...&quot;&lt;/p&gt;

不需要strip_tags(),因为此函数已经用<>实体替换了&lt;&gt;

  

htmlentities()和有什么区别   和htmlspecialchars()您可能会问?

好吧,htmlentities()将对具有等效于HTML实体 ANY 字符进行编码,

htmlspecialchars() 编码一小部分问题最多的字符