我正在跟踪Node.js,并在W3schools上使用了sql示例。这里
它说,下面的代码防止SQL注入。
var adr = 'Mountain 21';
var sql = 'SELECT * FROM customers WHERE address = ' + mysql.escape(adr);
con.query(sql, function (err, result) {
if (err) throw err;
console.log(result);
});当查询值是用户提供的变量时,您应该避免使用values.This来防止SQL注入,这是一种常见的网络黑客技术,用于破坏或滥用您的数据库。
这就是解释。
我想知道这有多安全。(这如何防止SQL注入)。
另外,下面的代码是如何危险的?
var sql = 'SELECT * FROM customers WHERE address = "Mountain 21"';
发布于 2019-04-29 02:13:49
如果注入的值(例如,“21山”)来源于不受控制的外部来源。例如,它由用户输入。
考虑一个简单的字符串连接,如下所示:
var adr = <something accepted from an external source>
var sql = `SELECT * FROM customers WHERE address = "${adr}"`;然后考虑如果用户在文本字段中输入以下内容,可能会发生什么情况:
Mountain 21"; delete all from customers; //查询将变成:从客户处选择*;从其中地址为“山区21";从客户中删除所有;//
如果您运行该程序,您可能最终将没有客户在您的桌子。
我本人并不熟悉node.js mysql.escape函数的操作,但通常情况下,这类函数会“转义”特殊字符,从而失去它们的“特殊性”。例如,它可能将一个\放在;前面,以删除它作为语句分隔符的重要性。
转义函数通常要做的另一个更常见的例子是将"O'Brien“这样的文本转换为"O'Brien”(两个单引号是在SQL文本字符串中指定单引号的方式)。
select *
from customers
where name = 'O''Brien';几乎可以肯定的是,mySql.escape函数将提供将"O'Brien“转换为”O‘Brien“的必要转换,以便在SQL查询中正确运行。如果没有转义,查询的最后一行将为:
where name = 'O'Brien';这将导致语法错误。
最安全的方法是使用吗?查询用户提供的值(例如地址)中的占位符。这有点麻烦,因为您需要准备查询,提供所有的值,然后执行它。然而,好处是这是(应该是?)对大多数(如果不是全部)“注射攻击”的形式完全免疫。
按照您的示例,参数化查询的基本流程是(用java‘is伪代码-因为我不涉及node.js在这方面的功能)是:
val sql = "SELECT * FROM customers WHERE address = ?";
val preparedStatement = conn.prepareStatement(sql);
preparedStatement.setString (1, adr);
val resultSet = preparedStatement.executeQuery();大多数(如果不是所有的数据库都支持参数化查询),大多数语言都公开这种功能,但并不是所有的语言都公开它(或者至少不容易)。再说一次,我对node.js不太确定。
希望这能帮到你。
发布于 2019-04-29 01:47:19
var adr = 'Mountain 21';
var sql = `SELECT * FROM customers WHERE address = "${mysql.escape(adr)}"`;
con.query(sql, function (err, result) {
if (err) throw err;
console.log(result);
});var sql = 'SELECT * FROM customers WHERE address = Mountain 21';
至
var sql = 'SELECT * FROM customers WHERE address = "Mountain 21"';
https://stackoverflow.com/a/33679883/11343720
Grave accent is better quote,double quote
https://stackoverflow.com/questions/55896056
复制相似问题