我在我的网站上使用
htmlspecialchars()
来显示用户的状态帖子。
状态帖子正在保存到我的数据库中并拉出以显示在他们的时间线中。
我正在使用 Laravel 5.3
问题是如果有人发布类似:
Netflix & Chill
,这就会变成Netflix & Chill
我怎样才能仍然使用
htmlspecialchars()
,这样我就可以保证我的网站安全,但仍然显示正确的文本,而不是将甚至&
符号变成&
它应该显示正确的文本。
我所看到的您所描述的最常见原因是双重编码。 (将字符串传递给
htmlspecialchars
两次。)例如,使用
$str = 'Netflix & Chill';
如果您使用
echo htmlspecialchars($str)
,您将在浏览器中看到“Netflix & Chill”。但如果您改用 echo htmlspecialchars(htmlspecialchars($str));
,您将在浏览器中看到转义的 & 符号。 (如果你查看页面源码,其实是Netflix & Chill
。)
如果您使用自动转义输出的模板,您可能会无意中执行此操作。我注意到你用 Laravel 标记了这个问题,刀片模板可以做到这一点。请参阅此处文档:
Blade
语句通过PHP的htmlspecialchars函数自动发送,防止XSS攻击。{{ }}
如果您使用它来显示数据,则在将值发送到模板之前不应使用
htmlspecialchars
。