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 语句的用户输入的方式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Rails 4 清理用户输入

SQL DDL 数据定义语句

PHP安全性防范方式

以编程方式为用户定义的数据类型 (UDDT) 生成 DDL 语句

DBA常用SQL之DDL生成语句-2

SQL概念及DDL语句