php - FILTER_SANITIZE_EMAIL бессмысленный?

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

Несколько сайтов (включая w3schools) рекомендуют выполнить FILTER_SANITIZE_EMAIL прежде, чем выполнить FILTER_VALIDATE_EMAIL для сейфа; однако, это могло изменить отправленную электронную почту от недопустимого в действующий адрес электронной почты, который не мог быть тем, что пользователь хотел, например:

пользователь имеет адрес электронной почты jeff!@gmail.com, но случайно вводит jeff "@gmail.com.

FILTER_SANITIZE_EMAIL удалил бы" создание электронной почты jeff@gmail.com, который, как FILTER_VALIDATE_EMAIL скажет, действителен даже при том, что это не фактический адрес электронной почты пользователя.

Для предотвращения этой проблемы я планирую только выполнить FILTER_VALIDATE_EMAIL. (принятие, я не намереваюсь произвести/обработать любые аннулированные электронные письма)

Это скажет мне, действительна ли электронная почта. Если это затем не должно быть никакой потребности передать его через FILTER_SANITIZE_EMAIL, потому что какие-либо недопустимые/небезопасные символы, уже заставил бы электронную почту быть возвращенной недопустимая, корректная?

я также не знаю ни о какой электронной почте, утвержденной как допустимый FILTER_VALIDATE_EMAIL, который мог использоваться для injection/xss вследствие того, что пробелы, круглые скобки () и точки с запятой будут делать недействительным электронную почту. Или я неправильно?

(примечание: Я буду использовать подготовленные операторы для вставки данных в дополнение к этому, я просто хотел разрешить это)

24
задан jbrahy 28 July 2018 в 17:47
поделиться

1 ответ

Не изобретайте колесо, пусть ваш почтовый сервер сделает свою работу: правильная проверка / проверка электронной почты - слишком сложный вопрос , чтобы делать все вручную. Например. действительные электронные письма могут фактически содержать пробелы в соответствии с RFC2822. Даже не упоминая IDN .

Избегайте выхода, чтобы быть в безопасности от XSS. Выходите из параметров SQL как обычно. Используйте подготовленные запросы. Если вы правильно экранируете все свои входные и выходные данные, то не имеет значения, что вы сохраняете в базе данных, поэтому дезинфекция данных такого типа не имеет смысла.

Итог:

  • проверять электронную почту только на предмет базовой правильности,
  • использовать FILTER_VALIDATE_EMAIL, если нужно,
  • не использовать FILTER_SANITIZE_EMAIL для пользовательских данных.

(Возможно, стоит отметить, что на некоторых старых версиях PHP FILTER_VALIDATE_EMAIL не очень хорошо справлялись со своей работой на типичном интернет-сайте: он скажет вам, что john@gmail является действительным электронным письмом.)

1
ответ дан 28 November 2019 в 23:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: