我正在评估为sp执行SQL注入的可能性。
我尝试使用它来执行SQL注入,但是没有成功地进行注入(这意味着注入文本按照正常情况插入到表中):
data'; DROP TABLE my_table; --
我应该如何尝试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注入的影响?
发布于 2018-04-26 04:07:10
文章来源:如何编写SQL注入验证PL/SQL
区分编译时固定SQL语句文本和运行时创建SQL语句文本。 我们定义了编译时固定的SQL语句文本,它是指在运行时不能更改的SQL语句的文本,它可以通过读取源代码来确定。更确切地说,它是SQL语句的文本,即PL/SQL静态varchar2 expression14。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;
运行时创建的SQL
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;
https://stackoverflow.com/questions/50034563
复制相似问题