FILTER_VALIDATE_EMAIL делает строку безопасной для вставки в базу данных? - PullRequest
5 голосов
/ 11 ноября 2010
$str = '"mynam@blabl"@domanin.com';

filter_var($str, FILTER_VALIDATE_EMAIL);//return valid email.

указанное выше электронное письмо возвращает истину ... Достаточно справедливо, что RFC 2822 говорит, что это законный адрес электронной почты.

мой вопрос: если вы подтвердите письмо, используя вышеуказанное, может ли письмо содержать инъекции sql, которые могут повредить базу данных, даже если вы отфильтровали ее с помощью filter_var?

Ответы [ 5 ]

4 голосов
/ 11 ноября 2010

мой вопрос: если вы подтвердите письмо, используя вышеуказанное, может ли письмо содержать инъекции sql, которые могут повредить базу данных, даже если вы отфильтровали ее с помощью filter_var?

filter_var - это , а не замена для санитарии, специфичной для базы данных, такой как mysql_real_escape_string()! Нужно всегда применять это тоже.

2 голосов
/ 11 ноября 2010

Да - не полагайтесь ни на что, кроме механизма экранирования базы данных, для защиты от внедрения SQL.

Всегда используйте mysql_real_escape_string() на нем перед использованием в SQL.

1 голос
/ 16 января 2013

Я склонен использовать FILTER_VALIDATE_EMAIL, чтобы проверить, является ли электронная почта действительной, и затем далее, если электронная почта должна быть сохранена в базе данных, я бы затем убрал опасные символы.Библиотеки mysql и mysqli тоже практически мертвы в воде, поэтому я бы посоветовал использовать PDO, который является гораздо более безопасным вариантом.

http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers

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

Как и всекогда дело доходит до любого языка программирования, вы всегда должны держать безопасность наверху списка!

http://email.about.com/cs/standards/a/email_addresses.htm

1 голос
/ 11 ноября 2010

Кроме того, это не безопасно в любом случае._VALIDATE_EMAIL допускает одинарные кавычки ' и обратную черту ` в нем.(Но на очистительные функции никогда не следует полагаться, всегда нужно избегать контекста или использовать параметризованный SQL.)

0 голосов
/ 06 августа 2017

Никогда не используйте VALIDATE, может быть, вы можете использовать SANITILIZE, но я все равно не рекомендую его.


Рассмотрите этот код:

$email = filter_var($_GET['email'], FILTER_VALIDATE_EMAIL);
$query = mysqli_query($sql, 'SELECT * FROM table WHERE email = "'.$email.'"');

Базовая SQL-инъекция - " or 1 = 1, вы уже слышали об этом.Но мы не можем использовать пробелы, и нам нужно завершить эту строку чем-то вроде @something.com.

Итак, мы начнем с " и добавим or'1'='1', это будет работать (потому что or1=1 не удастся).Теперь нам нужен @email.com, давайте добавим его в качестве комментария MySQL (--@something.com).Итак, вот результат:

"or'1'='1'--"@email.com

Проверьте это.

Это действительный адрес электронной почты для filter_var и небезопасный для mysqli_query.

...