给定以下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/