我一直在'洒'
htmlentities($user_input, ENT_QUOTES, 'UTF-8')
在我的观点中,无处不在,我回应用户有机会在我的应用中输入的数据。
这非常繁琐,我想知道在我的控制器中使用HTMLPurifier是否可以替代在视图中的每个htmlentities
中使用echo
。
我注意到单独的HTMLPurifier会尝试关闭一个开放的<div>
而不是删除它,所以如果某个smartass输入了他的名字Johnny<div>
而我echo
在我看来,它打破了我的整个布局。
但如果我只使用htmlentities
,我就会
Johnny<div>
并保留我的布局。
所以我想知道这是否是HTMLPurifier配置的问题,或者最佳做法是与htmlentities
一起使用。
我理解HTMLPurifier还有其他功能符合要求和有效的HTML,但我最关心的是XSS。
您怎么看?
答案 0 :(得分:9)
如果你担心XSS,那么使用htmlspecialchars
(没有理由使用完整的htmlentities
,你就是金色的:
echo htmlspecialchars($user_input);
HTMLPurifier仅在您希望允许某些 HTML功能同时仍然阻止XSS时才有意义。但是,与任何其他代码一样,它有可能在某些时候不如广告那样有效。就个人而言,我不会去那里。
<强>更新强>
是的,htmlspecialchars
确实支持其他标记(包括ENT_QUOTES
)。但是,如果符合以下情况,ENT_QUOTES
只需要 :
例如,您不需要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上的其他人已经提到,在评论中也需要特别注意双重破折号。