System.Text.StringBuilder query = new System.Text.StringBuilder("SELECT * from Users WHERE login = ''''")。Append(txtLogin.Text)。Append("'''' AND password=''''")。Append(txtPassword.Text)。Append("''''");
⑶ 攻击者在用户名字和密码输入框中输入"''''或''''1''''=''''1"之类的内容。
⑷ 用户输入的内容提交给服务器之后,服务器运行上面的ASP.NET代码构造出查询用户的SQL命令,但由于攻击者输入的内容非常特殊,所以最后得到的SQL命令变成:SELECT * from Users WHERE login = '''''''' or ''''1''''=''''1'''' AND password = '''''''' or ''''1''''=''''1''''.
第一:替换单引号,即把所有单独出现的单引号改成两个单引号,防止攻击者修改SQL命令的含义。再来看前面的例子,“SELECT * from Users WHERE login = '''''''''''' or ''''''''1''''''''=''''''''1'''' AND password = '''''''''''' or ''''''''1''''''''=''''''''1''''”显然会得到与“SELECT * from Users WHERE login = '''''''' or ''''1''''=''''1'''' AND password = '''''''' or ''''1''''=''''1''''”不同的结果。
第二:删除用户输入内容中的所有连字符,防止攻击者构造出类如“SELECT * from Users WHERE login = ''''mas'''' —— AND password =''''''''”之类的查询,因为这类查询的后半部分已经被注释掉,不再有效,攻击者只要知道一个合法的用户登录名称,根本不需要知道用户的密码就可以顺利获得访问权限。