2011-12-03 61 views
3

我已经“洒”如果我使用HTMLPurifier,还需要使用htmlentities吗?

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

在我的意见,我到处回波数据,用户在我的应用程序进入的机会。

这是非常乏味,我想知道如果在我的控制器中使用HTMLPurifier将是一个安全的替代品,在视图上每echo使用htmlentities

我注意到HTMLPurifier独自将,例如,尝试关闭打开的<div>而不是取消它,这样即使有些自作聪明进入了他的名字作为Johnny<div>echo它在我看来,它打破了我的整个布局。

但如果不是我一个人使用htmlentities我得到

Johnny<div> 

和我的布局将被保留。

所以我想知道这是HTMLPurifier配置的问题还是最好的做法是与htmlentities一起使用它。

我知道HTMLPurifier具有其他功能合规性和有效的HTML,但我最关心的是XSS。

您认为如何?

+3

关于'sprinkling':使它成为一个简短的包装函数'html(“text”)'或者只是'h()'。最好通过简单性来实现安全性,而不是通过语法开销。 – mario

+0

+1,正在计划为此创建一个辅助函数,并从视图中调用它,而不是在每个'echo'上使用上面的完整语法 – pepe

回答

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> 
+0

'htmlspecialchars'上的任何标志?我想知道是否需要'ENT_QUOTES'来增加安全性 – pepe

+0

@torr:请看看更新。 – Jon

+0

优秀的解释,thx – pepe

2

不同的目的。惠普用于清理HTML,以便用户可以实际提交将用作实际HTML的HTML。

如果您希望在文本,不想一般htmlspecialchars使用它作为HTML,然后。它特别适用于可能以某种方式以标签属性结束的文本字符串。

如果你希望只显示文本,那么你应该甚至宁愿组合:

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

(然后obviosuly HP将没有任何意义strip_tags()是事实本身足以防止XSS,为。只要的内容是文本节点输出而已,没有任何属性)

+0

是否有使用'htmlentities'而不是性能命中? - 为什么每个人都更喜欢'htmlspecialchars'? – pepe

+0

不可测量。只有在属性上下文中标签内容最终结束时,才需要'ENT_QUOTES'。 – mario

+0

是的,就是这样,一些用户数据可能在我的应用中属性中,也是在jQuery字符串中 – pepe

1

如果你希望用户能够编写HTML,然后HTMLPurifier似乎是一个很好的解决方案 - 但你”重新写作,似乎你不想要,并需要用户输入HTML,在这种情况下,它是根本没有解决方案(正如你所说,它允许例如一个div元素)。

ヶ辆,而另一方面,逃脱了用户的输入,所以它去最XSS和阻止HTML的方式。但是,请注意,htmlEntities不会保护您免受所有XSS攻击。例如,如果围绕HTML属性使用单引号并允许将用户输入插入到属性值中,则恶意用户可以通过传递'单引号字符来攻击您,从而转义您的引用。为了避免这种情况,您需要使用ENT_QUOTES选项。 PHP.net的其他人提到,在评论中还需要特别注意双破折号。

+0

thx philipp - 我的应用程序不是为用户提交HTML而设计的,所以你是正确的HTMLPurifier似乎不是要走的路 – pepe

+0

'没有设计'并不意味着HTML获胜不会被提交(恶意)。 –

相关问题