在plpgsql中插入时使用quote_literal

问题描述 投票:1回答:1

我是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插入。无论我的语法如何,我都会一直收到错误)

postgresql prepared-statement sql-injection plpgsql
1个回答
2
投票

你没有:

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)
© www.soinside.com 2019 - 2024. All rights reserved.