以下是我点登录按钮执行的代码:
    SqlData da = new SqlData();
        string user=this.Login1.UserName;
        string pass = this.Login1.Password;
        IList count = da.GetIListData("select * from x_users where username='" + user + "' and password='" + pass + "'");
        int i=count.Count;
        if (i == 1)
        {
            Response.Redirect("Default.aspx");
        }        else
        {
     Response.Write("<script language=javascript>alert('用户名或密码错   误!');</script>");
        }其实代码没有错,但是如果我用户名输入 username'-- ,密码随便输,都可以进入页面了,主要是后面的'-- ,好象是把密码给我注释了,请问有没有啥办法解决?

解决方案 »

  1.   

    这不就是简单的SQL注入攻击吗?
    写成存储过程或者验证一下传过来的值再放到SQL语句中
      

  2.   

    原因是这样的:
    本来你生成的SQL语句是:
    select * from X_users where username='xxx' and password='yyy'
    只有当符合两个条件的时候才有效。
    而你使用这个用户名的时候,生成的SQL语句是:
    select * from X_users where username='xxx'-- and password='yyy'
    在SQL中--是注释符相当于C#里的//,把后面的都注释了。于是执行的结果相当返回一条用户名=xxx的记录,只有这个条件满足就可以返回记录。
    你所用的这个方法也是通常我们所说的SQL 注入攻击。
      

  3.   

    再简单一点把SQL 写select password from x_users where username='" + user + "' 
    然后判断密码是否正确
      

  4.   

    你只要不把用户名和密码一起写在where后面,基本上就能防止SQL注入
    还简单``
      

  5.   

    存储过程产生的错误就是给你报错了,返回错误信息,不会进行下一步操作了。
    你一收到错误信息就可以用弹出警告框等方法警告用户了,这样就防止了SQL注入。
      

  6.   

    写一个筛选特殊字符的函数,把输入的内容筛选一下
    听说写Sql语句时用@para参数的话好像也要好些