我是plpgsql的新手,看起来很困惑。我想测试quote_literal对SQL注入攻击的抵抗力,所以我尝试使用INSERT。我也不是SQL注入攻击方面的专家,我只是尝试重新创建我看到的示例。
如果我在代码中使用quote_literal,如下所示,名称将用'保存。因此,我调用select __a_inj('hey');,然后保存'hey'。不是hey。
另一方面,如果我调用select __a_inj('drop table deleteme');,不管我是否使用quote_literal,我总是得到保存的'drop table deleteme'。
CREATE FUNCTION __a_inj(creator text) RETURNS integer
AS $query$
DECLARE ii ALIAS FOR $1;
BEGIN
INSERT INTO deleteme(name) VALUES(quote_literal($1)) RETURNING id into ii;
return ii;
END;
$query$
LANGUAGE plpgsql;我应该如何使用quote_literal或任何其他函数来防御SQL注入攻击,而不是把事情搞砸?
)一些困扰我的事情
为什么插入的示例如此之少?
为什么我不能在插入时使用EXECUTE?无论我的语法如何,我总是收到错误)
发布于 2018-01-25 20:31:54
您不需要:
t=# \sf __a_inj (text)
CREATE OR REPLACE FUNCTION postgres.__a_inj(creator text)
RETURNS integer
LANGUAGE plpgsql
AS $function$
DECLARE ii ALIAS FOR $1;
BEGIN
INSERT INTO deleteme(name) VALUES(creator) RETURNING id into ii;
return ii;
END;
$function$
t=# select __a_inj('null);drop table deleteme');
__a_inj
---------
(1 row)
t=# select * from deleteme ;
name | id
---------------------------+----
null);drop table deleteme |
(1 row)https://stackoverflow.com/questions/48442696
复制相似问题