У меня есть данные, обрабатываемые пользователем, которые обрабатываются и проверяются с использованием filter_var () в обоих случаях. Затем он сохраняется в базе данных и доступен позже на другой странице сайта. Я избегаю вывода с помощью htmlspecialchars ($ var, ENT_QUOTES);

Однако, если пользователь вводит одинарную или двойную кавычку в любой момент своего ввода, он отображается как «для двойных кавычек и« для одинарных кавычек. Он также сохраняется в базе данных как »и»

Мне нужен браузер для отображения фактической цитаты, а не этого кода.

Я везде искал stackoverflow и не могу найти конкретного ответа на свою проблему.

Ниже приведен фрагмент некоторых данных, которые подвергаются дезинфекции. Затем данные проверяются на предмет длины, пустоты они или нет, а также форматирования в некоторых случаях, например почтового индекса.

$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 просто расшифровывает ранее зашифрованные данные. Маловероятно, что это проблема, поскольку проблема возникает с ней или без нее.

0
MailCarrier 27 Ноя 2021 в 22:38
Похоже, от него дважды сбежали. FILTER_SANITIZE_STRING и htmlspecialchars делают то же самое. Выгружайте необработанные данные (CLI или view-source для проверки) на каждом этапе и выясняйте.
 – 
mario
27 Ноя 2021 в 22:43
Я могу видеть в базе данных, по крайней мере, для незашифрованных данных, что вместо кавычек хранятся символы «и». Есть ли что-то, что я должен сделать по-другому, чтобы этого не произошло?
 – 
MailCarrier
27 Ноя 2021 в 22:49

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);

продезинфицировать фильтры

1
Rwd 27 Ноя 2021 в 23:05
Я до сих пор получаю то же "и"
 – 
MailCarrier
27 Ноя 2021 в 22:47
Ой, извини! Вы упомянули в своем вопросе: « Он также хранится в базе данных как» и ', поэтому я предположил, что проблема заключалась только в вызове htmlspecialchars. Из вашего последнего комментария я вижу, что это не так.
 – 
Rwd
27 Ноя 2021 в 22:55
Вы можете просто заменить эти символы строкой.
 – 
Rwd
27 Ноя 2021 в 22:58
Что действительно странно, так это то, что я попробовал это, и все же я все еще получаю эти значения, я не могу от них избавиться. Единственным решением для удаления кодов было использование htmlspecialchars_decode (), но, очевидно, это противоречит цели кодирования строки для отображения.
 – 
MailCarrier
27 Ноя 2021 в 23:03
Я обновил свой ответ, чтобы показать, как запретить FILTER_SANITIZE_STRING также заменять кавычки.
 – 
Rwd
27 Ноя 2021 в 23:06