问题1:
JDO(Java Data Object ) 是 Java 对象持久化的新的规范,也是一个用于存取某种数据仓库中的对象的
标准化 API 。
JDO 提供了透明的对象存储,因此对开发人员来说,存储数据对象完全不需要额外的代码(如 JDBC
API 的使用)。这些繁琐的例行工作已经转移到 JDO 产品提供商身上,使开发人员解脱出来,从而集中时间
和精力在业务逻辑上。另外, JDO 很灵活,因为它可以在任何数据底层上运行。 JDBC 只是面向关系数据库
( RDBMS ) JDO 更通用,提供到任何数据底层的存储功能,比如关系数据库、文件、 XML 以及对象数据库
( ODBMS )等等,使得应用可移植性更强。
应用程序的开发人员通过访问 JDO Instance , 达到访问 JDO Instance 所代表的数据对象 , 包括 :ERP, 数
据库系统等 . 使数据的存储介质对于应用的开发人员完全透明 .
JDO 最早是由 Sun 召集众多的 O/R Mapping 开发团队集中起来共同提出的,首先是通过会议确定了
JDO 需要包括的内容,然后正式提出一个 Java 规范请求( JSR-12 ),正式开始了 JDO 规范的制定。
基于内存( JDO )、存储数据实现 sql 注入
问题2:
基于持久化数据的 sql 注入
持久化是将程序数据在持久状态和瞬时状态间转换的机制。通俗的讲,就是瞬时数据(比如内存中
的数据,是不能永久保存的)持久化为持久数据(比如持久化至数据库中,能够长久保存)。
持久化( Persistence ),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持
久化的主要应用是将内存中的对象存储在的数据库中,或者存储在磁盘文件中、 XML 数据文件中等等。
持久化是将程序数据在持久状态和瞬时状态间转换的机制。
JDBC 就是一种持久化机制。文件 IO 也是一种持久化机制。由于 hibernate 代码可能会使用字符串的方式进行拼接 sql 代码导致 sql 注入
修复:
使用 ESAPI 进行修复
Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得
Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。
在获取便利操作的同时, SQL 的注入问题也值得我们的密切注意,下面就来谈谈几点如何避免
SQL 注入:
1. 对参数名称进行绑定:
Query query=session.createQuery(hql);
query.setString(“name”,name);
2. 对参数位置进行邦定:
Query query=session.createQuery(hql);
query.setString(0,name1);
query.setString(1,name2);
...
3.setParameter() 方法:
Query query=session.createQuery(hql);
query.setParameter(“name”,name,Hibernate.STRING);
4.setProperties() 方法:
Entity entity=new Entity();
entity.setXx(“xx”);
entity.setYy(100);
Query query=session.createQuery(“from Entity c where c.xx=:xx and c.yy=:yy ”);
query.setProperties(entity);
5.HQL 拼接方法,这种方式是最常用,而且容易忽视且容易被注入的,通常做法就是对参数的特
殊字符进行过滤,推荐大家使用 Spring 工具包的 StringEscapeUtils.escapeSql() 方法对参数进行过滤:
public static void main(String[] args) {
String str = StringEscapeUtils.escapeSql("'");
System.out.println(str);
}