据我所知如下:
普通的sql查询语句是拼接式的如:string sql="select * from table1 where username = '"+Request.QueryString("uname")+"'";
这样很容易引起sql注入。
但是改成string sql="select * from table1 where username = @uname";
SqlParameter parma= new SqlParameter("@uname", SqlDbType.VarChar, 50);
parma.Value=Request.QueryString("uname");
SqlCommand cmd=new SqlCommand(sql,conn);
cmd.Parameters.Add(param);
SqlDataReader sdr = cmd.ExecuteReader();
....这样就能防止sql注入,可是我不明白的是这样为什么就可以防止?

解决方案 »

  1.   

    我所知道的sql 注入方法就是靠 ' 与前面的单引号闭合,然后添加自己的sql语句。所以你要对输入的查询条件进行替换。而SqlParameter 会自动替换参数中的' 这和带参数的存储过程不会引起sql注入一样
      

  2.   

    普通的sql查询语句是拼接式的如:string sql="select * from table1 where username = '"+Request.QueryString("uname")+"'"; 
    这样很容易引起sql注入。如果用户输入的是:   aa' or 1=1;delete table1 --生成的sql语句是什么?会产生什么后果?
      

  3.   

    使用过程和参数化查询
    使用HtmlEncode方法
    去看看msdn,上面都有
      

  4.   

    输入 aa' or 1=1就代表用户名=aa或者1=1,只要有一个成立了,就会显示所有的用户信息啊,是不是很可怕啊,
    就是因为 or 1=1是肯定成立的,就忽略了前面的条件
    但是参数化就避免了这个问题了,你输入的任何东西都是参数,到数据库去比较输入的用户名是否存在呢,你输入的都会当作用户名来查询的,
      

  5.   

    因为‘@’把其他的东西都给屏蔽了。其实只有字符串拼接不能够防止sql注入攻击
      

  6.   

    通过SqlParameter,ado.net会帮你做注入参数检查。
      

  7.   

    ado.net会帮你做注入参数检查?这个不是很明白。
      

  8.   

    ado.net的SqlParameter 会过滤的
      

  9.   

    最近在找这个方法,我在写asp的时候都是这样写的,
    所以也想知道C#的写法!