2016-02-11 116 views
-5
protected void Button1_Click(object sender, EventArgs e) 
{ 
    MySqlConnection connection = new MySqlConnection(ConfigurationManager.ConnectionStrings["myconstring"].ConnectionString); 
    connection.Open(); 
    symptons = String.Join(", ", CheckBoxList1.Items.Cast<ListItem>().Where(i => i.Selected).Select(i => i.Value).ToArray()); 
    Label3.Text = symptons; 
    if(symptons!="") 
    { 
     MySqlCommand cmd = new MySqlCommand("select d.dname from disease d inner join diseasesymptom ds on ds.did = d.did inner join symptom s on s.sid = ds.sid where s.sname in (" + symptons + ")", connection); 
     using (MySqlDataAdapter sda = new MySqlDataAdapter()) 
     { 
      cmd.Connection = connection; 
      sda.SelectCommand = cmd; 
      using (DataTable dt = new DataTable()) 
      { 
       sda.Fill(dt); 
       GridView1.DataSource = dt; 
       GridView1.DataBind(); 
      } 
     } 
    } 
    else 
    { 
     Label2.Text = "select at least one symptom"; 
    }  
} 

我知道我对我自己的代码排序进行SQL注入那么,如何防止这种情况, 基本上有3个表:有没有更有效的方法来写这个SQL代码?

  1. disease_table [栏=(disease_id,disease_name)
  2. symptom_table [列=](symptom_id,symptom_name)
  3. disease_symptom [列=](disease_id,symptom_id)

有一个复选框列表我的网页上有症状,其中文本=发烧,值=“发烧” ..等等这样做的理由是,用户可以选择任意数量的复选框,并在条款不接受参数

+4

**警告**您的代码极易遭受SQL注入攻击! –

+0

这就是我说的我该如何改进它,并实现上述结果..人们应该在投票前充分阅读问题 – panman

+0

也许他们投下因为你没有阅读谷歌的第一页[“如何避免SQL注射在C#“](https://www.google.com.mx/search?q=how+to+avoid+sql+injection+in+c%23&ie=utf-8&oe=utf-8&gws_rd=cr&ei=ita8Vq- yE4S1-QHcxKfwDQ) –

回答

0

相反到评论中的建议,你不应该需要一个存储过程来防止SQL注入。您可以使用parameterized queries来获取dothat。

下面的代码应该做的工作:

MySqlCommand cmd = new MySqlCommand(); 
cmd.Connection = connection; 

List<string> names = new List<string>(); 
for (int i = 0; i < symptons.Length; i++) 
{ 
    names.Add("@Param_" + i); 
    cmd.Parameters.Add(new MySqlParameter("@Param_" + i, symptons[i])); 
} 
cmd.CommandText = "select d.dname from disease d inner join diseasesymptom ds on ds.did = d.did inner join symptom s on s.sid = ds.sid where s.sname in (" + string.Join(",", names) + ")"; 

基本上你不注射的价值,但注入用于查询的参数来代替。参数名称在您的代码中生成,因此不能混淆。在执行查询之前,驱动程序对参数的值进行了消毒,所以这些值不能与任何一个混淆。

相关问题