使用htmlspecialchars()时如何允许&符号

问题描述 投票:0回答:2

我在我的网站上使用

htmlspecialchars()
来显示用户的状态帖子。 状态帖子正在保存到我的数据库中并拉出以显示在他们的时间线中。

我正在使用 Laravel 5.3

问题是如果有人发布类似:

Netflix & Chill
,这就会变成
Netflix & Chill

我怎样才能仍然使用

htmlspecialchars()
,这样我就可以保证我的网站安全,但仍然显示正确的文本,而不是将甚至
&
符号变成
&

php laravel-5 htmlspecialchars
2个回答
1
投票

它应该显示正确的文本。

我所看到的您所描述的最常见原因是双重编码。 (将字符串传递给

htmlspecialchars
两次。)例如,使用

$str = 'Netflix & Chill';

如果您使用

echo htmlspecialchars($str)
,您将在浏览器中看到“Netflix & Chill”。但如果您改用
echo htmlspecialchars(htmlspecialchars($str));
,您将在浏览器中看到转义的 & 符号。 (如果你查看页面源码,其实是
Netflix & Chill
。)

如果您使用自动转义输出的模板,您可能会无意中执行此操作。我注意到你用 Laravel 标记了这个问题,刀片模板可以做到这一点。请参阅此处文档

Blade

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

如果您使用它来显示数据,则在将值发送到模板之前不应使用

htmlspecialchars


1
投票

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

因此,在数据库中,它们将显示为实体代码,但是当呈现到页面时,用户将能够将它们视为他们键入的初始字符。

如果您需要保留数据库中的字符(我不确定您为什么需要这样做),您可以考虑用 homolyphs 替换它们,因为保留它们在数据库中的外观并且保护您的 HTML 是不可能的如果您只是使用

htmlspecialchars

© www.soinside.com 2019 - 2024. All rights reserved.