я просто создаю форму регистрации, и я смотрю только для вставки действительных и безопасных электронных писем в базу данных.
Несколько сайтов (включая 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 вследствие того, что пробелы, круглые скобки () и точки с запятой будут делать недействительным электронную почту. Или я неправильно?
(примечание: Я буду использовать подготовленные операторы для вставки данных в дополнение к этому, я просто хотел разрешить это)
Не изобретайте колесо, пусть ваш почтовый сервер сделает свою работу: правильная проверка / проверка электронной почты - слишком сложный вопрос , чтобы делать все вручную. Например. действительные электронные письма могут фактически содержать пробелы в соответствии с RFC2822. Даже не упоминая IDN .
Избегайте выхода, чтобы быть в безопасности от XSS. Выходите из параметров SQL как обычно. Используйте подготовленные запросы. Если вы правильно экранируете все свои входные и выходные данные, то не имеет значения, что вы сохраняете в базе данных, поэтому дезинфекция данных такого типа не имеет смысла.
Итог:
FILTER_VALIDATE_EMAIL
, если нужно, FILTER_SANITIZE_EMAIL
для пользовательских данных. (Возможно, стоит отметить, что на некоторых старых версиях PHP FILTER_VALIDATE_EMAIL
не очень хорошо справлялись со своей работой на типичном интернет-сайте: он скажет вам, что john@gmail
является действительным электронным письмом.)