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 に答える