безопасность использования html_entity_decode

#php #variables #filter

#php #переменные #Фильтр

Вопрос:

Я использую php для сбора данных формы и отправки их на адрес электронной почты. Я использую php filter_vars для очистки записей. Как бы то ни было, это возвращает закодированный html в теле сообщения электронной почты. Например, я становлюсь Iamp;#39;m

 $message = "";
$message = $_POST["message"];
$message = filter_var($message, FILTER_SANITIZE_STRING);
$message = wordwrap($message, 70);
...
$Body .= $message;
$success = mail($EmailTo, $Subject, $Body, $headers); 
  

Мой вопрос таков: если я использую htmlspecialchars_decode в электронном письме типа $Body .= htmlspecialchars_decode($message) , отменяю ли я очистку и повторно открываю уязвимость? Как бы мне безопасно преобразовать закодированный html в html-объекты, чтобы мой клиент мог прочитать электронное письмо?

Комментарии:

1. вы сохраняете данные в базе данных, а затем показываете их обратно?

2. похоже, что @waanofii.tech поступает из $_POST["message"] , а затем по электронной почте.

3. Я бы поискал «XSS exploit» в Интернете. Это должно помочь ответить на этот вопрос.

Ответ №1:

FILTER_SANITIZE_STRING используется для удаления тегов, необязательно удаления или кодирования специальных символов.

Таким образом, вы просто удаляете теги и кодируете другие вещи. Чтобы не кодировать кавычки, используйте флаг фильтра FILTER_FLAG_NO_ENCODE_QUOTES :

 $message = filter_var($message, FILTER_SANITIZE_STRING, FILTER_FLAG_NO_ENCODE_QUOTES);
  

Взгляните на фильтры очистки, чтобы увидеть другие, такие как не кодирование amp; и т.д.

Однако, htmlspecialchars_decode($message) все должно быть в порядке, потому что вы уже удалили HTML-теги, и это будет декодировать только другие объекты, такие как кавычки ' " , амперсанд amp; и т.д. При этом вы могли бы просто использовать strip_tags($message) в первую очередь, чтобы оставить кавычки и амперсанды в покое.

Комментарии:

1. Спасибо за вашу помощь и вдумчивый ответ. Я буду использовать FILTER_FLAG_NO_ENCODE_QUOTES, поскольку я хотел бы опустить скобки.

2. Тогда просто используйте strip_tags и все.