Я использую, is_email()
чтобы проверить, действителен ли предоставленный пользователем адрес электронной почты. Например:
$email = $_POST['email'];
if ( is_email( $email ) )
// Do something.
Насколько мне известно, ничто в этой функции не записывает информацию в базу данных. Должен ли я проводить санитарную обработку, $email
прежде чем передать ее в функцию?
sanitization
henrywright
источник
источник
Ответы:
Если посмотреть на
is_email()
функциональность trac, похоже, что вам не нужно обрабатывать данные, так как это просто тестирование строк. Я бы даже сказал, что если эта функция возвращает значение true, вам не нужно очищать ее перед отправкой в базу данных.источник
WordPress и PHP ядро
is_email()
Функция Source является типичной реализацией WordPress и не полностью работать с тем, что RFC 6531 позволяет. Одной из причин может быть то, чтоFILTER_VALIDATE_EMAIL
константа PHP по умолчанию дляfilter_var()
не намного лучше при проверке чего-либо в соответствии с руководящими принципами Internet Engineering Task Force (IETF®) .стандарты
Дело в том, что RFC 6531 допускает «символы Юникода за пределами диапазона ASCII» . А именно это (для локальной части - до
@
):и для глобальной / доменной части:
Источник: Википедия
Что действительно?
Это может привести к странным, но действительным адресам электронной почты, подобным следующему:
Источник: php.net / author gt@kani.hu - пример, исправленный автором этого поста
рамки
Существуют также локальные ограничения и ограничения длины домена:
Источник: Википедия
Ограничения WordPress
И вот что проверяет WordPress:
strlen( $email ) < 3
strpos( $email, '@', 1 ) === false
!preg_match( '/^[a-zA-Z0-9!#$%&\'*+\/=?^_`{|}~\.-]+$/', $local )
preg_match( '/\.{2,}/', $domain )
trim( $domain, " \t\n\r\0\x0B." ) !== $domain
$subs = explode( '.', $domain );
и затем2 > count( $subs )
trim( $sub, " \t\n\r\0\x0B-" ) !== $sub
!preg_match('/^[a-z0-9-]+$/i', $sub )
Источник: WP Core v4.0
Фильтры и пользовательская проверка
Все вышеперечисленные случаи приведут
is_email()
к возврату false. Результат может фильтроваться (обратный вызов может быть присоединен), и у фильтра будет три аргумента, где последний аргумент является причиной. Пример:Это означает, что вы можете переопределить результаты, возвращаемые определенными проверками.
Это позволяет добавлять специальные проверки, например, разрешать использование доменов Umlaut, частей домена только для TLD и т. Д.
Вывод
WordPress безопасен в большинстве случаев, но более ограничен, поскольку почтовые серверы должны соответствовать RFC. Имейте в виду, что не каждый почтовый сервер будет соответствовать рекомендациям RF 6531.
редактировать
Забавный побочный эффект: внутри есть две взаимосвязанные функции
~/wp-includes/formatting
:is_email()
иsanitize_email()
. Они практически одинаковые функции. Я понятия не имею, почему кто-то решил, что было бы неплохо скопировать содержимое функции из одного в другое, вместо того, чтобы просто добавить одно в качестве обратного вызова к фильтрам, которые предоставляет другой. Поскольку v0.71 и v1.5 совпадают, я лично буду использовать позже, когда вы получите очищенную строку. Обратите внимание, что даже говорится, что он не соответствует RFC.is_email()
sanitize_email()
is_email()
источник
Дезинфицировать все вещи!
Одно из основных правил безопасности - никогда не доверять вводу пользователя. В общем, я не беспокоюсь о реализации is_email () или любой другой конкретной функции, или если эта функция делает что-то опасное с тем, что я ей даю. Возможно, реализация когда-нибудь изменится. Кто знает. Я должен предположить, что это может быть скомпрометировано. Всегда следует исходить из того, что пользовательский ввод активно враждебен, вдвойне для всего, что в конечном итоге предназначено для базы данных, и для очистки каждого бита пользовательского ввода перед передачей его какой-либо функции. Это просто хорошая, общая гигиена безопасности.
источник