【问题标题】:Why is htmlspecialchars consistently displaying " and ' instead of the actual quotes in PHP?为什么 htmlspecialchars 始终显示 " 和 ' 而不是 PHP 中的实际引号?
【发布时间】:2022-01-05 07:45:38
【问题描述】:

我正在处理来自用户的数据,在这两种情况下都使用 filter_var() 进行了清理和验证。然后将其存储在数据库中,稍后在站点的不同页面上进行访问。我使用 htmlspecialchars($var, ENT_QUOTES); 转义输出;

但是,如果用户在其输入中的任何位置输入单引号或双引号,则双引号将显示为 ",单引号显示为 '。它还在数据库中存储为 " 和 '

我需要浏览器来呈现实际的报价,而不是这段代码。

我在 stackoverflow 上到处查看,但似乎找不到我的问题的具体答案。

下面是一些经过清理的数据的 sn-p - 然后验证数据的长度、是否为空,以及在某些情况下(如邮政编码)的格式。 p>

$contact_postal = filter_var($_POST['contact-postal'], FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH);
$contact_address = filter_var($_POST['contact-address'], FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH);
$contact_person = filter_var($_POST['contact-person'], FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH);
$contact_person_phone = filter_var($_POST['contact-person-phone'], FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH);
$contact_additional_details = filter_var($_POST['contact-additional-details'], FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH);

以下是检索到的一些数据以供显示

$postal_code = htmlspecialchars(safeDecrypt($row['postal_code'], $enc_key), ENT_QUOTES);

if (!empty($row['address'])) $address = htmlspecialchars(safeDecrypt($row['address'], $enc_key), ENT_QUOTES);

$contact_person = htmlspecialchars($row['contact_person'], ENT_QUOTES);

if (!empty($contact_person) && !empty($contact_person_phone)) $contact_person_phone = htmlspecialchars(safeDecrypt($row['contact_person_phone'], $enc_key), ENT_QUOTES);

$contact_details = htmlentities($row['contact_details'], ENT_QUOTES, "UTF-8"); //used alternatively to test (but same problem occurs)

safeDecrypt 函数只是对之前加密的数据进行解密。这不太可能是问题,因为无论有没有它都会出现问题。

【问题讨论】:

  • 看起来它被转义了两次。 FILTER_SANITIZE_STRING 和 htmlspecialchars 做同样的事情。在每个步骤中转储原始数据(要检查的 CLI 或查看源)并找出答案。
  • @mario 我可以在数据库中看到,至少对于未加密的数据,'和 "存储而不是引号。我应该采取不同的措施来防止这种情况发生吗?

标签: php validation escaping htmlspecialchars


【解决方案1】:

如果您想阻止htmlspecialchars 转换'",您可以改用ENT_NOQUOTES 标志,例如:

$contact_details = htmlentities($row['contact_details'], ENT_NOQUOTES, "UTF-8"); 

htmlspecialchars docs


如果您想在使用 filter_var 时保留引号,您可以使用 FILTER_FLAG_NO_ENCODE_QUOTES 例如

$contact_postal = filter_var($_POST['contact-postal'], FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH | FILTER_FLAG_NO_ENCODE_QUOTES);

sanitize filters

【讨论】:

  • 我还是一样的 '和 "
  • @MailCarrier 哦,对不起!你在你的问题中提到,“它也以”和'的形式存储在数据库中,所以我认为这只是对htmlspecialchars的调用是问题所在。从您最近的评论中我可以看出情况并非如此。
  • @MailCarrier 您可以简单地对这些字符进行字符串替换。
  • 真正奇怪的是我试过了,但我仍然得到这些值,我似乎无法摆脱它们。删除代码的唯一解决方案是使用 htmlspecialchars_decode() 但显然这违背了对字符串进行编码以进行显示的目的。
  • 我已经更新了我的答案,以展示如何防止 FILTER_SANITIZE_STRING 也替换引号。
猜你喜欢
  • 2019-01-31
  • 2020-07-25
  • 1970-01-01
  • 1970-01-01
  • 2015-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-03
相关资源
最近更新 更多