我想要阻止oracle中的sql注入:
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秒后生成返回。如何防止这种类型的注入?
PROCEDURE verify_user(pview OUT SYS_REFCURSOR,
pusername user.email%type,
ppassword user.password%type) IS这就是我正在使用的程序。
发布于 2021-04-01 16:27:18
我假设您在过程中使用绑定变量,而不是使用动态SQL (您没有给出过程的代码,所以我们无法验证这一假设)。
SQL注入是在您的测试设置中发生的,而不是在您的过程中发生的,延迟是在您的过程中不是,而是在您的测试设置中。如果运行以下命令,您会发现:
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。此外,请确保将问题归咎于正确的问题;在这种情况下,问题很可能出在您的测试设置中,而不是过程中。
https://stackoverflow.com/questions/66900444
复制相似问题