首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在plpgsql中插入时使用quote_literal

在plpgsql中插入时使用quote_literal
EN

Stack Overflow用户
提问于 2018-01-25 20:18:00
回答 1查看 891关注 0票数 1

我是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'

代码语言:javascript
复制
 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?无论我的语法如何,我总是收到错误)

EN

回答 1

Stack Overflow用户

发布于 2018-01-25 20:31:54

您不需要:

代码语言:javascript
复制
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)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48442696

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档