Postgresql 在plpgsql中插入时使用quote_literal

Postgresql 在plpgsql中插入时使用quote_literal,postgresql,prepared-statement,sql-injection,plpgsql,Postgresql,Prepared Statement,Sql Injection,Plpgsql,我是新来的plpgsql,看起来很困惑。我想测试quote\u literal抵御SQL注入攻击的能力,所以我尝试INSERT。我也不是SQL注入攻击方面的专家,我只是尝试重新创建我看到的示例 如果我在代码中使用quote_literal,如下所示,则名称将与一起保存。。因此,我调用select_uua_inj('hey')然后保存'hey'。不是嘿 另一方面,如果我调用选择u a_inj('drop table deleteme')无论是否使用quote\u文字,我总是保存'drop tabl

我是新来的
plpgsql
,看起来很困惑。我想测试
quote\u literal
抵御SQL注入攻击的能力,所以我尝试
INSERT
。我也不是SQL注入攻击方面的专家,我只是尝试重新创建我看到的示例

如果我在代码中使用
quote_literal
,如下所示,则名称将与
一起保存。
。因此,我调用
select_uua_inj('hey')然后保存
'hey'
。不是

另一方面,如果我调用
选择u a_inj('drop table deleteme')
无论是否使用quote\u文字,我总是保存
'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注入攻击,而不是把事情搞砸

(一些让我烦恼的事情
为什么插入的例子这么少?
为什么我不能在insert中使用
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)

不,你不需要那个。您只需要在动态SQLyes中使用它,但输入是由用户进行的,因此默认情况下它可能是恶意的。对吗?不,与使用parameterfrom:
的方式不同,因为每个表达式和SQL命令都是在函数中首先执行的,PL/pgSQL解释器使用SPI管理器的SPI_prepare函数解析和分析该命令以创建一个准备好的语句。所以我被包括在内,因为这被翻译成一份准备好的声明?因为一开始我认为只有
格式
quote_literal/nullable
可以保护您,但您只需要那些具有
执行
的。我想这就是全部。如果我错了,请纠正我。谢谢,谢谢你的回答。那么,默认情况下,这个
insert
语法的字符串是否足以抵抗SQL注入-另外,我是一个noob,所以请详细说明一下
select\uu a\u inj('null');删除表“)零件。为什么使用这种语法?不是insert,而是在函数中使用一个参数,而不是像预处理语句那样使用动态SQL。。。语法正在演示SQL注入不起作用哦,好,酷。我认为这是动态的,因为输入是由用户完成的。那么什么是动态的
INSERT
?带有
INSERT
IF
EXECUTE
和用户输入的语法?带有
EXECUTE'INSERT blah…'