首页 > 解决方案 > 不是 100% 确定这是否安全

问题描述

鉴于以下 PostgreSQL 代码,我认为这段代码不容易受到 SQL 注入的影响:

_filter 'day'
_start 1
_end 10
_sort 'article_name'
_order 'ASC'

RETURN QUERY EXECUTE '
SELECT *
FROM articles a
WHERE article_name ILIKE ''%' || $1 || '%''
ORDER BY $4 ' || $5 || '
LIMIT ($3-$2) OFFSET $2'
USING _filter, _start, _end, _sort, _order;

但是我没有找到关于该USING子句与字符串结合的那么多文档。我确实在 DBA 上找到了这篇不错的文章(已接受的答案):https ://dba.stackexchange.com/questions/159424/how-to-use-function-parameters-in-dynamic-sql-with-execute我想我已正确实施

标签: postgresql

解决方案


这段代码不会做你想做的事。

$1将替换为第一个函数参数,而不是_filter.

此外,这对 SQL 注入开放。

这就是你想要的:

RETURN QUERY EXECUTE
   format(
      E'SELECT *\n'
      'FROM articles a\n'
      'WHERE article_name ILIKE %L\n'
      'ORDER BY %I %s\n'
      'LIMIT %s OFFSET %s',
      '%' || _filter || '%',
      _sort,
      _order,
      _end - _start,
      _start);

推荐阅读