我有一个通用的API调用,我想在我的数据库中的不同表中使用它。这是SQL查询
SELECT * FROM $column_name WHERE step != Failed
我想这样做,通过做这样的事情来避免sql注入的可能性
var type = req.params.type;
var sql = 'SELECT * FROM ? WHERE step != FALSE';
postgres.client.query(sql, [ type ], function(err, results) {}
这不起作用,并抛出语法错误。我做了一些探测并尝试做1美元,而不是?但没有任何效果。我确实验证了类型变量是正确的值。
当我运行时,
var type = req.params.type;
var sql = 'SELECT * FROM ' + type + ' WHERE step != FALSE';
postgres.client.query(sql, [ type ], function(err, results)
工作正常。这是什么交易??
答案 0 :(得分:1)
据我了解,您使用node-postgres(别名:pg
)模块。
对于该模块,没有?
或??
替换。
您使用$N
表示法,但pg驱动程序不允许使用动态表名。
所以这里的解决方法:
1)创建constants/tableNames.js
文件,其中包含要使用的允许表名列表:
module.exports = [
'users',
'profiles',
... and etc tables that You have
];
2)使用以下内容创建db/queries/selectFromTable.js
,该内容将负责使用允许的表名中的检查表名来生成查询:
const tableNames = require('../../constants/tableNames.js');
module.exports = (tableName, queryTail = 'WHERE step != FALSE') => {
if (tableNames.includes(tableName)) {
return 'SELECT * FROM '+tableName+' '+queryTail;
}
return 'SELECT NULL';
};
3)并在您的代码中使用它,例如:
const selectFrom = require('db/queries/selectFromTable.js');
app.get('/records/:table', async (req, res) => {
try {
const table = req.params.table;
const query = selectFrom(table);
const result = await postgres.client.query(query, []);
res.status(200).send(result.rows);
/**
* OR:
* const table = req.params.table;
* const something = req.query.something;
* const query = selectFrom(table, 'WHERE step != FALSE AND something = $1::text');
* const result = await postgres.client.query(query, [something]);
* res.status(200).send(result.rows);
*/
}
catch (error) {
res.status(500).send(error);
}
});