如果我使用HTMLPurifier,是否还需要使用htmlentities?

时间:2011-12-03 15:31:44

标签: php html security xss htmlpurifier

我一直在'洒'

htmlentities($user_input, ENT_QUOTES, 'UTF-8')

在我的观点中,无处不在,我回应用户有机会在我的应用中输入的数据。

这非常繁琐,我想知道在我的控制器中使用HTMLPurifier是否可以替代在视图中的每个htmlentities中使用echo

我注意到单独的HTMLPurifier会尝试关闭一个开放的<div>而不是删除它,所以如果某个smartass输入了他的名字Johnny<div>而我echo在我看来,它打破了我的整个布局。

但如果我只使用htmlentities,我就会

Johnny<div>

并保留我的布局。

所以我想知道这是否是HTMLPurifier配置的问题,或者最佳做法是与htmlentities一起使用。

我理解HTMLPurifier还有其他功能符合要求和有效的HTML,但我最关心的是XSS。

您怎么看?

3 个答案:

答案 0 :(得分:9)

如果你担心XSS,那么使用htmlspecialchars(没有理由使用完整的htmlentities,你就是金色的:

echo htmlspecialchars($user_input);

HTMLPurifier仅在您希望允许某些 HTML功能同时仍然阻止XSS时才有意义。但是,与任何其他代码一样,它有可能在某些时候不如广告那样有效。就个人而言,我不会去那里。

<强>更新

是的,htmlspecialchars确实支持其他标记(包括ENT_QUOTES)。但是,如果符合以下情况,ENT_QUOTES只需要

  • 您正在输出HTML属性
  • 的值
  • 您已将值隐藏在引号

例如,您需要ENT_QUOTES

<p><?php echo htmlspecialchars($input); ?></p>

或在这里:

<p id="<?php echo htmlspecialchars($input); ?>"></p>

<p id='<?php echo htmlspecialchars($input, ENT_QUOTES); ?>'></p>

答案 1 :(得分:2)

不同的目的。 HP用于清理HTML,因此用户可以实际提交将用作实际HTML的HTML。

如果您希望使用文字,并且不想将其用作HTML,那么通常会htmlspecialchars。它特别适用于可能以某种方式最终出现在标记属性中的文本字符串。

如果您只想显示文字,那么您甚至应该更喜欢组合:

 htmlspecialchars(strip_tags($input), ENT_QUOTES, "UTF-8")

(然后很明显惠普没有意义。strip_tags()实际上本身就足以用于XSS预防,只要该内容仅在文本节点中输出,而不是任何属性。)

答案 2 :(得分:1)

如果您希望用户能够编写HTML,那么HTMLPurifier似乎是一个很好的解决方案 - 但是根据您的编写内容,您似乎不希望并且需要用户输入HTML,并且在这种情况下,它根本就没有解决方案(正如你所提到的,它允许例如div元素)。

另一方面,HtmlEntities会逃避用户输入,因此这是大多数XSS和阻止HTML的方法。但请注意,htmlEntities不会保护您免受所有XSS攻击。例如,如果您在HTML属性周围使用单引号并允许将用户输入插入属性值,则恶意用户可以通过传递“单引号字符”来攻击您,从而转义您的引用。为避免这种情况,您需要使用ENT_QUOTES选项。 PHP.net上的其他人已经提到,在评论中也需要特别注意双重破折号。