Использование php filter_var с mysql_real_escape_string
Я хотел бы начать свой вопрос, сказав: я понимаю, что PDO/mysqli является новым стандартом и широко освещается на SO. Однако в этом конкретном случае у меня нет времени для преобразования всех запросов в PDO перед запуском сайта клиентов.
В большинстве запросов на сайте использовалось следующее (не я могу добавить)
$userEmail = filter_var($_POST['fEmail'], FILTER_SANITIZE_EMAIL);
$userEmail = mysql_real_escape_string($userEmail);
$sql ="SELECT email FROM members WHERE email = '$userEmail'";
:
:
Я хотел бы знать:
Хорошо ли/нормально использовать filter_var
и mysql_real_escape_string
вместе, как в примере выше? Моя основная проблема заключается в том, могут ли эти две функции использоваться вместе или вызвать какой-то конфликт/ошибку при выполнении/выгрузке в БД?
Также есть какая-то польза от использования обоих?
Заранее спасибо
Ответы
Ответ 1
Санитация строки служит для того, чтобы она соответствовала определенным ожиданиям. FILTER_SANITIZE_EMAIL
удаляет любые символы из строки, которая недействительна в письме. Результат (предположительно) гарантированно соответствует синтаксису адреса электронной почты. Как полезно случайным образом удалять символы из строки, я оставлю вам. (Подсказка: я не думаю, что это очень полезно вообще, вам лучше отклонить недействительные адреса, чем преобразовать их в случайные результаты. Я даю вам недействительный адрес электронной почты, вы забиваете его в какую-то форму, похожую на адрес электронной почты, теперь как Знаете ли вы, что сможете отправить мне письмо...?!)
mysql_real_escape_string
существует, чтобы гарантировать, что произвольная строка не нарушает синтаксис строкового литерала SQL, избегая всех достойных escape-символов. Предполагая, что вы используете его правильно (много ошибок в mysql есть, поэтому он устарел...), вы ничего не можете сделать с его входом, который бы сработал. Вы даете ему любую произвольную строку, она возвращает вам escape-версию, период.
Как таковой, в общем, да, то, что вы делаете, прекрасно. Если mysql_real_escape_string
- это последнее, что вы делаете со своей строкой, прежде чем интерполировать ее в строковый литерал SQL, тогда это хорошо.
Ответ 2
В этом случае, если фильтр не выполняется, запрос будет выглядеть следующим образом:
SELECT email FROM members WHERE email = '0'
Итак, не стоит беспокоиться о запросе; он просто не вернет никаких результатов.
Если, конечно, у вас есть аналогичный запрос на вставку/обновление.
В этом случае у вас может быть много строк в базе данных, где электронное письмо '0'
Ответ 3
Использование обоих в порядке, но то, что вы действительно должны делать, - это не использовать mysql_
вообще. Вместо этого следует использовать PDO
или mysqli_
с подготовленными инструкциями, чтобы избежать инъекции SQL.
См. Как я могу предотвратить SQL-инъекцию в PHP?
Или для руководства по переключению на MySQLi см. Могу ли я вслепую заменить все функции mysql_ на mysqli_?
Ответ 4
Ваша основная забота - это устаревший подход, который оставляет ваш клиентский сайт уязвимым для атаки SQL-инъекций.
Рассматривая эту мелочь вопроса использования еще одной нерелевантной функции, не о чем беспокоиться.