Node MSSQL - 如何使用内置的 SQL 注入保护

Posted

技术标签:

【中文标题】Node MSSQL - 如何使用内置的 SQL 注入保护【英文标题】:Node MSSQL - How to use the built in SQL injection protection 【发布时间】:2016-08-18 20:04:07 【问题描述】:

我正在查看 Node 的 MSSQL 模块中内置的 SQL 注入保护:

https://www.npmjs.com/package/mssql#injection

但我并没有完全了解他们如何为我的查询清理值的示例。我猜request.input('myval', sql.VarChar, '-- commented') 语句会针对被注释掉的其余查询清理“myvar”。

如果我也想针对其他东西进行消毒怎么办?比如drop table语句等。

谁能帮帮我?

【问题讨论】:

凹凸。帮助任何人? :) 为什么还要尝试实施黑名单?这是一场失败的战斗……输入验证应该使用白名单方法来实现。如果您仍然坚持将黑名单作为一种附加防御机制,请不要尝试自己实现,使用 Imperva、F5 或 ModSecurity(免费)等 WAF,或者如果您想实现它在数据库级别,使用数据库防火墙(Sentrigo 或 GreenSQL-hexatier)。 【参考方案1】:

刚刚弄清楚如何工作。 request.input() 接受来自mssql docs 的以下三个参数:

input(name, [type], value) 为请求添加输入参数。

参数

name - 不带@字符的输入参数的名称。

type - 输入参数的 SQL 数据类型。如果省略类型,模块 根据 JS 自动决定应该使用哪种 SQL 数据类型 数据类型。

value - 输入参数值。 undefined ans NaN 值是 自动转换为空值。

所以你使用它的方式如下;

let id= 123456
const stmt = 'SELECT * FROM Users WHRE User=@userId'
request.input('userId', sql.Int, id);
request.query(stmt)

注意:

id 是保存我的值的变量,用作request.input(name, type, value) 中的第三个参数。 userId 只是我为将在使用@userId 的sql 语句中使用的变量指定的名称。在request.input()中,id值在sql语句中赋值给userId。 最后sql.Int 只是一种数据类型,用于验证进入userId 的日期。您可以通过在同一文件中导入 sql 来使用它:const sql = require('mssql')

【讨论】:

以上是关于Node MSSQL - 如何使用内置的 SQL 注入保护的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在没有准备好的语句(Node.js 和 MSSQL)的情况下防止 SQL 注入

节点红、树莓派和 MSSQL

Node JS、Express、MSSQL、Socket IO

由于 SQL Server 2019 Linux 中的错误,需要 node-mssql GET 请求中的解决方法两语句查询(DECLARE;SELECT)

在 Node.js (React) 中更改为不同的页面/组件时如何运行不同的 SQL 函数?

nodejs mssql中的SQL Server连接超时错误