SqlCommand cmd = new SqlCommand("select * from WARE where warename='" + TextBox1.Text + "'", conn);  这个可以SQL注入,明白。
//SqlCommand cmd = new SqlCommand("jian", conn);       
        //cmd.CommandType = CommandType.StoredProcedure;         //cmd.Parameters.AddWithValue("a", TextBox1.Text);   这句话什么意思?后面注释的三句话是如何做到防止SQL注入的呢?

解决方案 »

  1.   

    我是来接分的,怎么防止注入,好像通过@参数可以防止 SqlCommand cmd = new SqlCommand(conn);
                cmd.Parameters.Add("@name",SqlDbType.VarChar,50);
                cmd.Parameters["@name"].Value = textbox.text.toString();
      

  2.   

    这个是一个存储过程,"jian"应该是存储过程的名字,存储过程是通过传参的形式传值的,所以使用存储过程可是程序的健壮性更高,"a"应该是存储过程内某个参数的名字吧,至于TextBox1.Text就是你所要传的值了,存储过程可以防止sql的注入式攻击
      

  3.   

    因为通过存储过程执行sql安全性高。可防止注入
      

  4.   

    正如#3楼所说注释部分为存储过程CREATE PROCEDURE jian
    @a text
    AS
    SELECT * FROM [WARE] where [warename] = @a
    RETURN
    GO
      

  5.   

    使用参数,提高安全性
    SqlCommand cmd = new SqlCommand("select * from WARE where warename=@a", conn);  
    cmd.Parameters.AddWithValue("@a", TextBox1.Text.Replace("'","''"));
      

  6.   

    参数化SQL 
    过滤单引号,指定数据类型和长度 
      

  7.   

    cmd.Parameters.AddWithValue("@a", TextBox1.Text.Replace("'","''")); 
    使用sqlcommand参数还要TextBox1.Text.Replace("'","''")吗,请问?
      

  8.   

    使用参数 不需要 TextBox1.Text.Replace("'","''")
      

  9.   


    如果使用参数化传递,且传递进去的字符串不是用于内部拼接SQL语句的,就不存在被注入的危险,当然就不需要TextBox1.Text.Replace("'","''"),那样简直就是画蛇添足,破化原意。仔细一看,那段“cmd.Parameters.AddWithValue("@a", TextBox1.Text.Replace("'","''"));”怎么又出自“wuyq11(人生如梦)” 之手,对此人的技术深表怀疑,已经多次让我看到离谱的错误了,而且基本上是接分走人,不修正自己的错误。