0

新しいレコードを挿入するこの関数を作成しました。クエリを直接送信します。私の質問-それは最適ですか?それはばかげた証拠であり、正常に機能することが保証されていますか?そうでない場合; お知らせ下さい。

static String Server = "";
static String Username = "";
static String Name = "";
static String password = "";

static String conString = "SERVER=" + Server + ";DATABASE=" + Name + ";UID=" + Username + ";PASSWORD=" + password + ";connect timeout=500000;Compress=true;";

public bool InsertSQL(String Query)
{
    int tmp = 0;
    try
    {
        using (MySqlConnection mycon = new MySqlConnection(conString))
        {
            using (MySqlCommand cmd = new MySqlCommand(Query, mycon))
            {
                mycon.Open();
                try
                {
                    tmp = cmd.ExecuteNonQuery();
                }
                catch
                {
                    if (mycon.State == ConnectionState.Open)
                    {
                        mycon.Close();
                    }
                }
                mycon.Close();
            }
        }
    }
    catch { return tmp > 0 == true ? true : false; }
    return tmp > 0 == true ? true : false;
}

これは、他の関数で作成し、関数を挿入するためのテキストとして渡すSQL挿入です。私はすべての提案を受け入れます!

String insertSql = @"INSERT INTO `gps_unit_location`
            (`idgps_unit`,`lat`,`long`,`ip`,`unique_id`,
            `loc_age`,`reason_code`,`speed_kmh`,
            `VehHdg`,`Odometer`,`event_time_gmt_unix`,`switches`, `engine_on_off`, `dt`)
                VALUES
            (
            (Select idgps_unit from gps_unit where serial=" + serial + "),'" + lat + "','" + lon + "','" + IP + "','" + unique_id + @"',
            '" + LocAge_mins + "','" + ReasonCode + "','" + Speed + @"',
            '" + VehHdg + "','" + Odometer + "','" + EventTime_GMTUnix + "','" + Switches + "', '" + engine_on_off + @"', DATE_ADD(NOW(), INTERVAL 1 HOUR))
            ";
4

2 に答える 2

3

あなたのコードを例として使用して、この回答を作成しました。次の行に注意してください。

cmd.Parameters.AddWithValue("@queryParam", Query);

発生する可能性が低い場合でも、潜在的な SQL インジェクション攻撃に備えてコーディングすることは、常にベスト プラクティスです。

static String Server = "";
static String Username = "";
static String Name = "";
static String password = "";

static String conString = "SERVER=" + Server + ";DATABASE=" + Name + ";UID=" + Username  + ";PASSWORD=" + password + ";connect timeout=500000;Compress=true;";

public bool InsertSQL(String Query)
{
   int tmp = 0;
   try
   {
      using (MySqlConnection mycon = new MySqlConnection(conString))
      {
         using (MySqlCommand cmd = new MySqlCommand(Query, mycon))
         {
            mycon.Open();
            try
            {
                cmd.Parameters.AddWithValue("@queryParam", Query);
                tmp = cmd.ExecuteNonQuery();
            }

            catch
            {
                if (mycon.State == ConnectionState.Open)
                {
                    mycon.Close();
                }
            }
            mycon.Close();
         }
     }
 }
 catch { return tmp > 0 == true ? true : false; }
 return tmp > 0 == true ? true : false;
}
于 2013-03-07T17:29:22.273 に答える
2

これを非常に一般的なものにすることで、SQL インジェクションにさらされることになります。クエリを作成して値を直接挿入する必要があると思います。ここでは SQL パラメーターの方が適切です。paramsof を渡す可能性がありますSqlParametersが、それでも送信される一般的なテキストに依存し、インジェクションにさらされたままになります。

SQL パラメータの例を次に示します。

于 2013-03-07T17:03:21.393 に答える