当查询长度未知时如何向查询添加参数

问题描述 投票:1回答:2

我正在一个需要将多行添加到MySQL表的项目中,由于连接的高延迟,我试图在一个命令中添加所有值以节省时间。

到目前为止,我有一个由字符串数组(每个字符串是一个“令牌”)确定的SQL查询,这是通过foreach循环完成的,该循环在插入查询上添加了一个值,但是,此方法是由于无法找到添加命令参数的方法,因此很难防止SQL注入。我不熟悉其他防止注射的方法,但是有新的想法。

query = "INSERT INTO tokenlist(token, user_id) VALUES";
foreach (string tok in tokens)
{
    query += " ('" + tok + "', " + logedinId + "),";
}

if (query != "INSERT INTO tokenlist(token, user_id) VALUES")
{
    query = query.Remove(query.Length - 1);
    query += ";";
    if (OpenConnection() == true) {
        MySqlCommand cmd = new MySqlCommand(query, mysqlcon);
        cmd.ExecuteNonQuery();
        CloseConnection();
    }
}
c# mysql sql sql-injection
2个回答
2
投票

使用SqlCommand.Parameters.Add。不要使用foreach,而要使用for,并在参数名称后添加数字"@tok" + i

https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlparametercollection.addwithvalue?view=netframework-4.8

只是示例代码示例,我没有尝试:

var tokens = new List<dynamic>() { new { tok = 1, logedinId = 2 }, new { tok = 1, logedinId = 2 } };
var query = "INSERT INTO tokenlist(token, user_id) VALUES";

SqlCommand cmd = new SqlCommand(query, new SqlConnection());

for (int i = 0; i < tokens.Count; i++)
{
    var tokName = $"@tok{i}";
    var logedinIdName = $"@logedinId{i}";
    var token = tokens[i];
    query += $" ({tokName}, {logedinIdName}),";
    cmd.Parameters.Add(new SqlParameter(tokName, SqlDbType.Int)).Value = token.tok;
    cmd.Parameters.Add(new SqlParameter(logedinIdName, SqlDbType.Int)).Value = token.logedinId;
}

if (tokens.Any())
{
    query = query.Remove(query.Length - 1);
    query += ";";

    cmd.ExecuteNonQuery();
}

0
投票
var sql = "INSERT INTO tokenlist(token, user_id) VALUES(@token, @user_id)";
using var cmd = new MySqlCommand(sql, con);
cmd.Parameters.AddWithValue("@token", "tkn");
cmd.Parameters.AddWithValue("@user_id", 3);
cmd.Prepare();
cmd.ExecuteNonQuery();

尝试添加这样的参数。 +您将避免sql注入

© www.soinside.com 2019 - 2024. All rights reserved.