postgresql - 不是 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我想我已正确实施
解决方案
这段代码不会做你想做的事。
$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);
推荐阅读
- sql - 在过程中隐藏 SELECT 结果
- matlab - 在 arrayfun 调用中使用 set 设置 yaxis(1) 和 yaxis(2) 的属性
- visual-studio-2013 - 排除 Visual Studio Web 部署项目中的文件夹以及所有子文件夹和文件
- django - Django 模型 - CharField 作为其他字段的串联
- android - android共享首选项不起作用
- php - 试图获取非对象的属性“用户”
- c# - wpf - notifyIcon - 鼠标事件 - 识别鼠标按钮
- sql - 在 BigQuery 中合并行忽略空值
- android - 如何同步从 LiveData 中获取价值?
- vba - 只退出 1 个 for 循环而不是另一个