Как с помощью PHP очистить пользовательский ввод для оператора SQL DDL?
Мне нужно обновить пароль пользователя из PHP, это достигается с помощью инструкции ALTER USER. Я не могу использовать подготовленные операторы, потому что они не поддерживают команды DDL. Поле имени пользователя можно легко очистить, убедившись, что оно соответствует буквенно-цифровому регулярному выражению, но я не могу найти безопасный способ очистки пароля.
Как мне это сделать?
Я знаю, что ситуация не идеальная, но я не называю выстрелы здесь. Я просто пытаюсь сохранить его как можно безопаснее.
РЕДАКТИРОВАТЬ: Вот пример того, что я пытаюсь запустить
ALTER USER myusername IDENTIFIED BY mynewpassword1
Это успешно работает в SQL Developer, и я могу заставить его работать через конкатенацию, но я надеюсь избежать этого.
1 ответ
Передайте входные данные в переменную связывания блоков PL/SQL и выполните конкатенацию внутри PL/SQL после использования DBMS_ASSERT.ENQUOTE_NAME
чтобы подтвердить ввод.
(Оригинальный плакат понимает опасность этого подхода, но его стоит переформулировать: как правило, это не очень хорошая идея. Всегда избегайте построения операторов SQL с конкатенацией, когда это возможно. В 99,9% случаев это можно сделать с помощью простых старых переменных связывания. множество хитрых способов заставить SQL-инъекцию происходить всякий раз, когда соединяются строки.)
declare
v_quoted_string varchar2(100);
begin
v_quoted_string := dbms_assert.enquote_name(:v_new_password, capitalize => false);
execute immediate 'alter user myusername identified by '||v_quoted_string;
end;
/
Если пользователь пытается вырваться из имени с помощью двойной кавычки, это исключение будет вызвано: ORA-44003: invalid SQL name
,