给定以下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我认为我已经正确地实现了它

最佳答案

这段代码做不到你想要的。
$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);

关于postgresql - 不确定100%是否安全,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58269459/

10-16 23:06