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

3
我一直在“洒水”。
htmlentities($user_input, ENT_QUOTES, 'UTF-8')

在我的视图中,我到处都在呈现用户在我的应用程序中输入的数据。这非常繁琐,我想知道在我的控制器中使用HTMLPurifier是否可以安全地替代在视图中每个echo上使用htmlentities。
我注意到仅使用HTMLPurifier会尝试关闭打开的
标签,而不是删除它,因此如果某些聪明人将自己的姓名输入为Johnny
,并且我在视图中使用echo输出,它会破坏整个布局。
但是,如果我只使用htmlentities,则会得到以下结果:
Johnny<div>

而且我的布局被保留下来了。

所以我想知道这是HTMLPurifier配置问题还是最佳实践是与htmlentities一起使用。

我知道HTMLPurifier还有其他合规性和有效的HTML功能,但我主要担心XSS。

你怎么想?


3
关于那个“sprinkling”:将其制作成一个名为 html("text") 或简单命名为 h() 的简短包装函数。安全最好通过简洁而不是语法开销来实现。 - mario
+1,本来计划为此创建一个辅助函数,并从视图中调用它,而不是在每个echo上使用上面的完整语法。 - pepe
3个回答

9
如果您担心XSS攻击,那么请使用htmlspecialchars(没有理由使用完整的htmlentities)。这样可以确保您的安全。
echo htmlspecialchars($user_input);

如果您想允许一些HTML功能但仍然防止XSS,那么HTMLPurifier才有意义。但作为任何其他代码一样,存在可能在某些时候无法按照广告宣传的方式工作的可能性。个人而言,我不会这么做。

更新:

是的,htmlspecialchars支持其他附加标志(包括ENT_QUOTES)。但是,ENT_QUOTES仅在以下情况下需要:

  • 您要输出HTML属性的值并且
  • 您已将该值封装在单引号

因此,例如,在此处您不需要使用ENT_QUOTES

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

or here:

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

您需要在这里使用:


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

htmlspecialchars有什么标志吗?我想知道是否需要使用ENT_QUOTES来增强安全性。 - pepe

2
不同的目的。HP用于清理HTML,以便用户可以实际提交用作实际HTML的HTML。
如果您期望文本,并且不想将其用作HTML,则通常使用htmlspecialchars。它特别适用于可能以某种方式出现在标记属性中的文本字符串。
如果您只想显示文本,则应该更喜欢这个组合:
 htmlspecialchars(strip_tags($input), ENT_QUOTES, "UTF-8")

(那么显然,HP就没有意义了。 strip_tags()本身就足以防止XSS攻击,只要该内容仅在文本节点中输出,而不是在任何属性中输出。)

使用htmlentities会有性能损失吗?为什么大家更喜欢使用htmlspecialchars - pepe
不会有明显的影响。如果内容将出现在标签内或属性上下文中,则需要使用ENT_QUOTES - mario
是的,情况确实如此,在我的应用程序中,一些用户数据可能存在于属性中,也可能存在于jQuery字符串中。 - pepe
1
然后您需要进行编码。如果其中任何内容最终进入JS上下文,则还需要执行json_encode(有时候可以选择不这么做,但那不是您的职责)。 - mario

1

如果您希望用户能够编写HTML,则HTMLPurifier似乎是一个不错的解决方案——但从您的描述中,似乎您并不需要或希望用户输入HTML,在这种情况下,它根本不是解决方案(正如您所提到的,它允许例如div元素)。

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


谢谢Philipp - 我的应用程序不是设计用于用户提交HTML,所以你是正确的,HTMLPurifier似乎并不是最好的选择。 - pepe
“is not designed”并不意味着HTML不会被(恶意地)提交。 - a coder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接