4

在以下示例中,我构建了一个查询以对 MySQL 数据库进行批量插入:

const string QUERY = "INSERT INTO contacts (first_name,last_name) VALUES{0};";

public string BuildQuery(IEnumerable<contact> contacts)
{
    List<string> values = new List<string>();

    foreach (var contact in contacts)
    {
        values.Add(string.Format("('{0}','{1}')", contact.first_name, contact.last_name));
    }

    return string.Format(QUERY, string.Join(",", values));
}

结果可能如下所示:

INSERT INTO contacts (first_name,last_name) VALUES("J","Kappers"),("A","Temple")

我可以做些什么来编写一个不易发生 SQL 注入的更安全的查询?

4

2 回答 2

1
const string QUERY = "INSERT INTO contacts (first_name,last_name) VALUES" + 
                      BuildQuery(c, contacts);

public string BuildQuery(MySQLCommand c, IEnumerable<contact> contacts)
{
    List<string> values = new List<string>();
    string query = null;
    int i = 0;
    foreach (var contact in contacts)
    {
       i++;
       query += "(@firstName" + i + ", @lastName" + i + ")";
       c.Parameters.AddWithValue("@firstName" + i, contact.first_name);
       c.Parameters.AddWithValue("@lastName" + i, contact.last_name);

       if(i < contacts.Count) 
          query += ",";
    }

    return query
}

你可以在这里看到一个相关的线程!。我一定错过了一些琐碎的事情,但这对你来说是微不足道的。当然你知道contacts没有元素时会发生什么。我没有看到更多的边缘情况。顺便说一句,请注意,您可以添加多少此类参数,具体取决于 mysql 允许的最大数据包大小。您可以更改它,或注意不超过该限制。干杯! :)

于 2012-06-25T13:56:05.840 回答
-1

您可以使用与普通 SQL 命令几乎相同的方式转义 MySQL 命令参数。这是官方 MySQL 手册中的示例

 private void PrepareExample()
 {
     MySqlCommand cmd = new MySqlCommand("INSERT INTO mytable VALUES (?val)", myConnection);
     cmd.Parameters.Add( "?val", 10 );
     cmd.Prepare();
     cmd.ExecuteNonQuery();

     cmd.Parameters[0].Value = 20;
     cmd.ExecuteNonQuery();
 }

PS 无论您选择什么 -从不使用用户字符串操作向 SQL 命令添加/插入参数。这是 SQL 注入攻击的主要来源

于 2012-06-25T13:34:42.263 回答