PHP 为 SQL DDL 语句清理用户输入的方法是什么?

What is the way with PHP to sanitize user input for SQL DDL statement?

我需要更新来自 PHP 的用户密码,这是通过 ALTER USER 语句完成的。我不能使用准备好的语句,因为它们不支持 DDL 命令。用户名字段可以很容易地清理,我确保它与字母数字正则表达式匹配,但我想不出一个安全的方法来清理密码。

我应该怎么做?

我知道情况不理想,但我不在这里做主。我只是尽量保证它的安全。

编辑:这是我正在尝试的示例 运行

ALTER USER myusername IDENTIFIED BY mynewpassword1

这 运行 在 SQL 开发人员中成功,我可以通过串联使其工作,但我希望避免这种情况。

将输入传递给 PL/SQL 块绑定变量,并在使用 DBMS_ASSERT.ENQUOTE_NAME 验证输入后在 PL/SQL 内进行连接。

(原发布者理解这种方法的危险性,但值得重申:这通常 不是 一个好主意。始终避免 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.