PHP 中的用户输入过滤
我目前正在开发一个应用程序,该应用程序要求用户提交显示在网站上的帖子和评论。 众所周知,用户输入不可信,因此我使用 htmlspecialchars($string,ENT_QUOTES) 来处理用户的帖子和评论。
现在,我想忽略一些特定的 html 标签。 例如
和其他一些标签。 我怎样才能做到这一点,以便 htmlspecialchars 在过滤其他标签时忽略一些标签。
gt;
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
解决方案a)
使用 strip_tags 代替 htmlspecialchars,并将所需的标签列入白名单。
更好的解决方案b)
使用 bbcodes,并为所需标签指定别名,例如:[b]bold[/b]
solution a)
use strip_tags insted of htmlspecialchars, and whitelist the needed tags.
better solution b)
Use bbcodes, and give aliases to the wanted tags, e.g: [b]bold[/b]
仅允许某些 HTML 标记而不允许任何脚本注入等可能性是非常非常困难的。
我实际上建议避免这种情况并使用生成 HTML 的东西,例如 这个 UBB 代码解析器(或类似)。 甚至是 Markdown (关闭 HTML 选项)。
这使得攻击者没有机会攻击您的网站,如果网站面向公众,这一点非常重要。
如果您允许甚至某些 HTML 通过,那么顽固的攻击者很可能会找到绕过它的方法。
It is very, very difficult to allow only some HTML tags without allowing any possibility of script injection or the like.
I would actually recommend avoiding this and using something that generates HTML such as this UBB code parser (or similar). Or even Markdown (with HTML option turned off).
That gives no scope for attackers to hit your site, which is very important if it is public-facing.
If you allow even some HTML through, chances are that a determined attacker will find a way round it.
--> HTML Purifier
--> HTML Purifier
您可以替换带引号的字符串以重新插入允许的标签。 例如,对于
标签:
我只允许非常独特、完整的标签尽可能安全。 即,如果不需要,请不要使用正则表达式,它可能会导致非常讨厌的错误。
You can replace the quoted string to re-insert the allowed tags. For
<b>
tags for example:I would only allow very distinct, complete tags to be as secure as possible. I.e. Don't use regular expressions if you don't have to, it can lead to very nasty bugs.
我强烈建议您使用 Zend_Filter 来过滤用户输入。 具体参见:
http://framework.zend.com/手册/en/zend.filter.html#zend.filter.introduction.using
I would heavily recommend you use Zend_Filter for filtering through user input. Specifically, see:
http://framework.zend.com/manual/en/zend.filter.html#zend.filter.introduction.using
这并不像您想象的那么简单,因为
htmlspecialchars()
也不是htmlentities()
提供了忽略某些标签的任何选项(这两个函数甚至不知道标签概念的含义)。您可以使用其他一些方法来允许用户格式化他们的帖子,例如 BBCode,纺织 或 降价。 有适用于所有这些的 PHP 解析器。
如果您必须坚持使用 html 标签,您可以采取一些预处理来重新格式化允许的标签,以便它们不会受到
htmlspecialchars()
。 然后,您可以对结果进行后处理,将格式更改回正常的 HTML 标签。 以下示例通过简单的标记可视化此过程。 请注意,使用正则表达式处理 HTML 很容易出错,而且并不总是正确的方法 - 在本示例中我将使用它只是为了简单起见。
这尚未经过测试,肯定需要做更多的工作。
This isn't as simple as you might thing because neither
htmlspecialchars()
norhtmlentities()
provides any options to ignore certain tags (both functions don't even know the meaning of the notion of tags).You could use some other means to allow the users to format their posts, e.g. BBCode, Textile or Markdown. There are PHP parsers available for all of them.
If you'll have to stick with html-tags you could resort to some preprocessing that reformats the allowed tags so that they will not be affected by
htmlspecialchars()
. You can then postprocess the result to change back the format to normal HTML-tags. The following sample visualizes this process for a simple<a>
-tag. Please be aware that processing HTML with regular expressions is error-prone and not always the way to go - I'll use it just for the sake of simplicity in this example.This is untested and will surely require a lot more work.