项目被检测出SQL注入,注入url如:http://127.0.0.1:8080/Test/wlf/getServiceInfo.html?province=%25E6%25B5%2599%25E6%25B1%259F50760358&timeType=1

  利用常用SQL注入工具可获取数据库详细情况如下所示:

  sqlmap命令:

  注入漏洞信息:

  针对SQL注入漏洞,一般的应对方式是在服务器端加强HTTP请求字符过滤,防范注入攻击,但这里是用hibernate作为ORM操作数据库,更为彻底的方式是参数的处理。先看原来的查询操作:

    public List<ProvinceListVO> getServiceInfo(String province,String timeType) {
List<ProvinceListVO> listVO = new ArrayList<ProvinceListVO>();
StringBuffer sb =new StringBuffer();
sb.append("select * from v_wlf_info t where t.province='")
.append(province).append("' and time_type='").append(timeType).append("'")
.append(" and t.total>0");
try {
listVO = this.queryByJdbcForBean2(sb.toString(), ProvinceListVO.class);
} catch (Exception e) { e.printStackTrace();
}
return listVO;
}

  问题就出在标红那一行,明明是两个参数,非得搞成字符串,让人家有机可乘。修改后的代码:

    public List<ProvinceListVO> getServiceInfo(String province,String timeType) {
List<ProvinceListVO> listVO = new ArrayList<ProvinceListVO>();
StringBuffer sb =new StringBuffer();
sb.append("select * from v_wlf_info t where t.province=? and t.time_type=?")
// .append(province).append("' and time_type='").append(timeType).append("'")
.append(" and t.total>0");
try {
listVO = this.queryByJdbcForBean2(sb.toString(), ProvinceListVO.class, province, timeType);
} catch (Exception e) { e.printStackTrace();
}
return listVO;
}

  我们看下queryByJdbcForBean2干了啥:

    public <T> List<T> queryByJdbcForBean2(String sql,Class c,final Object... values){
List<T> list= new ArrayList<T>();
Session session = null;
try {
session = this.getSession();
Query query = this.getSession().createSQLQuery(sql);
if (values != null) {
for (int i = 0; i < values.length; i++) {
query.setParameter(i, values[i]);
}
}
List<Object> rlist = query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).list(); for (Object object : rlist) {
Map map = (Map) object;
T t = (T) Map2BeanUtils.map2Bean(map, c, Map2BeanUtils.DB_COLUMN_TYPE);
list.add(t);
}
} catch (DataAccessResourceFailureException e) {
e.printStackTrace();
} catch (HibernateException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
}finally{ if(session != null)
this.releaseSession(session); }
return list;
}

  上面使用的是利用setParameter方法来防止在参数上做手脚。

hibernate规避SQL注入实例的更多相关文章

  1. sql注入实例分析

    什么是SQL注入攻击?引用百度百科的解释: sql注入_百度百科: 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具 ...

  2. web安全之sql注入实例(5.0之前的)

    web安全之sql(5.0之前)注入实例 5.0之前的数据库没有information库. 所以这里需要运用的是load_file()函数来获取信息. 1.判断是否有sql注入,用and 1=1 和 ...

  3. Hibernate防止SQL注入

    如果在查询字段中输入单引号"'",则会报错,这是因为输入的单引号和其他的sql组合在一起编程了一个新的sql,实际上这就是SQL注入漏洞,后来我在前台和后台都对输入的字符进行了判断 ...

  4. 使用Hibernate防止SQL注入的方法

    之前写代码,往后台传入一个组织好的String类型的Hql或者Sql语句,去执行. 这样其实是很蠢的一种做法!!!! 举个栗子~~ 我们模仿一下用户登录的场景: 常见的做法是将前台获取到的用户名和密码 ...

  5. sql注入实例详解(二)

    前言 这篇文章就是一个最基本的SQl手工注入的过程了.基本上在sqlilabs上面的实验,如果知道了其中的全部知识点,都可以通过以下的步骤进行脱裤.下面的这个步骤也是其他的脱裤手段的基础.如果想要精通 ...

  6. 后台SQL注入实例

    简要描述: 汉庭连锁酒店后台SQL注入,可绕过登陆限制进入后台,可脱库. 详细说明: 问题发生在这个站点.http://miaosha.htinns.com/ 标题内没有写具体信息.因为怕发布后被人入 ...

  7. hibernate防止sql注入对参数赋值传参数的例子

    来源于:https://my.oschina.net/u/1754093/blog/707083 1.按参数名称绑定 在HQL语句中定义命名参数要用":"开头,形式如下: Quer ...

  8. PDO预处理语句规避SQL注入攻击

    所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令.在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存 ...

  9. Hibernate使用中防止SQL注入的几种方案

    Hibernate使用中防止SQL注入的几种方案 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数 ...

随机推荐

  1. UVA-1615 Highway (贪心,区间选点)

    题目大意:有一条沿x轴正方向,长为L的高速公路,n个村庄,要求修建最少的公路出口数目,使得每个村庄到出口的距离不大于D. 题目分析:区间选点问题.在x轴上,到每个村庄距离为D的点有两个(超出范围除外) ...

  2. brew || yarn 软件包管理工具

    1.brew || yarn 软件包管理工具

  3. hdu2426

    题解: KM模板题 如果n>m,输出-1 如果a[match[i]][i]==-1输出-1 负的边不用考虑 初始都赋值为-1 代码: #include<cstdio> #includ ...

  4. I/O流+统计文件词频

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  5. 【css】25个漂亮的响应式布局的web设计【转】

    响应的web设计的做法是提高用户的浏览质量,并在不同设备上能够完美的浏览使用,就像大前端推出的D7主题.看看下面美丽的响应的网站布局,通过本文你会在以后的设计中找到响应的web设计的灵感. 1.Mar ...

  6. 设置tableview 右侧 索引字体的大小

  7. Android gradle 安装成功,但是报虚拟机过大的错误处理方法

    一.这个是项目中遇到的问题,记下来,以后再出现方便查看. 1.首先看图吧. 虚拟机内容过大 解决办法: 在.gradle目录下更改配置文件gradle.properjties 里面的 将标记的改成51 ...

  8. python基础(二)----数据类型

    Python基础第二章 二进制 字符编码 基本数据类型-数字 基本数据类型-字符串 基本数据类型-列表 基本数据类型-元组 可变.不可变数据类型和hash 基本数据类型-字典 基本数据类型-集合 二进 ...

  9. 什么时候应该使用Autorelease Pool

    csdn首发:http://blog.csdn.net/guijiewan/article/details/46470285 Objective c使用ARC之后,一般都不需要再手动调用retain, ...

  10. 一个关于PCA的疑问

    我们知道PCA干的事情是把n维的样本投影到k维,同时丢失的信息能够达到最少. 为什么说principal component是covariance matrix的特征值中最大的前k个对应的特征向量上的 ...