我在我的网站上使用htmlspecialchars()
来显示用户的状态信息。
状态帖子将保存到我的数据库中,并在时间轴中显示。
我正在使用laravel 5.3
问题是,如果有人发布了类似:Netflix & Chill
的内容,则会转为Netflix & Chill
我如何仍然使用htmlspecialchars()
以便我可以保证我的网站安全,但仍然会显示正确的文字,而不是将&
符号转换为&
答案 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。