在ASP.NET中,以前一直用 new SqlParameter("@pwd",pwd)  ;但是有前辈说不能用这种写法,这样和 select id from users where pwd = '+pwd+' 没什么两样,不能防止 SQL 注入,于是我自己又写了个简单的程序测试了一遍,没发现 new SqlParameter("@pwd",pwd)  这种写法能 SQL 注入啊,难道这种写法不能防止 SQL 注入?纳了闷了,求高人指点。

解决方案 »

  1.   

    new SqlParameter("@pwd",pwd)  
    这种写法比拼接好
      

  2.   

    new SqlParameter("@pwd",pwd);
    select id from users where pwd = @pwd;//执行这个sql才叫带参数的,你那样还是拼接字符串
      

  3.   


    我就是这样写的:
    string sql = "select ID from users where pwd = @pwd";
            SqlDataReader sdr = SqlHelper.ExecuteReader(conn,CommandType.Text,sql,new SqlParameter("@pwd",pwd));
      

  4.   

    嗯,对,我想他应该是这个意思吧,但是也不能说以前的那种写法不能防止 SQL 注入啊,除非他以前注入成功过。
      

  5.   

    我就是用的参数,string sql = "select ID from users where pwd = @pwd";         SqlDataReader sdr = SqlHelper.ExecuteReader(conn,CommandType.Text,sql,new SqlParameter("@pwd",pwd)); 
      

  6.   

    参数还有一个好处就是,参数化的sql查询,可以重用执行计划,大大降低sqlserver的cpu消耗。
      

  7.   

    你对'处理了么,没有的话,如果@pwd输入一个'123你试试会不会报错呢
      

  8.   

    我用的是这种方法:
    string sql = "select ID from users where pwd = @pwd";         SqlDataReader sdr = SqlHelper.ExecuteReader(conn,CommandType.Text,sql,new SqlParameter("@pwd",pwd,麻烦各位回复前先看一遍问题再回复。
      

  9.   

    个人认为楼主的写法已经可以了,声明了参数以后,就是加了‘什么的符号,SQL SERVER 也是把它当成参数,而不会当成是SQL命令的一部分。当前最好是加上类型限定,长度什么的最舒服了。不过前辈嘛,你知道的,要多敬重,要多学习,一点点小事情不用这么较真。
      

  10.   

    楼主这样写,应该是正确的,你们前辈应该是让你加上类型等等的限制吧 、我就是用sql参数哇。没听过这种方式还跟字符串拼接一样的。应该是你听错啦。
      

  11.   

    1、反正我觉得LZ是正确的。2、个人从来不管注入不注入的,完全交给sql防注入硬件,还有usb-key,注入不注入懒的去管。
      

  12.   

    这样才是参数化查询
    SqlParameter[] parameters = {
    new SqlParameter("@StartTime", SqlDbType.DateTime,8),
    new SqlParameter("@EndTime", SqlDbType.DateTime,8),
    new SqlParameter("@UserName", SqlDbType.NVarChar,15)};
                parameters[0].Value=StartTime;
                parameters[1].Value=EndTime;
                parameters[2].Value=UserName;
      

  13.   

    string sql = "select ID from users where pwd = @pwd";
            SqlDataReader sdr = SqlHelper.ExecuteReader(conn,CommandType.Text,sql,new SqlParameter("@pwd",pwd));这就是参数化查询了,这样做pwd里面不管是什么,数据库都把它当成一个参数,而不是查询结构的一部分。