使用 LIKE 构建查询是否安全,不受 SQL 注入的影响?
Is building a query using LIKE safe from SQL Injection?
我的 Express 应用程序中有一个端点可以接受 POST 数据 (json)。我想使用这些数据安全地查询 MySQL 数据库。转义和更改我的字符串会让我容易受到攻击吗?
我需要更改来自请求的字符串,因为我不想在 LIKE 子句的结束单引号之前插入“%”。
var searchTerm = mysql.escape(req.body.firstName)
var newStr = "'" + searchTerm.substring(1, searchTerm.length - 1) + "%'"
// Example: 'alex' => 'alex%'
我的查询是:
SELECT * FROM tbl WHERE col LIKE " + newStr + " ORDER BY key
这行得通,但是否有更好或更安全的方法?
供参考:
- 我正在使用我正在使用这个包:https://github.com/felixge/node-mysql
UPDATE/ANSWER
根据 EternalHour 的回答,正确的语法是:
var newStr = req.body.firstName + "%"
var sql = "SELECT cols FROM tbl WHERE col LIKE ? ORDER BY key"
sql = mysql.format(sql, newStr)
尝试直接使用下面的 newStr(不要明确添加 %):
SELECT * FROM tbl WHERE col LIKE '" + newStr + "%' ORDER BY key
你应该通过 Prepared Statement
:
C#:
//Creates new SQL Command with parameter @newStr
var command = new SqlCommand( "SELECT * FROM tbl WHERE col LIKE '@newStr' ORDER BY key", db);
//Set paramater @newStr to 40 characters
command.Parameters.Add("@newStr", SqlDbType.VarChar, 40);
//Prepares the statement, after all parameters are defined
command.Prepare();
//Set Parameter @newStr to "newStrValue"
command.Parameters["@newStr"] = "newStrValue";
//Executes the Command
command.Execute();
对于 Node.js,有一个支持准备语句的包:
https://www.npmjs.com/package/mysql2
使用 Prepared Statements
,SQL Injection
将永远不会发生,因为数据库知道这是用户输入而不是 SQL 命令。
正如 Christian 所建议的(在不同的编程语言中),使用准备好的语句是最安全的选择。看起来您需要重新格式化字符串以删除单引号(因为准备好的语句通常会自动转义)。看来这个图书馆也不例外。
对这个库不熟悉,不过好像会是这样:
var query = "SELECT * FROM tbl WHERE col LIKE ? ORDER BY key";
var newStr = searchTerm.substring(1, searchTerm.length - 1) + "%";
sql = mysql.format(query, newStr);
附带说明一下,尽量不要在 SQL select 语句中使用 *
。
我的 Express 应用程序中有一个端点可以接受 POST 数据 (json)。我想使用这些数据安全地查询 MySQL 数据库。转义和更改我的字符串会让我容易受到攻击吗?
我需要更改来自请求的字符串,因为我不想在 LIKE 子句的结束单引号之前插入“%”。
var searchTerm = mysql.escape(req.body.firstName)
var newStr = "'" + searchTerm.substring(1, searchTerm.length - 1) + "%'"
// Example: 'alex' => 'alex%'
我的查询是:
SELECT * FROM tbl WHERE col LIKE " + newStr + " ORDER BY key
这行得通,但是否有更好或更安全的方法?
供参考:
- 我正在使用我正在使用这个包:https://github.com/felixge/node-mysql
UPDATE/ANSWER
根据 EternalHour 的回答,正确的语法是:
var newStr = req.body.firstName + "%"
var sql = "SELECT cols FROM tbl WHERE col LIKE ? ORDER BY key"
sql = mysql.format(sql, newStr)
尝试直接使用下面的 newStr(不要明确添加 %):
SELECT * FROM tbl WHERE col LIKE '" + newStr + "%' ORDER BY key
你应该通过 Prepared Statement
:
C#:
//Creates new SQL Command with parameter @newStr
var command = new SqlCommand( "SELECT * FROM tbl WHERE col LIKE '@newStr' ORDER BY key", db);
//Set paramater @newStr to 40 characters
command.Parameters.Add("@newStr", SqlDbType.VarChar, 40);
//Prepares the statement, after all parameters are defined
command.Prepare();
//Set Parameter @newStr to "newStrValue"
command.Parameters["@newStr"] = "newStrValue";
//Executes the Command
command.Execute();
对于 Node.js,有一个支持准备语句的包:
https://www.npmjs.com/package/mysql2
使用 Prepared Statements
,SQL Injection
将永远不会发生,因为数据库知道这是用户输入而不是 SQL 命令。
正如 Christian 所建议的(在不同的编程语言中),使用准备好的语句是最安全的选择。看起来您需要重新格式化字符串以删除单引号(因为准备好的语句通常会自动转义)。看来这个图书馆也不例外。
对这个库不熟悉,不过好像会是这样:
var query = "SELECT * FROM tbl WHERE col LIKE ? ORDER BY key";
var newStr = searchTerm.substring(1, searchTerm.length - 1) + "%";
sql = mysql.format(query, newStr);
附带说明一下,尽量不要在 SQL select 语句中使用 *
。