用strip_tags()防止XSS?

Jim*_*myL 12 php xss

我有一个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()等.在生成电子邮件时,应将文本转换为可引用的可打印格式,依此类推.

  • 你通常是正确的,但用户输入不是一个无法触及的神圣脚本,类似StackOverflow的服务是一个例外而不是规则.如果您的应用程序在参数ID中需要一个正整数,那么您应该删除任何不是正整数的东西. (3认同)

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


Mat*_*hew 5

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

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

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

如果我没有那个解析器,我只会htmlspecialchars用来安全地编码文本.

  • 您的解析器可能不安全。HTML 添加了新的元素和属性。浏览器支持非标准的。浏览器中的错误恢复非常疯狂,可能会解析出您意想不到的东西。很难跟上。OTOH 如果你在所有输出上运行 `htmlspecialchars()`,每一个类似标签的文本都会被安全地转换,并且永远是安全的。 (3认同)
  • @porneL,我所指的解析器只允许来自已知白名单的已知标签和属性。任何其他非安全字符都会被编码。因此不可能生成不安全的代码。 (2认同)
  • @abeger,`strip_tags` 仍然可能有问题,因为用户可能出于某种奇怪的原因输入了“&lt;123&gt; Main Street”。默默地删除用户输入的数据总是很危险的。在这种情况下,如果我想在字段中阻止此类字符,我可能不会处理表单。相反,我会向用户显示一个错误,指出该字段包含无效字符。这些字符之一的存在可能表明他们不小心在字段中输入了错误的数据。 (2认同)

Mar*_*c B 1

strip_tags()可以提供帮助,但它并不是万无一失的。由于它不会验证它正在剥离的 HTML,一些聪明的人会发现一个被剥离的 HTML 结构(被破坏或以其他方式),但仍然会导致一些令人讨厌的事情。但就目前而言,它应该可以处理大部分遇到的问题。只是不要假设这将永远如此。

同样,如果您允许任何标签通过“允许的标签”参数传递,则将允许任何特定于 javascript 的属性通过,例如这些特定标签的 onclick。