【问题标题】: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...
  • 我用示例查询更新了上面的帖子,谢谢

标签: php oracle doctrine dbal


【解决方案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

【讨论】:

    猜你喜欢
    • 2013-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多