php 使用strip_tags()防止XSS?

xe55xuns  于 2022-10-30  发布在  PHP
关注(0)|答案(6)|浏览(277)

我有一个PHP网络应用程序。我不想让用户张贴HTML到我的网站。
如果在将所有数据保存到数据库之前,我只是对所有数据运行strip_tags(),strip_tags()是否足以防止XSS?
我这样问是因为我不阅读documentation of strip_tags是否被阻止了。浏览器似乎有一些bug允许<0/script>(是的,一个零)作为有效的HTML。

更新

我意识到我可以简单地对所有输出数据运行htmlspecialchars;然而,我的想法是--因为我一开始就不想使用HTML,所以在保存到数据库之前一次性地清理数据更容易(而且在学术上更好),然后每次输出数据时都要担心数据是否安全。

sf6xfgos

sf6xfgos1#

我坚决不同意“学术上更好”。

  • 它中断了用户输入(想象一下,如果StackOverflow从所有标签中“清理”帖子,它对这个讨论将是多么无用)。
  • 在HTML中插入的文本如果只去掉了标记,则该文本无效。HTML还要求对&进行转义。
  • strip_tags()不足以保护属性中的值,例如,<input value="$foo">可能会被$foo = " onfocus="evil()利用(不需要<>!)

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

t0ybt7op

t0ybt7op2#

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保留字符。

oipij1gg

oipij1gg3#

正如其他人所提到的,您可以使用strip_tagshtmlspecialchars的组合来保护自己免受XSS的攻击。
strip_tags的一个缺点是它可能会删除用户意想不到的无害内容。我看到技术人员写了这样的东西:<edit> foo </edit>,他们完全希望这些标签被视为是。而且,我看到“正常”的人甚至做像<g>的“grin”。同样,他们会认为这是一个错误,如果它没有出现。
所以我个人倾向于避免使用strip_tags,因为我自己的解析器允许我显式启用某些安全的HTML标签、属性和CSS,显式禁用不安全的标签和属性,并将任何其他特殊字符转换为无害的版本。因此,文本总是被视为人们所期望的。
如果我没有这个解析器,我只需要使用htmlspecialchars来安全地对文本进行编码。

tf7tbtn2

tf7tbtn24#

应该是的,我以前从来没有听说过0的技巧。但是为了安全起见,你总是可以先做strip_tags,然后再做htmlspecialchars。好的做法是在你的应用程序上自己测试一下,因为你知道你可以尝试输入和测试什么类型的数据,看看它是否会破坏它。我会至少每周检查一次新的漏洞,并不断测试您的脚本,以应对出现的新漏洞。

fquxozlt

fquxozlt5#

需要帮助将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实体等效项 *,
htmlspecialchars()编码 * 一小组最有问题的字符 *。

myzjeezk

myzjeezk6#

strip_tags()可以提供帮助,但它不是防弹的。因为它不验证它剥离的HTML,一些聪明的人会发现一个HTML结构(损坏或其他),被剥离,但仍然导致一些讨厌的通过。但现在,它应该处理大多数的一切抛出它。只是不要假设这将永远是真的。
同样,如果您允许任何标记通过'allowable tags'参数,这将允许通过任何javascript特定的属性,如那些特定标记的onclick。

相关问题