为什么 htmlspecialchars 始终显示 " 和 ' 而不是 PHP 中的实际引号?

Why is htmlspecialchars consistently displaying " and ' instead of the actual quotes in PHP?

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

转义输出

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

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

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

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

$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 函数只是对之前加密的数据进行解密。它不太可能是问题所在,因为无论有没有它都会出现问题。

如果您想阻止 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