<select id="unsafe" resultMap="myResultMap"> select * from table where name like ’%$value$%’ </select>
UnSafeBean b = (UnSafeBean)sqlMap.queryForObject("value", request.getParameter("name")); 假设用户输入 kj021320
其翻译为本地SQL代码 select * from table where name like ’%kj021320%’ 而在ibatis 上面 $ 之间的变量只是做了一般的替换 没有做SQL的转义这样往往就会存在攻击
需要把你的代码更正一下 <select id="safe" parameterClass="java.lang.String" resultMap="myResultMap"> select * from table where name like #value# </select> SafeBean b = (SafeBean)sqlMap.queryForObject("value", "%"+request.getParameter("name")+"%");
虽然有点麻烦 要在XML中说明一下你的参数的类型!但是这样就可以轻易的防止了对象查询的注射
Hibernate
这个框架用的人比较多了,继续看下面的代码示例
LoginUser lu = (LoginUser)session.find("from cn.isto.User as u where u.upass = ’" + LoginUser.getUpass()+"’ "); 这样很明显了~ 提交的pass可以随意更改HQL语句,达到绕过认证 下面让我们来加工一下修补修补
LoginUser lu = (LoginUser)session.find("from cn.isto.User as u where u.upass = ? " , LoginUser.getUpass() ,
讨论~~~entity bean注射一般不会存在配置文件里面 看下面的 <query> <query-method> <method-name>findByMember</method-name> <method-params> <method-param>java.lang.String</method-param> </method-params> </query-method> <ejb-ql> <![CDATA[SELECT OBJECT(h) FROM Member AS h WHERE h.name = ?1]]> </ejb-ql> </query>
StringBuffer ql =new StringBuffer(" SELECT OBJECT(h) FROM Member AS h "); String order = request.getParameter("order"); if ( !=null ) ql.append(" order by id ").append( order ); Query query = em.createQuery(ql);