如何允许&使用htmlspecialchars()

时间:2017-08-29 22:08:32

标签: php laravel-5 htmlspecialchars

我在我的网站上使用htmlspecialchars()来显示用户的状态信息。 状态帖子将保存到我的数据库中,并在时间轴中显示。

我正在使用laravel 5.3

问题是,如果有人发布了类似:Netflix & Chill的内容,则会转为Netflix & Chill

我如何仍然使用htmlspecialchars()以便我可以保证我的网站安全,但仍然会显示正确的文字,而不是将&符号转换为&

2 个答案:

答案 0 :(得分:2)

它应该显示正确的文字。

我所看到的最常见的原因是双重编码。 (将字符串传递htmlspecialchars两次。)例如,使用

$str = 'Netflix & Chill';

如果你使用echo htmlspecialchars($str),你会看到'Netflix&在浏览器中冷静下来。但是,如果您使用echo htmlspecialchars(htmlspecialchars($str));,则会在浏览器中看到转义的&符号。 (如果您查看页面源,它​​实际上是Netflix & Chill。)

如果您使用的是自动转义输出的模板,则可能会无意中执行此操作。我注意到你用Laravel标记了这个问题,而刀片模板就是这样做的。请参阅the documentation

  

刀片{{ }}语句通过PHP的htmlspecialchars函数自动发送,以防止XSS攻击。

如果这是您用来显示数据的内容,则在将值发送到模板之前不应使用htmlspecialchars

答案 1 :(得分:0)

htmlspecialchars将原始ASCII字符转换为HTML实体。这意味着它们仍然可以在页面上正确呈现(即<符号在页面上仍然显示为<),但对HTML没有任何特殊含义。

因此,在 数据库 中,它们将显示为entity codes,但在呈现在 页面 <时/ strong>,用户可以将其视为他们输入的初始字符。

如果你需要保留数据库中的字符(我不确定你为什么需要),你可以考虑用homoglyphs替换它们,因为保留它们在数据库中的外观并保护你的如果您只是使用htpspecialchars,则无法使用HTML。