В MySQL подготовленный оператор внутри хранимой процедуры безопасен от внедрения SQL? Смотрите пример ниже. Хранимой процедуре get_info передаются имя таблицы (pTbl) и предложение where (pWhere). pГде может быть много AND (например, fld1 = "a" AND fld2 = "b" AND ...). Вероятно, это не лучший способ сделать это, но мне нужно иметь динамический sql.
CREATE PROCEDURE get_info(pTbl VARCHAR(10), pWhere TEXT)
BEGIN
SET @uSQL = CONCAT('SELECT info FROM ',pTbl,' WHERE ',pWhere);
PREPARE ps FROM @uSQL;
EXECUTE ps;
END$$
Я попытался вызвать хранимую процедуру, как показано ниже, с помощью MySQL Query Browser, но получил только ошибку, сообщающую, что в моем SQL есть синтаксическая ошибка.
CALL get_info('tbl','1=1;SELECT * FROM information_schema.TABLES;');
Если это помогает, хранимая процедура вызывается из PHP с использованием PDO, как показано ниже. $ tbl - это переменная $ _SESSION, а $ whr - это переменная $ _GET.
$s=$c->prepare("CALL get_info(?,?)");
$s->execute(array($tbl,$whr));
Безопасна ли эта хранимая процедура? Если нет, то как бы мне это ввести? Имеет ли значение, если я использую MySQL Query Browser с веб-страницы? Спасибо ...