node.js - 将输入参数传递给节点 mssql 查询函数
问题描述
我正在使用 Node.js 服务器向 Azure sql 数据库发出请求。
据我了解,以下功能不会阻止 sql 注入:
当前代码:(工作但不安全)
var executeQuery = async function(query, response) {
const pool = new sql.ConnectionPool(dbConfig)
pool.on('error', err => {
console.log('sql errors', err);
});
try {
await pool.connect();
let result = await pool.request().query(query);
response.send(result.recordset);
return {success: result}
} catch (err) {
return {err: err};
} finally {
console.log('request complete')
pool.close(); // closing connection after request is finished
}
};
app.get("/api/workOrders/byId/:workOrderId", function(req, res) {
console.log(req.params);
var query = "SELECT * FROM [WorkOrder] WHERE [idWorkOrder]=" + req.params.workOrderId;
executeQuery(query, res);
});
我想让 executeQuery 函数独立,但我还没有找到答案。无论如何,这是我从 mssql 文档构建的代码:
新代码(不工作)
app.get("/api/test/:workOrderId", function(req, res) {
console.log(req.params.workOrderId);
(async function() {
const pool = new sql.ConnectionPool(dbConfig)
pool.on('error', err => {
console.log('sql errors', err);
});
try {
await pool.connect();
let result = await pool.request()
.input('input_parameter', sql.VarChar(50), req.params.workOrderId)
.query('SELECT * FROM [Quotation] WHERE [idWorkOrder]= @input_parameter');
console.log(result);
res.send(result.recordset);
return {success: result}
} catch (err) {
return {err: err};
} finally {
console.log('request complete')
pool.close(); // closing connection after request is finished
}
});
})
这个版本应该是防注入的,但它不返回任何东西。是否可以像当前代码一样将输入值传递给 executeQuery 函数?
解决方案
您可以将值传递req.params.workOrderId
给异步函数,然后在内部使用该值。检查以下代码。
app.get("/api/test/:workOrderId", function(req, res) {
console.log(req.params.workOrderId);
(async function(workOrderId) {
const pool = new sql.ConnectionPool(dbConfig)
pool.on('error', err => {
console.log('sql errors', err);
});
try {
await pool.connect();
let result = await pool.request()
.input('input_parameter', sql.VarChar(50), workOrderId)
.query('SELECT * FROM [Quotation] WHERE [idWorkOrder]= @input_parameter');
console.log(result);
res.send(result.recordset);
return {success: result}
} catch (err) {
return {err: err};
} finally {
console.log('request complete')
pool.close(); // closing connection after request is finished
}
})(req.params.workOrderId); // <===pass value to the function
})
推荐阅读
- php - 如何使用 OAuth 协议连接到 Google My Business API?
- javascript - 从字符串数组中,使用组件以不同的样式呈现字符串数组的某些索引
- reactjs - 为什么 React 组件在状态不变的情况下只重新渲染一次?
- typescript - 根据环境的动态角色
- opencv - 在 WSL2 中调整 vcXsrv 窗口的大小
- python - 您可以通过从 PyPI [WINDOWS] 安装“psycopg2-binary”来安装二进制包
- c++ - Fake Function Framework - 如何伪造标记为 __declspec(dllimport) 的函数并避免不一致的 DLL 链接?
- python - 确定总体时间序列模型改进百分比
- typescript - Vue双重绑定(或prop内的prop)
- python - 如何从列表或系列创建可变深度字典