@immelnikoff
Изучаю БД

Может ли MySQL 5.7 принимать в процедуры и INSERT-запросы VARCHAR-переменные в сыром виде (сырые строки)?

Дело в том, что иногда внешнее приложение пишет в поле VARCHAR строки, в конце которых встречается бэкслэш, и из-за этого возникает синтаксическая ошибка MySQL. Например,
insert into table_name(name) value('ivan\');
Доступа к приложению нет и поправить на его стороне код возможности нет в принципе. Может в MySQL есть какой-то режим, в котором строковые переменные интерпретируются MySQL-ем, как сырые (бэкслеш интерпретируется как одиночный простой символ, а не как начало управляющей последовательности)?
  • Вопрос задан
  • 94 просмотра
Пригласить эксперта
Ответы на вопрос 1
@alexalexes
Строка запроса при обработке SQL интерпретатором уже будет рассматриваться синтаксическим аппаратом SQL, в нем уже не отличишь, что реально имели ввиду, когда подставляли параметры.
Предобработка такой строки регулярными выражениями, хоть может дать толк на отдельных тестовых примерах, но не убережет вас от sql-инъекций.
Разработчик внешнего приложения должен быть сурово наказан за то, что формирует запрос вот так:
$sql = "insert into table_name(name) value('".$str_param."')";

А его приложение должно быть исключено из продакшена, как содержащее уязвимость, позволяющее атаковать sql-инъекциями, до того как не будет внесен фикс такого плана во всех случаях (!!!), где приложение контактирует с СУБД, а не только в этом запросе:
$sql = "insert into table_name(name) value(:param1)";  //текст запроса с метками для вставки параметров;
$prep_sql = $sqlconnect->prepare($sql); //подготовка SQL-запроса, фактически, синтаксический разбор и выявление меток, куда вставлять параметры, проверка ошибок;
$prep_sql->bindParam('param1', $str_param, STRING_TYPE); //связываем параметры с метками в запросе, проверяем тип входного параметра;
$prep_sql->execute(); //выполняем запрос

PS: Последний пример написан на псевдокоде, но посыл должен быть понятен.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы