为什么 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");
如果您想在使用 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);
我正在处理来自用户的数据,这些数据在两种情况下都使用 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");
如果您想在使用 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);