Oracle 存储过程的SQL注入

Oracle 存储过程的SQL注入,oracle,stored-procedures,sql-injection,Oracle,Stored Procedures,Sql Injection,我正在评估为我的sp执行SQL注入的可能性 我曾尝试使用它进行SQL注入,但未能成功注入(意味着注入文本按照正常方式插入到表中): 我应该如何尝试SQL注入?或者SP是如此安全以至于SQL注入被某种方式阻止了 我降低的SP如下所示: @ID int, @AIType varchar(1), @parent varchar(20), @child varchar(20), AS BEGIN SET NOCOUNT ON; -- Insert statements for procedure he

我正在评估为我的sp执行SQL注入的可能性

我曾尝试使用它进行SQL注入,但未能成功注入(意味着注入文本按照正常方式插入到表中):

我应该如何尝试SQL注入?或者SP是如此安全以至于SQL注入被某种方式阻止了

我降低的SP如下所示:

@ID int,
@AIType varchar(1),
@parent varchar(20),
@child varchar(20),
AS
BEGIN

SET NOCOUNT ON;
-- Insert statements for procedure here
BEGIN TRY
    UPDATE AI_Grouping
    SET AIType=@AIType, 
        parent=@parent,
        child=@child,
    WHERE ID=@ID
END TRY
BEGIN CATCH
    -- Catch exceptions
END CATCH
END 
编辑:

如果有帮助的话——在前端,我有一个与SP变量类型一致的字段长度验证。有些字段限制为最多8个字符,有些字段限制为最多20个字符(如上面的示例)。也许我上面尝试的注入示例是一个糟糕的示例,因为长度超过20个字符。。。 最终的问题是,我的SP是否易受SQL注入攻击

从文章中:

区分编译时固定SQL语句文本和 运行时创建的SQL语句文本

我们将术语编译时固定SQL语句文本定义为 SQL语句,在运行时无法更改,并且可以 通过读取源代码确定。更准确地说,它是一个 是PL/SQL静态varchar2表达式的SQL语句14。价值 PL/SQL静态varchar2表达式不能在运行时更改,并且可以在编译时预计算

嵌入式SQL的SQL语句文本由PL/SQL组成 编译器,无法在运行时更改。因此,嵌入式SQL是绝对必要的 仅执行编译时固定SQL语句text15

但是,可以很容易地安排PL/SQL的任何执行方法 动态SQL将在特定的调用站点上只执行编译时固定SQL

所以你的代码是安全的

要区分编译时固定SQL运行时创建的SQL,这里有两个示例:

编译时间固定的SQL

CREATE PROCEDURE remove_emp (p_employee_id NUMBER) AS
  BEGIN
     -- here the delete command is immutable, therefore sql injection safe
     DELETE FROM employees
        WHERE employees.employee_id = p_employee_id;
  END;
CREATE PROCEDURE remove_emp (p_employee_id VARCHAR2) AS
  BEGIN
     -- here the delete command is dynamically created allowing 
     -- sql injection
     execute immediate 'DELETE FROM employees
        WHERE employees.employee_id = ' || p_employee_id || ';';
  END;
运行时创建的SQL

CREATE PROCEDURE remove_emp (p_employee_id NUMBER) AS
  BEGIN
     -- here the delete command is immutable, therefore sql injection safe
     DELETE FROM employees
        WHERE employees.employee_id = p_employee_id;
  END;
CREATE PROCEDURE remove_emp (p_employee_id VARCHAR2) AS
  BEGIN
     -- here the delete command is dynamically created allowing 
     -- sql injection
     execute immediate 'DELETE FROM employees
        WHERE employees.employee_id = ' || p_employee_id || ';';
  END;

向SP中注入SQL的唯一方法是使用动态查询并在其上串联varchar参数。没有动态查询的存储过程是预编译的,因此您不能使用参数更改命令。感谢您对@JorgeCampos的评论。你是想说我的SP不受SQL注入的影响吗?有了这段代码,是的。这里有一个很好的阅读:@JorgeCampos great!非常感谢。