【发布时间】: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