0

我目前正在开发一个要求用户提交显示在网站上的帖子和评论的应用程序。众所周知,用户输入不可信,所以我使用 htmlspecialchars($string,ENT_QUOTES) 来处理用户的帖子和评论。

现在,我希望忽略某些 html 标签。比如<b><br />和更多的标签。我该怎么做才能让 htmlspecialchars 在过滤其他标签时忽略一些标签。

4

6 回答 6

3

解决方案a)
使用htmlspecialchars的strip_tags,并将所需的标签列入白名单。
更好的解决方案 b)
使用 bbcodes,并为想要的标签提供别名,例如:[b]bold[/b]

于 2009-06-23T10:28:55.903 回答
2

只允许一些 HTML 标签而不允许任何脚本注入或类似的可能性是非常非常困难的。

我实际上建议避免这种情况并使用生成 HTML 的东西,例如这个 UBB 代码解析器(或类似的)。甚至Markdown(关闭 HTML 选项)。

这使攻击者无法攻击您的网站,如果它是面向公众的,这一点非常重要。

如果您甚至允许某些 HTML 通过,那么坚定的攻击者很可能会找到绕过它的方法。

于 2009-06-23T10:30:32.593 回答
2

由于当前 HTML 过滤器不足或不安全的情况而厌倦了使用 BBCode?
--> HTML 净化器

HTML Purifier 是一个用 PHP 编写的符合标准的 HTML 过滤器库。HTML Purifier 不仅会使用经过全面审核、安全且允许的白名单删除所有恶意代码(更广为人知的 XSS),...
于 2009-06-23T10:36:56.903 回答
1

您可以替换带引号的字符串以重新插入允许的标签。例如<b>标签:

$string = str_replace(array('&lt;b&gt;', &lt;/&gt;), array('<b>', '</b>'), $string);

我只允许非常独特、完整的标签尽可能安全。即,如果你不需要,不要使用正则表达式,它会导致非常讨厌的错误。

于 2009-06-23T10:30:14.233 回答
0

这并不像你想象的那么简单,因为既没有htmlspecialchars()也没有htmlentities()提供任何忽略某些标签的选项(这两个函数甚至都不知道标签概念的含义)。

您可以使用其他方式让用户格式化他们的帖子,例如BBCodeTextileMarkdown。所有这些都有可用的 PHP 解析器。

如果您必须坚持使用 html-tags,您可以诉诸一些预处理来重新格式化允许的标签,以便它们不会受到htmlspecialchars(). 然后,您可以对结果进行后处理以将格式改回普通的 HTML 标记。以下示例通过简单的<a>-tag 可视化了此过程。请注意,使用正则表达式处理 HTML 很容易出错,而且并不总是可行的方法——我将在此示例中使用它只是为了简单起见。

$input = preg_replace('~<(/?\w+([^>]*?))>~', '|#$1#|', $input);
$input = htmlspecialchars($input);
$inoput = preg_replace('~|#(/?\w+(.*?))#|~', '<$1>', $input);

这是未经测试的,肯定需要更多的工作。

于 2009-06-23T10:40:20.670 回答
0

我强烈建议您使用 Zend_Filter 过滤用户输入。具体见: http: //framework.zend.com/manual/en/zend.filter.html#zend.filter.introduction.using

于 2009-06-23T10:26:25.723 回答