用下列代码能防止注入式攻击
SqlParameter[] parameters = {
new SqlParameter("@sUser", SqlDbType.NVarChar,50)};新手,入门书上没过多介绍这个类。去百度了一下,发现这个的功能是验证长度和类型,可是在suer后面+个--类型和长度貌似也不会报错,想问问parameters防注入式的工作原理是怎样?

解决方案 »

  1.   

    如果查询语句使用字符串拼接的方法做成了,例如:SELECT * FROM [User] WHERE [UserName] = '{0}'若拼了一些特殊字符进去,例如单引号,就会理解为注释然后后面就任别人查询了非常危险。而用参数输入,无论放什么特殊的字符都会变成查询的内容
      

  2.   

    比如你的SQL语句如下:
    SELECT * FROM [User] WHERE [UserName] = '{0}' and [PassWord] = '{0}'
    这是个很正常的语句,写DEMO的时候经常这样写。
    又如果你很正常的判断出来的结果集的count是不是大于0或者大于等于1,true的时候就登陆成功
    如果人家输入的用户名:asd'-- 放在SQL里是不是密码判断就可能被注释掉了呢。。
    当然这是很低级很基础的一种注入方式。
      

  3.   

    我知道注入式的攻击,我想知道他的工作原理。2L的 而用参数输入,无论放什么特殊的字符都会变成查询的内容 怎么理解?我这样理解过  输入用户名:asd'--  在SqlParameter中 已经当成了注释,所以在 赋值的时候 把这个注释给去掉 直接将asd赋值给sUser 是不是这样理解? 在SqlParameter中检查过一次sql的注释哪一类的语句?
      

  4.   


    如果你直接拼接语句,比如传入一个drop table a。
    如果直接拼接的话的,那么drop就生效了。
    如果通过参数的话,传入的仅仅是一个单词,没任何的作用。