Я хотел бы начать свой вопрос, сказав: я понимаю, что 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
вместе, как в примере выше? Моя основная проблема заключается в том, могут ли эти две функции использоваться вместе или вызвать какой-то конфликт / ошибку при выполнении / выгрузке в БД?
Также есть ли какая-либо польза от использования обоих?
заранее спасибо
Санитирование строки служит для того, чтобы соответствовать определенным ожиданиям. FILTER_SANITIZE_EMAIL
удаляет любые символы из строки, которая недействительна в письме. Результат (предположительно) гарантированно соответствует синтаксису адреса электронной почты. Как полезно случайным образом удалять символы из строки, я оставлю вам. (Подсказка: я не думаю, что это очень полезно вообще, вам лучше отклонить недействительные адреса, чем преобразовать их в случайные результаты. Я даю вам неверный адрес электронной почты, вы забиваете его в какую-то форму, которая напоминает адрес электронной почты, теперь как Знаете ли вы, что сможете отправить мне электронное письмо …?!)
mysql_real_escape_string
чтобы гарантировать, что произвольная строка не нарушает синтаксис строкового литерала SQL, избегая всех достойных escape-символов. Предполагая, что вы используете его правильно (много ошибок в mysql есть, поэтому он устарел …), вы ничего не можете сделать с его входом, который бы сработал. Вы даете ему произвольную строку, она возвращает вам escape-версию, период.
В общем, да, то, что вы делаете, прекрасно. Если mysql_real_escape_string
– это последнее, что вы делаете для своей строки, прежде чем интерполировать ее в строковый литерал SQL, тогда все в порядке.
В этом случае, если фильтр не выполнен, запрос будет выглядеть следующим образом:
SELECT email FROM members WHERE email = '0'
Так что не стоит беспокоиться о запросе; он просто не вернет никаких результатов.
Если, конечно, у вас аналогичный запрос на вставку / обновление.
В этом случае у вас может быть много строк в базе данных, где письмо равно '0'
Использование обоих в порядке, но то, что вы действительно должны делать, – это не использовать mysql_
вообще. Вместо этого вы должны использовать PDO
или mysqli_
с подготовленными инструкциями, чтобы избежать SQL-инъекции.
См. Как я могу предотвратить SQL-инъекцию в PHP?
Или для руководства по переключению на MySQLi см. Могу ли я слепо заменить все функции mysql_ на mysqli_?
Ваша главная проблема должна заключаться в устаревшем подходе, который оставляет сайт вашего клиента уязвимым для атаки SQL-инъекций. Рассматривая эту мелочь вопроса использования еще одной нерелевантной функции, не о чем беспокоиться.