С точки зрения вашей процедуры вы выглядите в безопасности, поскольку переменная в SP не будет расширена до кода, но вы все равно можете разоблачить себя, если не используете параметризованный запрос, такой как "SELECT * FROM sp_list_name(?);
"в вашем коде приложения . Пользователь может передать что-то вроде "SELECT * FROM sp_list_name('$start_name');
", передав начальное имя "');delete from t_player where last_name NOT IN ('
". Так что используйте параметризованный запрос или здравый смысл, проверьте свои входные данные в вашей программе.
NB: Обратите внимание, что переменная в хранимой процедуре не расширится до кода, даже если он содержит 'или;, (исключая передачу его в EXECUTE , для которого вы будете использовать функции quote_literal
, а не функции ручного прокрутки replace
), чтобы заменить; или 'совершенно не требуется (в хранимой процедуре, разумеется, приложение, использующее его, - это отдельная история) и не позволит вам всегда находить команды "tl;dr
" или "O'Grady
".
Лео Мур, Карл, LFSR Consulting : v_temp_name
в хранимой процедуре НЕ будет расширен до кода в SP (нет EXECUTE ), проверка должна быть выполнена в приложении, а не в SP (или OP может просто использовать параметризованный запрос в своем коде приложения). То, что предлагают другие, похоже на беспокойство по поводу
my $bar = "foo; unlink('/etc/password');";
my $baz = $bar;
на самом деле работает unlink в отсутствие eval.