论坛首页 Java企业应用论坛

Dwr2+Struts2+Spring2.5+Hibernate3完美整合--用户登录注册系统

浏览 46646 次
精华帖 (6) :: 良好帖 (5) :: 新手帖 (2) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-09-04  
楼主在登陆的密码输入框输入
anypassword or 1=1,就可以登陆成功了,原理可以自己在数据库试试
0 请登录后投票
   发表时间:2008-09-04  
kakaluyi 写道
楼主在登陆的密码输入框输入
anypassword or 1=1,就可以登陆成功了,原理可以自己在数据库试试



试了,如果输入anypassword or 1=1,验证也没通过,登录不了。我觉得上面那个hql语句经HIBERNATE解释之后应该输出这样的sql原型:
select * from t_user t where t.name='输入框里面输入的帐号' and t.pwd='anypassword or 1=1';
除非数据库里面的这个人的密码真的是“anypassword or 1=1”,如果不是,那也验证不过吧。
哈哈,不知道这样说对不对。
0 请登录后投票
   发表时间:2008-09-04  
那是hql,不会跟or 1=1 组成sql语句的
0 请登录后投票
   发表时间:2008-09-04  
回复kakaluyi,我不知道你是否运行我的例子,希望你先运行一下再发表评论。
0 请登录后投票
   发表时间:2008-09-04  
这个我确实把hql当成sql来对待了,可能是没有必要
但你确定读过hibernate的sql占位符转换方式源码,确定这种方式不会被攻击吗,呵呵,jdbc时代这种语句偶是不敢写的
0 请登录后投票
   发表时间:2008-09-04  
kakaluyi 写道
这个帖子也可以被投精华,误人子弟啊
楼主你登陆判断这个函数
public boolean findUserByUNameAndPwd(String userName,String password) throws RuntimeException{
boolean flag = false;
String hql = "select user from User as user where user.userName=? and user.password=?";
Query query = this.getSession().createQuery(hql);
query.setString(0, userName);
query.setString(1, password);

List list = query.list();
if(list.size()>0){
flag = true;
}
return flag;
}
这句,
String hql = "select user from User as user where user.userName=? and user.password=?";
问你一下如果我密码 password=任意值 or 1=1;这样都可以登陆成功,安全性太差了,这可是最基本的防sql攻击要注意的啊


红色部分使用绑定变量进行数据库查询,即先生成sql语句至数据库缓存,所以后面跟任何字符都不会重新组合已经产生的sql语句,只会被当作变量来读取,因此不会产生注入,其实这也是防止sql注入最简单的方法了

另附容易产生sql注入的代码作为比较:
String hql = "select user from User as user where user.userName="+userName+" and user.password="+password;

0 请登录后投票
   发表时间:2008-09-04  
thanks a lot!!!
0 请登录后投票
   发表时间:2008-09-05  
不错,支持一下
0 请登录后投票
   发表时间:2008-09-05  
下下来看看
0 请登录后投票
   发表时间:2008-09-05  
关于hql,楼主写法是正确的,不明白的可以去看下hibernate的参考
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics