在Hibernate中,SQL注入指的是恶意通过SQL语句输入实现非授权访问或破坏数据库的行为。Hibernate提供了以下几种机制来防护SQL注入:
- 确保SQL查询参数使用问号占位符,并通过setParameter()等方法设置参数值。
例如:
Query query = session.createQuery("from Customer where name=?");
query.setParameter(0, name); // 使用setParameter而不是字符串拼接
- 在StoredProcedureQuery中使用§命名参数,并通过setParameter()设置参数值。
例如:
StoredProcedureQuery query = session.createStoredProcedureQuery("addCustomer");
query.registerStoredProcedureParameter("name", String.class, ParameterMode.IN);
query.setParameter("name", name);
- 使用@org.hibernate.annotations.FilterDef和@Filter机制过滤输入条件。
例如:
@Entity
@FilterDef(name="xyzFilter", defaultCondition=":name = 'A%'")
@Filter(name="xyzFilter")
public class Customer {
...
}
会自动将输入值限制为以A开头。
- 通过元素设置返回带过滤条件的查询。
例如:hibernate.cfg.xml中配置:
<return-filter alias="xyzFilter">
<filter-def>
<filter-name>xyzFilter</filter-name>
<default-condition>:name = 'A%'
</filter-def>
</return-filter>
- 对于从SQL输入中构建的条件,使用Criteria API而不是语句字符串。
例如:
Criteria cri = session.createCriteria(Customer.class);
cri.add(Restrictions.like("name", name + "%")); // 以name值开头