加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

PostgreSQL美元引用的字符串常量来防止SQL注入

发布时间:2020-12-13 15:55:42 所属栏目:百科 来源:网络整理
导读:我可以使用PostgreSQL的Dollar-Quoted字符串常量安全地阻止SQL注入吗? 我知道处理动态查询的最好方法是使用参数化查询在应用程序层中生成它们,这不是这个问题的内容.所有业务逻辑都在存储过程中. 我有一个存储过程,它接受参数并生成查询,运行它,格式化结果
我可以使用PostgreSQL的Dollar-Quoted字符串常量安全地阻止SQL注入吗?

我知道处理动态查询的最好方法是使用参数化查询在应用程序层中生成它们,这不是这个问题的内容.所有业务逻辑都在存储过程中.

我有一个存储过程,它接受参数并生成查询,运行它,格式化结果并将其作为一大块文本返回.此函数传递一个表名,列名和WHERE参数.传递给函数的WHERE参数来自用户在数据库中输入的数据.我想确保对stings进行清理,以便构建的查询是安全的.

使用PostgreSQLs Dollar-Quoted Strings Constants,我应该能够安全地清理除’$$’之外的所有字符串输入.但是,如果我在“$”上执行字符串替换以逃避它,我应该能够进行安全的字符串比较.

存储过程:

function_name(tablename text,colnames text[],whereparam text)
--Build dynamic query...

功能调用:

SELECT 
  function_name('tablename',ARRAY['col1','col2','col3'],'AND replace(col1,''$'',''/$'') =  $$' || replace(alt_string_col,'$','/$') || '$$')
FROM alttable
WHERE alt_id = 123;

查询生成:

SELECT col1,col2,col3 FROM tablename WHERE 1=1 AND replace(col1,'/$') =  $$un/safe'user /$/$data;$$

由于我在将其与转义的用户数据进行比较之前逃离了col1字段,即使用户输入了“un / safe’user $$data;”在字段alt_string_col中,双美元符号不会破坏查询并且比较通过.

这是一种在PostgreSQL存储过程中转义字符串的安全方法吗?

EDIT1

感谢Erwin Brandstetter.使用EXECUTE的USING子句我即将创建一个可以像这样调用的函数:

SELECT function_name(
        'tablename',ARRAY[' AND col1 =  $1 ',' OR col2 = $5 '],quote_literal(alt_string_col)::text,--Text 1-4
        NULL::text,NULL::text,alt_active_col::boolean,--Bool 1-4
        NULL::boolean,NULL::boolean,NULL::integer,--Int 1-4
        NULL::integer,NULL::integer
        )
FROM alttable 
WHERE alt_id = 123;

它为可以传入的WHERE子句提供了一些灵活性.

在存储过程中,我对EXECUTE语句有这样的东西.

FOR results IN EXECUTE(builtquery) USING 
    textParm1,textParm2,textParm3,textParm4,boolParm1,boolParm2,boolParm3,boolParm4,intParm1,intParm2,intParm3,intParm4
  LOOP
    -- Do some stuff
  END LOOP;

解决方法

在连接标识符时使用 quote_ident()来防止SQL注入.或Postseres 9.1或更高版本中的 format().

使用plpgsql代码中的USING clause for EXECUTE传递值.或者至少是quote_literal().

要确保存在表名(并且在连接时自动引用并进行模式限定),请使用special data type regclass.

有关使用plpgsql执行动态SQL的更多信息:

> PostgreSQL parameterized Order By / Limit in table function
> Table name as a PostgreSQL function parameter

从PostgreSQL 9.0开始,您还可以使用anonymous code blocks with the DO statement来执行动态SQL.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读