节点和SQL注入在查询字符串上使用${variable}



我被告知在一个问题上,我有一个SQL注入问题。

问题在这里

Node with SQL Server - response with for json路径查询没有响应

这是我的代码

let sqlString = `
SELECT        codeid, code, validFrom, validTo,
(SELECT        dbo.PLprospectAgentCodesComp.productIdentifier, dbo.masterGroupsProducts.productName, dbo.PLprospectAgentCodesComp.compensation
FROM            dbo.PLprospectAgentCodesComp INNER JOIN
dbo.masterGroupsProducts ON dbo.PLprospectAgentCodesComp.productIdentifier = dbo.masterGroupsProducts.productIdentifier
WHERE        (dbo.PLprospectAgentCodesComp.codeid = dbo.PLprospectAgentCodes.codeid) for json path ) as products
FROM            dbo.PLprospectAgentCodes
WHERE        (plid = ${userData.plid}) for json path`

let conn = await sql.connect(process.env.DB_CONNSTRING)
let recordset = await conn.query(sqlString)

但是我在微软,甚至在这个网站的一个问题上读到,这种格式可以防止SQL注入。

从女士:

"所有值都自动针对sql注入进行清理。这是因为它是作为预备语句呈现的,因此一切都有限制在MS SQL中强加的参数适用。列名不能是使用变量传入/设置语句。">

我试图使用声明@参数为上述代码,但由于我的代码有几个查询依赖于另一个,我使用等待每个查询…@parameter不起作用。处理完记录集后,将执行其他查询。

如果我的代码实际上对SQL注入是危险的,是否有可能在以下两行之前清理sqlString ?我问这个问题的原因是不要在大约50个路由中改变方法。

let sqlString = `select * from table where userid=${userId}`

清理这里的代码

let conn = await sql.connect(process.env.DB_CONNSTRING)
let recordset = await conn.query(sqlString)

谢谢。

根据https://tediousjs.github.io/node-mssql/,"所有值都自动针对sql注入进行清理"。仅当您使用ES6 Tagged模板字面值时适用。您应该在模板字符串之前添加标记sql.query

let sqlString = sql.query`select * from mytable where id = ${value}`

有关标记模板文字的更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals#tagged_templates

最新更新