gpt4 book ai didi

sql - 在sqlite3中参数化 'limit'和 'order'

转载 作者:太空宇宙 更新时间:2023-11-04 01:03:08 25 4
gpt4 key购买 nike

我有一个 sqlite 查询,我正在研究参数化以避免互联网上出现错误的 sql 注入(inject)...

所以像这样的事情:

Select * From myTable Where id = $id

如果我在某处定义了 $id 并将其作为参数传递给我的数据库调用,那就没问题了。

paramters.$id = 150;

db.all(myQuery, parameters, function (err, rows) {
results = rows;
});

我想知道我是否需要特意参数化已排序和分页的内容(两者都是用户可以提供的输入)...

我尝试做类似的事情:

    var sorter = JSON.parse(value);
parameters.$sortMethod = sorter.method;
parameters.$sortOrder = sorter.order;
sort_filter += 'ORDER BY $sortMethod $sortOrder';

不过没有骰子。我猜 sqlite3 只是不允许你参数化 ORDER、LIMIT 和 OFFSET 中的东西。我认为有一些非常狡猾的事情,也许人们可以通过按顺序提前结束 SQLite 语句然后创建一个新的恶意语句来完成,但也许 SQLITE3 一次只允许您执行一个语句( http://www.qtcentre.org/threads/54748-Execute-multiple-sql-command-in-SQLITE3 )

我是否应该担心参数化顺序限制和偏移量?作为引用,我使用这个 sqlite 库在 node.js 上运行它:https://github.com/mapbox/node-sqlite3

提前致谢!

最佳答案

SQLite(以及任何其他数据库)允许您参数化表达式,即语句中出现的任何数字、字符串、blob 或 NULL 值。这包括 LIMIT/OFFSET 子句中的

任何其他内容都无法参数化。这可以是表名和列名、运算符或任何其他关键字(例如 SELECT、ORDER BY 或 ASC)。

如果您需要更改 SQL 语句中非表达式的任何部分,则必须动态创建该语句。(只要您的代码自行构造语句,而不使用任何未经检查的用户数据,就不存在 SQL 注入(inject)的危险。)

关于sql - 在sqlite3中参数化 'limit'和 'order',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25374386/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com