首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在sql中“转义查询值”是如何安全的?(或者为什么它是危险的?)[SQL注入]

在sql中“转义查询值”是如何安全的?(或者为什么它是危险的?)[SQL注入]
EN

Stack Overflow用户
提问于 2019-04-29 01:44:06
回答 2查看 2.1K关注 0票数 1

我正在跟踪Node.js,并在W3schools上使用了sql示例。这里

它说,下面的代码防止SQL注入。

代码语言:javascript
复制
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"';

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-29 02:13:49

如果注入的值(例如,“21山”)来源于不受控制的外部来源。例如,它由用户输入。

考虑一个简单的字符串连接,如下所示:

代码语言:javascript
复制
var adr = <something accepted from an external source>
var sql = `SELECT * FROM customers WHERE address = "${adr}"`;

然后考虑如果用户在文本字段中输入以下内容,可能会发生什么情况:

代码语言:javascript
复制
Mountain 21"; delete all from customers; //

查询将变成:从客户处选择*;从其中地址为“山区21";从客户中删除所有;//

如果您运行该程序,您可能最终将没有客户在您的桌子。

我本人并不熟悉node.js mysql.escape函数的操作,但通常情况下,这类函数会“转义”特殊字符,从而失去它们的“特殊性”。例如,它可能将一个\放在;前面,以删除它作为语句分隔符的重要性。

转义函数通常要做的另一个更常见的例子是将"O'Brien“这样的文本转换为"O'Brien”(两个单引号是在SQL文本字符串中指定单引号的方式)。

代码语言:javascript
复制
select *
from customers
where name = 'O''Brien';

几乎可以肯定的是,mySql.escape函数将提供将"O'Brien“转换为”O‘Brien“的必要转换,以便在SQL查询中正确运行。如果没有转义,查询的最后一行将为:

代码语言:javascript
复制
where name = 'O'Brien';

这将导致语法错误。

最安全的方法是使用吗?查询用户提供的值(例如地址)中的占位符。这有点麻烦,因为您需要准备查询,提供所有的值,然后执行它。然而,好处是这是(应该是?)对大多数(如果不是全部)“注射攻击”的形式完全免疫。

按照您的示例,参数化查询的基本流程是(用java‘is伪代码-因为我不涉及node.js在这方面的功能)是:

代码语言:javascript
复制
val sql = "SELECT * FROM customers WHERE address = ?";
val preparedStatement = conn.prepareStatement(sql);
preparedStatement.setString (1, adr);
val resultSet = preparedStatement.executeQuery();

大多数(如果不是所有的数据库都支持参数化查询),大多数语言都公开这种功能,但并不是所有的语言都公开它(或者至少不容易)。再说一次,我对node.js不太确定。

希望这能帮到你。

票数 12
EN

Stack Overflow用户

发布于 2019-04-29 01:47:19

代码语言:javascript
复制
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 quotedouble quote

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55896056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档