使用 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

这行得通,但是否有更好或更安全的方法?

供参考:

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 StatementsSQL 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 语句中使用 *