Здравствуйте уважаемы знатоки пхп. Я ещё очень нуб и только учусь, разбираюсь во всех премудростях, конкретно сейчас рою информацию на счет грамотного и безопасного обращения к бд. Я нашел несколько способов, это использовать PDO и все делать через подготовленные запросы с плейсхолдерами и прочей лабудой, однако дело в том, что я не очень люблю PDO, и использую MySQLi. Не могли бы Вы подсказать моей темной голове, как обойти эти страшный SQL инъекции используя MySQLi. Полазил тут по разным кмс, у всех по разному, но обычно прогоняли через mysqli_real_escape_string, есть ли какие-то ньансы, которые я не вижу?
А что вам мешает использовать подготавливаемые запросы в MySQLi? Или плейсхолдеры там тоже пугают? ))
Я просто пытаюсь как-то создать свою библиотеку для работы с базами данных и плейсхолдеры были бы не очень уместны.
Плейсхолдеры, конечно же, это часть решения проблемы, но в своих проектах, я не обхожусь без фильтрующих функций. Исключением могут являться какие-нибудь числовые значения, которые можно явно преобразовывать к типу integer/float перед использованием в запросах. Можете пока остановиться на этом.
Ну да, я читал, что плейсхолдерами дело не обходится, проверяют ещё обычно переменную на соответствие типу. Но неужели нельзя обойтись таким простым, удобным, веселым mysqli_real_escape_string?
Хорошо, все же спрошу для уверенности. В каких случаях лучше не использовать экранирование, а сделать все через подготовленные запросами с проверкой типа переменной?
Я таких случаев - "лучше не экранировать" - не знаю. Если вы сами в запросе прописываете какие-то значения, то можно не экранировать, но всё, что касается данных, которые приходят с клиента, то обрабатывать их всегда и безоговорочно.
Не, я имел в виду то, что простая экранизация может не подойти, и нужно будет использовать подготовленные запросы с проверками.
Добрый день! Наткнулся на данный топик, т.к. тоже интересует этот вопрос. В некоторых статьях встречается неоднозначное трактование функции mysql_real_escape_string, например, https://habrahabr.ru/post/148701/. Т.е. первичная задача этой функции форматировать строку, а как функция безопасности - это побочный эффект. В некоторых фреймворках в классе работе с БД отражается эта функция и рекомендуется ее использовать. В связи с этим вопрос, достаточно ли просто экранировать переменные, предварительно приведя их к типу? Нет ли угрозы "залета" в SQL-запрос какого-то набора спецсимволов?
hopchik, для безопасной работы с базой данных. используй класс mysqli и драйвер mysqlnd, а также используй Подготовленные запросы и хранимые процедуры, а также не забывай об установки правильной кодировки.
с числами - достаточно. А со строками - они и так строки, и на их "набор символов" их строковость не влияет. Вот тут и нужно использовать экранирование. Есть и другие способы.