我需要从PHP更新用户密码,这是通过ALTER USER语句完成的。我无法使用预准备语句,因为它们不支持DDL命令。用户名字段可以轻松清理,确保它与字母数字正则表达式匹配,但我无法找到一种安全的方法来清理密码。
我该怎么做?
我知道情况并非理想,但我不会在这里做主。我只是想保证它尽可能安全。
编辑:这是我尝试运行的一个例子
ALTER USER myusername IDENTIFIED BY mynewpassword1
这在SQL Developer中成功运行,我可以通过连接使其工作,但我希望避免这种情况。
答案 0 :(得分:2)
将输入传递给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
。