Статьи  : 

Экранирование чисел в MySQL-запросах

1 июля 2013, 22:10

Бытует мнение, что числа в запросах к базе экранировать необязательно. Действительно, такой запрос вполне работоспособен:

INSERT INTO `table` (`id_row`, `value_row`) VALUES ($id_row, 'test');


(вокруг числа $id_row нет прямых кавычек)

Но где гарантия, что там будет всегда число? Особенно если обработку входящих данных делали не вы. Или некий хакер специально передаст вместо числа строку. Последствия этого плачевны.

Вариант со строкой:
INSERT INTO `table` (`id_row`, `value_row`) VALUES (test, 'test');


Вариант с "пустышкой":
INSERT INTO `table` (`id_row`, `value_row`) VALUES (, 'test');


Между тем, простое экранирование числа решило бы проблему.

Вариант со строкой:
INSERT INTO `table` (`id_row`, `value_row`) VALUES ('test', 'test');


Вариант с "пустышкой":
INSERT INTO `table` (`id_row`, `value_row`) VALUES ('', 'test');


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

Да, кстати, ничего страшного в экранировании чисел тоже нет. MySQL сама преобразует к нужному типу.