$str = '"mynam@blabl"@domanin.com'; filter_var($str, FILTER_VALIDATE_EMAIL);//return valid email.
вышеприведенное электронное письмо возвращает true … Достаточно справедливо, что RFC 2822 говорит, что это юридический адрес электронной почты.
мой вопрос заключается в том, что если вы проверяете электронное письмо с использованием вышеизложенного, может ли электронное письмо выполнять инъекции sql, которые могут нанести вред db, даже если вы отфильтровали его с помощью filter_var?
мой вопрос заключается в том, что если вы проверяете электронное письмо с использованием вышеизложенного, может ли электронное письмо выполнять инъекции sql, которые могут нанести вред db, даже если вы отфильтровали его с помощью filter_var?
filter_var
не заменяет mysql_real_escape_string()
специфичные для базы данных, такие как mysql_real_escape_string()
! Нужно всегда применять это тоже.
Да – не полагайтесь ни на что, кроме механизма отслеживания базы данных для безопасности от SQL-инъекции.
Всегда используйте mysql_real_escape_string()
прежде чем использовать его в SQL.
Кроме того, это не безопасно. _VALIDATE_EMAIL позволяет использовать одиночные кавычки и обратную сторону. (Но функции чистки никогда не следует полагаться, всегда избегать контекста или использовать параметризованный SQL.)
Я имею тенденцию использовать FILTER_VALIDATE_EMAIL, чтобы проверить, является ли электронная почта действительной, а затем дальше по строке, если электронное письмо необходимо сохранить в базе данных, я бы затем удалял опасные символы. Библиотеки mysql и mysqli в значительной степени мертвы в воде, поэтому я бы предложил использовать PDO, который является гораздо более безопасным вариантом.
http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers
Кроме того, приведенная ниже ссылка указывает, какие символы являются законными в адресе электронной почты, обратные ссылки и одинарные кавычки разрешены в адресе электронной почты, следовательно, вероятно, почему FILTER_VALIDATE_EMAIL не забирает их … помните, что мы ищем недействительные адреса электронной почты, а не опасные адреса электронной почты ,
Как и все, что касается любого языка программирования, вы всегда должны сохранять безопасность в верхней части списка!
Никогда не используйте VALIDATE
, возможно, вы можете использовать SANITILIZE
но я все равно не рекомендую.
Рассмотрим этот код:
$email = filter_var($_GET['email'], FILTER_VALIDATE_EMAIL); $query = mysqli_query($sql, 'SELECT * FROM table WHERE email = "'.$email.'"');
Основной SQL-инъекция " or 1 = 1
, вы уже слышали об этом. Но мы не можем использовать espaces, и нам нужно закончить эту строку чем-то вроде @something.com
.
Итак, мы начинаем с "
и добавляем or'1'='1'
это будет работать (потому что or1=1
не удастся). Теперь нам нужно @email.com
, давайте добавим его как комментарий MySQL ( --@something.com
). Таким образом, это результат:
"or'1'='1'--"@email.com
Попробуй это.
Это действительный адрес электронной почты для filter_var
и небезопасный для mysqli_query
.