2014-04-18 68 views
0
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["techconn"].ToString()); 

      SqlCommand com = new SqlCommand("select * from hs where ac between'" + TextBox1.Text + "'and '" + TextBox2.Text + "' and em='" + DropDownList1.SelectedItem.Text.ToString() + "'", con); 

      DataTable dt = new DataTable(); 

      con.Open(); 

      SqlDataAdapter sqlDa = new SqlDataAdapter(com); 

      sqlDa.Fill(dt); 

      if (dt.Rows.Count > 0) 
      { 
       GridView1.DataSource = dt; 
       GridView1.DataBind(); 
      } 
      else 
      { 
       GridView1.Visible = false; 
      } 

      con.Close(); 

此代碼是否對SQL注入安全?來自SQL注入的安全性

如果不是,請更正此代碼,以防SQL注入安全。

我正在使用SQL Server 2008.

+0

沒有,很不安全。您需要對* SQL參數*進行一些研究。 –

+0

@AndrewMorton請更正此代碼 – user3441151

+0

這是一個易於注入的教科書示例代碼。 –

回答

1

總之,答案是否定的。您需要始終在查詢中使用參數。

SqlCommand com = new SqlCommand("select * from hs where ac between @ac1 and @ac2 and [email protected]", con); 

然後,您將參數添加到您的SqlCommand對象(com)。

1

是的,你的代碼很容易出問題,不僅是sql注入攻擊。請嘗試以下操作:

public DataTable GetData(string textbox1, string textbox2, string dropdown) 
    { 
     DataTable result = null; 
     string connString = null; 

     if (ConfigurationManager.ConnectionStrings["techconn"] != null) 
      connString = ConfigurationManager.ConnectionStrings["techconn"].ConnectionString; 

     if (!string.IsNullOrEmpty(connString)) 
     using (SqlConnection con = new SqlConnection(connString)) 
     { 
      con.Open(); 

      using (SqlCommand cmd = con.CreateCommand()) 
      { 
       cmd.CommandText = "select * from hs where (ac between @a and @b) and em = @c"; 

       cmd.Parameters.AddWithValue("@a", textbox1); 
       cmd.Parameters.AddWithValue("@b", textbox2); 
       cmd.Parameters.AddWithValue("@c", dropdown); 

       using (SqlDataAdapter da = new SqlDataAdapter(cmd)) 
       { 
        result = new DataTable(); 
        da.Fill(result); 

       } 
      } 
     } 

     return result; 

    } 

通過

DataTable dt = GetData(TextBox1.Text, TextBox2.Text, DropDownList1.SelectedItem.Text.ToString()); 

      if (dt != null && dt.Rows.Count > 0) 
      { 
       GridView1.DataSource = dt; 
       GridView1.DataBind(); 
      } 
      else 
      { 
       GridView1.Visible = false; 
      } 

測試你的代碼,並使用貼吧得當了。

0

如果您使用直接文本框引用您的sql查詢,那麼它將永遠不會SQL注入安全任何最終用戶都可以將值注入到文本框並將其注入。

切勿使用UI元素直接向您的SQL你可以試試下面的代碼行

SqlConnection conn = new SqlConnection(_connectionString); 
conn.Open(); 
string s = "select * from hs where ac between @TextBoxOnevaluevariable and 
@TextBoxTwovaluevariable and [email protected]"; 

SqlCommand cmd = new SqlCommand(s); 
cmd.Parameters.Add("@TextBoxOnevaluevariable", Texbox1.Text); 
cmd.Parameters.Add("@TextBoxTwovaluevariable", Texbox2.Text); 
cmd.Parameters.Add("@DropdownSelectedTextVariable",DropDownList1.SelectedItem.Text.ToString()); 
SqlDataReader reader = cmd.ExecuteReader();