带有 IN 和 AND 的 NodeJS SQLite3 准备语句
NodeJS SQLite3 prepared statement with IN and AND
我在 Express 中有此 API 设置,但我不知道如何使用 node.js 中的 SQLite3 使用 IN 语句正确准备语言过滤器。
第一个查询正确应用了语言过滤器。我得到了正确的结果,但这可能会造成 sql 注入风险。
由于语言过滤器,第二个查询找不到结果。
如何正确设置 db.prepare 语句以接受单词和语言?
app.post('/api/languages/:language/getTextWords', (req, res) => {
let words = req.body.map(word => word.toLowerCase())
let wordMap = words.map(() => "?").join(',')
let language = req.params.language.toLowerCase();
// the language filter is applied correctly I get results but the statement is not fully prepared
// let query = db.prepare(`SELECT * FROM words WHERE word IN (${wordMap}) AND language = '${language}'`, words)
// no results are found because of the language filter
let query = db.prepare(`SELECT * FROM words WHERE word IN (${wordMap}) AND language = '?'`, words, language)
query.all((err, rows) => {
if (err) {
res.status(500).send(err.message)
throw err;
}
if (!rows) {
res.json([])
}
if (rows) {
res.json(rows)
}
})
})
这是有问题的数据库 table 的屏幕截图:
words table
将值作为数组传递:
let query = db.prepare(`SELECT * FROM words WHERE word IN (${wordMap}) AND language = ?`, [...words, language]);
我在 Express 中有此 API 设置,但我不知道如何使用 node.js 中的 SQLite3 使用 IN 语句正确准备语言过滤器。
第一个查询正确应用了语言过滤器。我得到了正确的结果,但这可能会造成 sql 注入风险。
由于语言过滤器,第二个查询找不到结果。
如何正确设置 db.prepare 语句以接受单词和语言?
app.post('/api/languages/:language/getTextWords', (req, res) => {
let words = req.body.map(word => word.toLowerCase())
let wordMap = words.map(() => "?").join(',')
let language = req.params.language.toLowerCase();
// the language filter is applied correctly I get results but the statement is not fully prepared
// let query = db.prepare(`SELECT * FROM words WHERE word IN (${wordMap}) AND language = '${language}'`, words)
// no results are found because of the language filter
let query = db.prepare(`SELECT * FROM words WHERE word IN (${wordMap}) AND language = '?'`, words, language)
query.all((err, rows) => {
if (err) {
res.status(500).send(err.message)
throw err;
}
if (!rows) {
res.json([])
}
if (rows) {
res.json(rows)
}
})
})
这是有问题的数据库 table 的屏幕截图: words table
将值作为数组传递:
let query = db.prepare(`SELECT * FROM words WHERE word IN (${wordMap}) AND language = ?`, [...words, language]);