首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL注入Oracle

SQL注入Oracle
EN

Stack Overflow用户
提问于 2021-04-01 15:51:49
回答 1查看 90关注 0票数 0

我想要阻止oracle中的sql注入:

代码语言:javascript
复制
begin
                my_pkg.verify_user(pview => :pview,
                  pusername => 'sample@email.tst'||dbms_pipe.receive_message(chr(98)||chr(98)||chr(98),9)||'',
                  ppassword => 'ygsMq/NCuntF7us35f8UaQ==');
    end;

如果这是在测试用例中传递的,则在9秒后生成返回。如何防止这种类型的注入?

代码语言:javascript
复制
PROCEDURE verify_user(pview     OUT SYS_REFCURSOR,
                    pusername user.email%type,
                    ppassword user.password%type) IS

这就是我正在使用的程序。

EN

回答 1

Stack Overflow用户

发布于 2021-04-01 16:27:18

我假设您在过程中使用绑定变量,而不是使用动态SQL (您没有给出过程的代码,所以我们无法验证这一假设)。

SQL注入是在您的测试设置中发生的,而不是在您的过程中发生的,延迟是在您的过程中不是,而是在您的测试设置中。如果运行以下命令,您会发现:

代码语言:javascript
复制
DECLARE
  p_username VARCHAR2(100);
  p_password VARCHAR2(100);
  p_time1    TIMESTAMP;
  p_time2    TIMESTAMP;
  p_time3    TIMESTAMP;
  p_time4    TIMESTAMP;
BEGIN
  p_time1 := SYSTIMESTAMP;
  p_username := 'sample@email.tst'||dbms_pipe.receive_message(chr(98)||chr(98)||chr(98),9)||'';
  p_time2 := SYSTIMESTAMP;
  p_password := 'ygsMq/NCuntF7us35f8UaQ==';
  p_time3 := SYSTIMESTAMP;
  my_pkg.verify_user(
    pview => :pview,
    pusername => p_username,
    ppassword => p_password
  );
  p_time4 := SYSTIMESTAMP;
  DBMS_OUTPUT.PUT_LINE( 'Username creation time: ' || (p_time2 - p_time1) );
  DBMS_OUTPUT.PUT_LINE( 'Password creation time: ' || (p_time3 - p_time2) );
  DBMS_OUTPUT.PUT_LINE( 'Procedure run time: ' || (p_time4 - p_time3) );
END;
/

您应该会发现,用户名创建时间是9秒(因为它等待创建管道,然后等待管道超时),而过程的执行时间可以忽略不计。

清理您的输入,至少在没有将用户输入作为绑定变量传递的情况下,不要动态运行SQL。此外,请确保将问题归咎于正确的问题;在这种情况下,问题很可能出在您的测试设置中,而不是过程中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66900444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档