【发布时间】:2019-12-14 09:36:38
【问题描述】:
我对节点相当陌生,并且在使用 sqlstring 进行动态参数化查询时遇到问题。
以下代码的问题是过滤器是可选的,具体取决于用户传递给函数的内容,因此它们的顺序可以改变(很难单独传递每个过滤器参数)。据我所知,Sqlstring 使用顺序来确定哪些参数与正确的问号匹配。
所以我只剩下一次将所有过滤器传递给 Sqlstring,但如果没有过滤器处于活动状态,那么我只剩下一个用于过滤器变量的空字符串,这将引发 sql 语法错误。
let filter = idList !== '' ? ` AND id IN(${idList})` : '';
filter += locationsList !== '' ? ` AND a.locationID IN(${locationsList})` : '';
filter += start !== undefined ? ` AND a.lastEdited >= ${start}` : '';
filter += end !== undefined ? ` AND a.lastEdited <= ${end}` : '';
filter += name !== undefined ? ` AND a.name LIKE '%${name}%'` : '';
const qry = `
SELECT
a.id 'id'
,a.number 'number'
,a.name 'name'
,a.locationID 'locationID'
,a.location 'location'
,a.lastEdited 'lastEdited'
,a.userID 'owner'
FROM tbl_foo_${'?'} a
WHERE a.id > ${'?'} ${'?'} LIMIT ${'?'};`;
let values = [ id, cursor, filter, limit ];
const rows = query(db, qry, values);
//inside of the query function it does this and then runs the query against the database
if (qry.includes('?')) {
sanitizedQry = sqlstring.format(qry, values);
}
它产生的查询如下所示:
SELECT
a.id 'id'
,a.number 'number'
,a.name 'name'
,a.locationID 'locationID'
,a.location 'location'
,a.lastEdited 'lastEdited'
,a.userID 'owner'
FROM tbl_foo_36 a
WHERE a.id > 1 '' LIMIT 100;
有没有更好的方法来做到这一点?
【问题讨论】:
-
SQL 表/结果集按照 SQL 标准定义是 orderless,因此使用
LIMIT而不使用ORDER BY a.id(假设这里的 id 有一个 PRIMARY KEY)来获得第一个匹配100 条记录几乎毫无意义。
标签: javascript mysql node.js sql-injection