最好写成一个存储过程,先select count(用户名) as num from 用户表 where 条件,如果num<>1,肯定不对(当用户表记录确实为1时是个漏洞)。不要在页面中直接写SQL。

解决方案 »

  1.   

    用PreparedStatement来替换 Statement ,然后用参数传递的方法,就可以解决了
      

  2.   

    baitianhai(hong) , peacock_king(孔雀王) 
    你们两位对自己说的能否再明白点? 我怎么觉得好象没什么区别,还是可能被骗过
      

  3.   

    严重同意 baitianhai(hong).
    这种方式不可能被骗过去了的.
      

  4.   

    还有另外一个做法,就是把所有的'号替换成两个单引号''这是使用SQL语句的-->基本<---做法.同时也是安全的 (不仅仅是对密码而言!!!)
      

  5.   

    写一个类,功能是替换客户端发送过来的字串中的非法字符。比如接收到的字串是:a'or''1'='1
    那么程序就把它改为:a''or''''1''=''1前提是你的sql语句中字串用的引号是“单引号”,那么像上面那样改动之后,“单引号”不再会影响你的操作了,因为数据库服务器会把你提供的字串里的两个紧连着的“单引号”当作一个“单引号”来用。
      

  6.   

    用PreparedStatement代替Statement的原理如下:
    PreparedStatement prst=con.prepareStatement("select * from book where a=?");
    prst.setString(1,"a'or''1'='1");
    //这里把字串传给sql语句,传递时字串其实相当于a\'or\'\'1\'=\'1,当然不会有问题喽。
      

  7.   

    处理一下读取的字符串
     str = str.replaceAll("'","''");