精华帖 (6) :: 良好帖 (5) :: 新手帖 (2) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-09-04
楼主在登陆的密码输入框输入
anypassword or 1=1,就可以登陆成功了,原理可以自己在数据库试试 |
|
返回顶楼 | |
发表时间: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”,如果不是,那也验证不过吧。 哈哈,不知道这样说对不对。 |
|
返回顶楼 | |
发表时间:2008-09-04
那是hql,不会跟or 1=1 组成sql语句的
|
|
返回顶楼 | |
发表时间:2008-09-04
回复kakaluyi,我不知道你是否运行我的例子,希望你先运行一下再发表评论。
|
|
返回顶楼 | |
发表时间:2008-09-04
这个我确实把hql当成sql来对待了,可能是没有必要
但你确定读过hibernate的sql占位符转换方式源码,确定这种方式不会被攻击吗,呵呵,jdbc时代这种语句偶是不敢写的 |
|
返回顶楼 | |
发表时间: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; |
|
返回顶楼 | |
发表时间:2008-09-04
thanks a lot!!!
|
|
返回顶楼 | |
发表时间:2008-09-05
不错,支持一下
|
|
返回顶楼 | |
发表时间:2008-09-05
下下来看看
|
|
返回顶楼 | |
发表时间:2008-09-05
关于hql,楼主写法是正确的,不明白的可以去看下hibernate的参考
|
|
返回顶楼 | |