我是plpgsql
的新手,看起来很混乱。我想测试quote_literal
对SQL注入攻击的强度,所以我尝试INSERT
。我也不是SQL注入攻击的专家,我只是尝试重新创建我看到的例子。
如果我在我的代码中使用quote_literal
,如下所示,名称将与'
一起保存。所以,我打电话给select __a_inj('hey');
然后'hey'
被保存。不是hey
。
另一方面,如果我调用select __a_inj('drop table deleteme');
,我总是得到'drop table deleteme'
,无论我是否使用quote_lite。
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
插入。无论我的语法如何,我都会一直收到错误)
你没有:
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)