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

pep*_*epe 3 html php security xss htmlpurifier

我一直在'洒'

htmlentities($user_input, ENT_QUOTES, 'UTF-8')
Run Code Online (Sandbox Code Playgroud)

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

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

我已经注意到,单独的HTMLPurifier将尝试关闭一个打开<div>而不是删除它,所以如果一些smartass输入他的名字,Johnny<div>而我echo在我的视图中,它会破坏我的整个布局.

但如果相反,我会htmlentities独自使用

Johnny<div>
Run Code Online (Sandbox Code Playgroud)

我的布局得以保留.

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

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

你怎么看?

Jon*_*Jon 9

如果你担心XSS然后使用htmlspecialchars(没有理由使用全面的htmlentities),你是金色的:

echo htmlspecialchars($user_input);
Run Code Online (Sandbox Code Playgroud)

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

更新:

是的,htmlspecialchars确实支持其他标志(包括ENT_QUOTES).但是,在以下ENT_QUOTES情况需要:

  • 您正在输出HTML属性的值
  • 您已将值括在引号内

因此,例如,你会不会需要ENT_QUOTES在这里:

<p><?php echo htmlspecialchars($input); ?></p>
Run Code Online (Sandbox Code Playgroud)

或者在这里:

<p id="<?php echo htmlspecialchars($input); ?>"></p>
Run Code Online (Sandbox Code Playgroud)

在这里需要它:

<p id='<?php echo htmlspecialchars($input, ENT_QUOTES); ?>'></p>
Run Code Online (Sandbox Code Playgroud)