数据库:一个Uid对应一个Upwd和一个Uname(目前只有两个账户)
一个老同事调戏菜鸟,在登陆界面的密码框里输入了一些不知道什么的东东(密码框有限制20个字符以内),然后我的网页就悲剧了,两个账户的Uname变成了同一个,求解释,求解决办法?
 ps:登陆界面的sql语句:    
         String sql="select * from userinfo where Uid='"+username+"' and Upwd='"+password+"'";
            rs=st.executeQuery(sql);
            if(rs.next()){
                   session.setAttribute("u_name",rs.getString("Uname"));
                   }

解决方案 »

  1.   

    用完之后session清除下就行了。
      

  2.   

    不要用单引号去拼接字符串吧 我觉得应该是这方面的问题
    你可以直接在密码框里输入' or 'a'='a 试试  结果肯定是你看到的那种用户名是一个
    所以 不要用拼接 用?代替传入参数 然后用setstring什么的赋值
      

  3.   

    debug,或者把sql打印出来。不就知道是怎么回事了
      

  4.   


    "  Uid='"+username+"' " 这个应该是有错的, 是写错了, 还是写错了!!
    session的会话周期看看, 如果没错的话, 应该是在同一浏览器中打开两个链接。 第一次的session值被覆盖了。 
      

  5.   

    sql注入了.. 不要用String拼接SQL语句 容易被sql注入    如果是hibernate可以尝试用setParam
      

  6.   

    sql注入后,源代码会不会改变,因为网页挂在服务器上,现在无法调试了....
      

  7.   

    sql注入后,源代码会不会改变,因为网页挂在服务器上,现在无法调试了....
    还想弱弱地问一句,能不能注入回来?
      

  8.   

    sql注入后,源代码会不会改变,因为网页挂在服务器上,现在无法调试了....
    还想弱弱地问一句,能不能注入回来?
    sql注入不会改变源码 只会改动数据库中的数据
    既然只有两个用户你手动改下数据库中的数据就好了..
      

  9.   

    sql注入后,源代码会不会改变,因为网页挂在服务器上,现在无法调试了....
    还想弱弱地问一句,能不能注入回来?
    sql注入不会改变源码 只会改动数据库中的数据
    既然只有两个用户你手动改下数据库中的数据就好了..
    我查看了数据库,数据库的数据并没有任何更改?
      

  10.   

    有是有办法 你可以在 and Upwd='"+password+"'"这边的password 改成replace(password,"'","''")这样或许可以的
    还有注入之后能查出所有的用户信息 因为取第一条 所以所有的用户都是查出来的第一个 和数据库里面数据没有关系的 不会去改变的
      

  11.   

    sql注入后,源代码会不会改变,因为网页挂在服务器上,现在无法调试了....
    还想弱弱地问一句,能不能注入回来?
    sql注入不会改变源码 只会改动数据库中的数据
    既然只有两个用户你手动改下数据库中的数据就好了..
    我查看了数据库,数据库的数据并没有任何更改?
    Uid和Uname都没变动么?
      

  12.   

    不好意思 上面的replace写错了 应该是password.replace("'","''")
      

  13.   

    sql注入后,源代码会不会改变,因为网页挂在服务器上,现在无法调试了....
    还想弱弱地问一句,能不能注入回来?
    sql注入不会改变源码 只会改动数据库中的数据
    既然只有两个用户你手动改下数据库中的数据就好了..
    我查看了数据库,数据库的数据并没有任何更改?
    Uid和Uname都没变动么?
    嗯,没有任何改变
      

  14.   

    如果后面的password replace掉  但是还有前面username的条件限制了吧??
      

  15.   

    如果后面的password replace掉  但是还有前面username的条件限制了吧??是我疏忽了 同样都replace一下么 
      

  16.   

    嗯,这个解决思路很适合我,写有过滤类,忘了在登陆框也过滤一下。
    Thank you very much!
      

  17.   

    你是指刷新页面还是指重新登录之后两个账号的UID变成同一个了?
      

  18.   

    不管是刷新还是重新登录之后,都是一个。
    找到错误原因,就是sql注入问题。
      

  19.   

    错了..是Uname变成同一个.,..= =
      

  20.   

    其实我很好奇你那老同事输入的是什么....因为sql注入的话是不会改变源码的  而重登陆是重新调用程序...为毛会出现这情况= =
      

  21.   

    其实我很好奇你那老同事输入的是什么....因为sql注入的话是不会改变源码的  而重登陆是重新调用程序...为毛会出现这情况= =
    我也很好奇,重启tomcat服务都不行,只能重换代码,下班去问他
      

  22.   

    其实我很好奇你那老同事输入的是什么....因为sql注入的话是不会改变源码的  而重登陆是重新调用程序...为毛会出现这情况= =
    我也很好奇,重启tomcat服务都不行,只能重换代码,下班去问他
    问完了告诉我一下啊...
      

  23.   

    其实我很好奇你那老同事输入的是什么....因为sql注入的话是不会改变源码的  而重登陆是重新调用程序...为毛会出现这情况= =//先假设有2个用户test1,test2
    //登录用户名是test1
    String username = "test1";
    //注入攻击 密码是 ' or  'a' ='a
    String password = "' or  'a' ='a";
    String sql="select * from userinfo where Uid='"+username+"' and Upwd='"+password+"'";
    //最后执行的sql应该就是 select * from userinfo where Uid='test1' and Upwd='' or 'a'='a' 执行这个查询的sql因为有 or 'a'='a' 这个永远为真的命题存在 
    //那么其实这个sql就等价于 select * from userinfo 查出所有记录 假设查出的记录是test2在第一个 那么程序中拿到第一条记录里面的就是用户名是test2的记录
    //所以 不管你如何去写用户名 只要密码是那个那么拼出的sql就是等价于select * from userinfo  那么拿出的值也一直是第一条记录也就是test2
    //所以和数据库里改数据是没有任何关系的 只是查询的时候一直取的第一条 那种让你看到变成一个用户只是一种错觉
      

  24.   

    这是所谓的sql注入吧?
    你的sql不应该用字符串拼接的方式。
    你这用写法在用户名和密码框里加上 or 1=1就进去了
      

  25.   

    其实我很好奇你那老同事输入的是什么....因为sql注入的话是不会改变源码的  而重登陆是重新调用程序...为毛会出现这情况= =//先假设有2个用户test1,test2
    //登录用户名是test1
    String username = "test1";
    //注入攻击 密码是 ' or  'a' ='a
    String password = "' or  'a' ='a";
    String sql="select * from userinfo where Uid='"+username+"' and Upwd='"+password+"'";
    //最后执行的sql应该就是 select * from userinfo where Uid='test1' and Upwd='' or 'a'='a' 执行这个查询的sql因为有 or 'a'='a' 这个永远为真的命题存在 
    //那么其实这个sql就等价于 select * from userinfo 查出所有记录 假设查出的记录是test2在第一个 那么程序中拿到第一条记录里面的就是用户名是test2的记录
    //所以 不管你如何去写用户名 只要密码是那个那么拼出的sql就是等价于select * from userinfo  那么拿出的值也一直是第一条记录也就是test2
    //所以和数据库里改数据是没有任何关系的 只是查询的时候一直取的第一条 那种让你看到变成一个用户只是一种错觉
    0.0 涨姿势了....
    不过LZ说重登陆也不行..难道LZ不是重新输入密码么?
      

  26.   

    其实我很好奇你那老同事输入的是什么....因为sql注入的话是不会改变源码的  而重登陆是重新调用程序...为毛会出现这情况= =
    我也很好奇,重启tomcat服务都不行,只能重换代码,下班去问他
    问完了告诉我一下啊...
    应该28楼是正解,老同事只提醒我注意单引号问题
      

  27.   

    其实我很好奇你那老同事输入的是什么....因为sql注入的话是不会改变源码的  而重登陆是重新调用程序...为毛会出现这情况= =
    我也很好奇,重启tomcat服务都不行,只能重换代码,下班去问他
    问完了告诉我一下啊...
    应该28楼是正解,老同事只提醒我注意单引号问题纳尼...你重登陆的时候只改动用户名  密码还是你老同事输入的密码么??还是用浏览器保存密码了..