Как избежать риска внедрения SQL-кода при динамическом создании таблицы?

0

Вот простая процедура, которая создает таблицу из предоставленного пользователем ввода:

PROCEDURE 'hackProcedure'(
IN tab_name VARCHAR(63))
BEGIN

IF (tab_name REGEXP '^[A-Za-z0-9 ]+$')
THEN
    SET @StB = CONCAT('CREATE TABLE tab_name
                      (id INT(10) PRIMARY KEY NOT NULL UNIQUE AUTO_INCREMENT,
                      name VARCHAR(45),
                      guid VARCHAR(36));');
    PREPARE statementB FROM @StB;
    EXECUTE statementB;
    DEALLOCATE PREPARE statementB;
ELSE
    -- SIGNAL some error;
END IF;
#END

Перед созданием таблицы я проверяю, что пользовательский ввод содержит только альфа-числовые значения, поэтому, насколько я понимаю, плохой человек, пытающийся выполнить SQL-инъекцию в этой процедуре, не может быть успешным, потому что невозможно закомментировать оставшуюся часть запроса или добавить другие столбцы, Это безопасно или мне не хватает чего-то?

  • 4
    Разрешение пользователям (не администраторам баз данных, не разработчикам, как правило, недоверенным пользователям) создавать таблицы в первую очередь немного странно. Какой здесь вариант использования?
  • 0
    Согласен, почему пользователь может контролировать схему?
Показать ещё 6 комментариев
Теги:
sql-injection

1 ответ

0

Он не уязвим, потому что код, который вы нам показали, использует буквальное значение для имени таблицы, а не параметр. Я думаю, что вы хотели сделать это:

CONCAT('CREATE TABLE ',  tab_name, '
                  (id INT(10) PRIMARY KEY NOT NULL UNIQUE AUTO_INCREMENT,
                  name VARCHAR(45),
                  guid VARCHAR(36));');

А что если я вызову вашу функцию с...

dummy (id INT NOT NULL); DROP TABLE mysql.users; CREATE TABLE dummy2

?

Он потерпит неудачу, потому что регулярное выражение отвергнет точку с запятой и скобки, но это далеко не надежное решение.

Добавление обратных кавычек вокруг имени таблицы (если они запрещены регулярным выражением) - это небольшое улучшение.

 CONCAT('CREATE TABLE '',  tab_name, ''
  • 1
    +1 Также необходимы обратные галочки, поскольку регулярное выражение допускает пробел и не препятствует тому, чтобы имя таблицы было зарезервированным ключевым словом SQL.
  • 0
    @ Билл Карвин. Спасибо вам за ваши предложения!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню