PHP 清理 SQL DDL 语句的用户输入的方式是啥?
Posted
技术标签:
【中文标题】PHP 清理 SQL DDL 语句的用户输入的方式是啥?【英文标题】:What is the way with PHP to sanitize user input for SQL DDL statement?PHP 清理 SQL DDL 语句的用户输入的方式是什么? 【发布时间】:2017-11-11 20:16:04 【问题描述】:我需要从 php 更新用户的密码,这是通过 ALTER USER 语句完成的。我不能使用准备好的语句,因为它们不支持 DDL 命令。确保用户名字段与字母数字正则表达式匹配,可以轻松清理用户名字段,但我无法找到清理密码的安全方法。
我应该怎么做?
我知道情况并不理想,但我不在这里做主。我只是尽量保证它的安全。
编辑:这是我正在尝试运行的示例
ALTER USER myusername IDENTIFIED BY mynewpassword1
这在 SQL Developer 中成功运行,我可以通过连接使其工作,但我希望避免这种情况。
【问题讨论】:
这是插入/更新行问题还是更改表问题?如果是第一个,我看不出用准备好的语句怎么能做到这一点 这是一个 ALTER USER 如果两者都不是,请给我们一些代码。在具有 dbal alter 的通用 SQL 或 DQL 中,用于修改表结构,而不是修改行。所以它要么是alter table ...
,要么是update user set...
。
我用示例查询更新了上面的帖子,谢谢
【参考方案1】:
将输入传递给 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
。
【讨论】:
以上是关于PHP 清理 SQL DDL 语句的用户输入的方式是啥?的主要内容,如果未能解决你的问题,请参考以下文章