如果是拼装SQL语句的方式,SQL 注入 与语言无关。java里可以使用PreparedStatement 来避免SQL注入。
ps: 历来在csdn发0分贴然后许诺给分的,绝大部分的承诺都是空的。

解决方案 »

  1.   

    呵呵,楼上的有意思!
    我举个例子!比如页面你用的是text输入
    <input name="xxx">处理是这样的
    String xxx=request.getParameter("xxx");
    String sql="select * from t where xxx='" + xxx +"'";
    那么这里就有一个严重的问题了当然如果是征程输入就没有问题,比如输入是abc
    sql语句变成select * from t where xxx='abc'但是你如果输入一个有趣的东西,结果就不一样了
    比如输入 abc' or true --
    那么sql语句就变成
    select * from t where xxx='abc' or true --'
    --之后就被注释掉了
    where语句是恒成立的,那么就能看到你这个表俩面所有的数据了!
      

  2.   

    你好.我ASP会防止SQL漏洞.但是JSP不会.所以不知所措.你能提供解决的方法的吗?谢谢.
      

  3.   

    这个简单啊!
    以后不能直接使用我刚才的办法执行sql语句了要这样
    String xxx=request.getParameter("xxx");
    PreparedStatement stmt=conn.prepareStatement("select * from t where xxx=?");
    stmt.setString(1,xxx);
    rs=stmt.executeQuery();
      

  4.   

    to:pigo(少壮且行英雄梦,迟暮归守温柔乡) ( ) 信誉:115 
    >>ps: 历来在csdn发0分贴然后许诺给分的,绝大部分的承诺都是空的。呵呵!有趣有趣!老大果然是老大!
      

  5.   

    这个用了直接拼凑sql就没办法补救
    除非重新写代码
    呵呵
    自求多福把~
      

  6.   

    用了TM的方法:E:\Tomcat 5.0\work\Catalina\localhost\_\org\apache\jsp\corpserv\login_005fcheck_jsp.java:79: cannot resolve symbol
    symbol  : method PreparedStatement  (java.lang.String)
    location: class jmeport.conn
    PreparedStatement stmt=conn.PreparedStatement("select * from xx where user_name='"+user_name+"'");
                                       ^出现了这样的错误...
      

  7.   

    晕,看来搂主对PreparedStatement是一点都不会用啊
    你先查查api吧,呵呵
      

  8.   

    用预处理语句,可以防止sql注入:
    PreparedStatement pstmt=conn.prepareStatement(select * from t_user where user_id=? and user_name=?);
    pstmt.setInt(0,userid);//userid就是传进来的参数
    pstmt.setInt(1,username);//username就是传进来的参数
    pstmt.executeQuery();楼主照这个格式写就可以了。
      

  9.   

    打错了,是pstmt.setString(1,username);//username就是传进来的参数
    楼主查查api就知道了
      

  10.   

    <%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*"%>
    <jsp:useBean id="conn" scope="page" class="ok.conn"/> String user_name=request.getParameter("user_name");
    String pwd=request.getParameter("pwd");

    ResultSet rs;
    String sql="select * from xx where user_name=?";
    第六行: PreparedStatement stmt=conn.preparedstatement(sql);
    stmt.setString(1,user_name);
    rs=stmt.executeQuery();现在我这样写的话,它这儿出错了.是提示conn,请问我怎么样做法?请\教stmt.setString(1,user_name);中1是不是user_id=? and user_name=?);
    user_id为1,user_name为2,还是表是.user_id在数据库中的位置??????????????????????????????
      

  11.   

    错误的提示:
    Generated servlet error:
        [javac] Compiling 1 source fileE:\Tomcat 5.0\work\Catalina\localhost\_\org\apache\jsp\corpserv\login_005fcheck_jsp.java:79: cannot resolve symbol
    symbol  : method preparedstatement  (java.lang.String)
    location: class ok.conn
    PreparedStatement stmt=conn.preparedstatement(sql);
                                       ^
      

  12.   

    写一个ParamUtil类。封装所有request取值方法,
    如原来的
    request.getParameter("test");
    改为
    ParamUtil.getString(request,"test");而在paramUtil的方法getString()中可以做很多事,如replace掉单引号',中是乱码转等,空字符判断等。
      

  13.   

    加上:
    import java.sql.*;
      

  14.   

    必须注意大小写!Java是严格区分的!!!!!!!!!!!!!!!!!!!!!!!!
      

  15.   

    我怀疑你的conn在bean中没有设置正确,所以提示出错
          Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
          Connection con = java.sql.DriverManager.getConnection(……设置参数);
    还有,
    PreparedStatement pstmt=conn.prepareStatement("select * from t_user where user_id=? and user_name=?");
    pstmt.setInt(1,userid);//userid就是传进来的参数
    pstmt.setString(2,username);//username就是传进来的参数
    ResultSet rst = pstmt.executeQuery();
    的确是应该从1开始计数,是我打错了
      

  16.   

    我是用javascript的正则表达式来防止非法输入
      

  17.   

    用了TM的方法:E:\Tomcat 5.0\work\Catalina\localhost\_\org\apache\jsp\corpserv\login_005fcheck_jsp.java:79: cannot resolve symbol
    symbol  : method PreparedStatement  (java.lang.String)
    location: class jmeport.conn
    PreparedStatement stmt=conn.preparedStatement("select * from xx where user_name='"+user_name+"'");
                                       ^出现了这样的错误...无可奈可~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~说conn中有错.
    但是我不用这种方法的话.它是没错的.
      

  18.   

    你的conn根本不是标准的java.sql.Connection对象,那个只是你自己的类吧这个只是你自己的代码没有封装这个方法而已!!!
      

  19.   

    楼主,你在java方面很嫩啊!
    连PreparedStatement, import java.sql.* 和 区分大小写 都要人提醒。
    回去耕田算啦!你以为编程这么容易啊?!这样也能混饭吃?!
    混得一时也混不过一辈!早点转行把职位让出来给其它有能力者吧!
      

  20.   

    这位:RoadToTheExpert() ( ) 信誉:100 
    ===========================================
    你所言甚是.我不是JSP的料.我在公司只要是负责ASP,一般网站的工程.美工.
    对于JSP,只是第二次接触.未看过JSP书.配tomcat也只是第二次配,编程是不
    易.我没有说过是"易"混饭吃就不敢了.不然我能在这儿混了一年多?而且做
    网站只有我一个人.迟下还要用.net来做野.所以什么也是要学.
    但在不同情况下.当你快要饿死街头时,你心里想着,是让人授你与渔还是鱼?
      

  21.   

    zorro09(啊!上帝!) ( ) 信誉:100 
    ===============================================
    退位让贤?
    哈.上帝你来吧.
    我想你asp,jsp,.net不熟.你也别想混得上.
    三样都会.这儿你得有几千大元/月.
      

  22.   

    RoadToTheExpert() ( ) 信誉:100 
    \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
    请问贵兄在那儿高就?
    我只是个低学历的人.
    只会一些asp+sql,只做一些中小型网站而已,做下图片,flash.帮人设计vi
    做下logo甘样工作.
    就什么都不会了.
    有待指教.
      

  23.   

    to 99percent(大鱼大肉) 我的学历也不高,来自不出名的大学的计算机系。
    但我非常爱好编程,我毕业后在某公司工作了一年,
    是公司编程人员里的最佳新人。(后来这公司因为业务问题倒闭了)后来随着见识的增长,接触了不少程序员,
    我看见很多程序员其实并无真才实学,平时老是在吹自己如何强,
    做工程时就从网上抄代码,毫无自己的编程思想。
    我觉得这么差的人也能做程序员,与我当初想象的"能者居之"的情形相差甚远!
    后来我发现,这是普遍的现状 ... ...----------------------------------------
    像你一样,我也是来自广东。(我估计你也是)
    如果我的话伤害了,我向你说:对不起!
    ----------------------------------------
    我不是乱吹的,这是我写的一个程序,有空看看。(访问不了就刷几下)一个用Cookie保存的动态javascript树
    http://sinmax.home4u.china.com/
      

  24.   

    现在仅求解决方法.不论什么方法.(防SQL注入式漏洞)
      

  25.   

    现在仅求解决方法.不论什么方法.(防SQL注入式漏洞)
      

  26.   

    上面不是说了吗?就是使用java.sql.PreparedStatement上面你出错是因为conn根本不是java.sql.Connection对象!所以就没有prepareStatement方法
      

  27.   

    用预处理语句,可以防止sql注入:
    PreparedStatement pstmt=conn.prepareStatement(select * from t_user where user_id=? and user_name=?);
    pstmt.setInt(0,userid);//userid就是传进来的参数
    pstmt.setInt(1,username);//username就是传进来的参数
    pstmt.executeQuery();楼主照这个格式写就可以了。其实,就是参数化查询。这是实现跨多个数据库编程的一种重要方式。
    sigh,只是现在很多人编程用惯了一种数据库。从来不会顾及那些。
      

  28.   

    这么多人,就在多说一句 了,你把result 在判断一下不就可以了吗??
    如果多了好几个值就说明有误,前提是判断出一个值时,如果说判断多个值,在议
      

  29.   

    看到很多前辈谈着谈着又离题了...回到楼主的问题,,,我嘎做法系写一个filter,,,然后在这个filter中用正则表达式判断敏感字符(运算符号,sql函数等,,,楼上那篇写得很好可以借鉴),,,然后就可以转到处理表单的servlet了...这样做的好处是你不需要大量修改已经完成的代码...我虽然还没毕业,但已经做了6年的asp了...一个月前接触jsp后感觉jsp不仅架构上,,,而且许多方法都比asp方便太多...建议楼主找本jsp的书看一下,,,你做过asp的话看个5天保证你不用在这里问简单问题...
      

  30.   

    有没有能帮下忙写一下啊?
    回复人: hesi726(hesi) ( ) 信誉:98  2005-04-19 11:36:00  得分: 0  
     
     
       很明显,你的 conn me 没有 prepareStatement 方法。
    那么,另外一个方法就是对传入的参数进行替换
    把 ' 替换成 '' 即可以解决你的问题..
      那么我没有preparestatement怎么加上去啊/