Jin*_*Lee 0 mysql sql sql-injection node.js
我正在W3schools上使用SQL示例关注Node.js. 这里
它说下面的代码防止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);
});
Run Code Online (Sandbox Code Playgroud)
当查询值是用户提供的变量时,您应该转义这些值,以防止SQL注入,SQL注入是破坏或滥用数据库的常见Web黑客技术。
这就是解释。
我想了解这是多么安全。(这如何防止SQL注入)。
另外,以下代码危险吗?
var sql = 'SELECT * FROM customers WHERE address = "Mountain 21"';
如果注入的值(即“ Mountain 21”)来自不受控制的外部源,则未经保护的字符串串联生成SQL语句将很危险。例如,它由用户输入。
考虑如下的纯字符串连接:
var adr = <something accepted from an external source>
var sql = `SELECT * FROM customers WHERE address = "${adr}"`;
Run Code Online (Sandbox Code Playgroud)
然后考虑如果用户在文本字段中输入以下内容,将会发生什么情况:
Mountain 21"; delete all from customers; //
Run Code Online (Sandbox Code Playgroud)
查询将变为:SELECT * FROM customer where where address =“ Mountain 21”; 从客户中删除所有内容;//“
如果您执行此操作,最终可能会在表中没有客户。
我个人不熟悉node.js mysql.escape函数的操作,但是通常这些函数会“转义”特殊字符,因此它们失去了“特殊性”。例如,它可能在\前面放一个\。删除它作为语句分隔符的重要性。
转义功能通常会执行的另一个更常见的示例是将一段文本(例如“ O'Brien”转换为“ O” Brien”)(两个单引号是在SQL文本字符串中指定单引号的方式) 。使用“ O'Brien”名称的查询如下所示:
select *
from customers
where name = 'O''Brien';
Run Code Online (Sandbox Code Playgroud)
mySql.escape函数几乎肯定会提供“ O'Brien”到“ O''Brien”的必要转换,以便可以在SQL查询中正确运行。如果没有转义,查询的最后一行将显示为:
where name = 'O'Brien';
Run Code Online (Sandbox Code Playgroud)
这将导致语法错误。
FWIW,最安全的方法是使用?查询中用户提供的值(例如地址)中的占位符。这有点麻烦,因为您需要准备查询,提供所有值然后执行它。但是,好处是,这(应该是?)完全不受大多数(如果不是全部)“注射攻击”形式的影响。
按照您的示例进行参数化查询的基本流程是(在Java伪代码中-因为我不关心node.js在该领域的功能):
val sql = "SELECT * FROM customers WHERE address = ?";
val preparedStatement = conn.prepareStatement(sql);
preparedStatement.setString (1, adr);
val resultSet = preparedStatement.executeQuery();
Run Code Online (Sandbox Code Playgroud)
大多数(即使不是全部)数据库都支持参数化查询,大多数语言都公开了此功能,但并非所有语言都公开了此功能(或至少不容易实现)。同样,我不确定node.js。
我希望这可以帮助你。
| 归档时间: |
|
| 查看次数: |
145 次 |
| 最近记录: |