Sql语句作为国际标准的数据库查询语句,在各种编程环境中得到了广泛的应用。作为一个成熟、稳定的系统,用户登陆和密码验证是必不可少的。在平时的编程工作中许多程序员在用sql语句进行用户密码验证时是通过一个类似这样的语句来实现的:
 strSel = " Select * from 用户表 where 姓名= '" + name + "'  and  密码 = '"  + password + "'";
        其中name和password是存放用户输入的用户名和口令,通过执行上述语句来验证用户和密码是否合法有效。但是通过分析可以发现,上述语句却存在着致命的漏洞。当我们在用户名称中输入下面的字符串时:111 ' or  '1 = 1,然后口令也以类似方法输入,我们假设密码为aaaa。变量代换后,sql语句就变成了下面的字符串: Sql="Select * from 用户表 where 姓名 = '111' or '1' = '1'  and  密码 = 'aaaa'
租车网 北京汽车租赁 北京租车网 舞台搭建
        我们都知道select语句在判断查询条件时,遇到或(or)操作就会忽略下面的与(and)操作,而在上面的语句中1=1的值永远为true,这意味着无论在密码中输入什么值,均能通过上述的密码验证!这个问题的解决很简单,方法也很多,最常用的是在执行验证之前,对用户输入的用户和密码进行合法性判断,不允许输入单引号、等号等特殊字符。
       上述问题虽然看起来简单,但确实是存在的。例如在互联网上很有名气的网络游戏"笑傲江湖"的早期版本就存在着这样的问题,这确实应该引起我们的注意。这也暴露出年轻程序员在编程经验和安全意识上的不足。同时也提醒我们编程工作者在程序设计时应当充分考虑程序的安全性,不可有半点马虎,一个看似很小的疏漏可能就会造成很严重的后果。 在Winforms编程中可以采取以下方法解决,可以用文本框的KeyPress事件中添加以下代码
     if(e.KeyChar == ' \' ') {
            MessageBox.Show("不可以输入‘!");
            e.Handled = true;
     }
     此处的e是该事件提供的参数对象,KeyChar是表示所按键的ASCII码,\'表示单引号,条件判断可以查出输入是否是单引号。Handled 为true表示不接收输入字符,这样一来就可以避免上述SQL注入式攻击。