JPA EntityManager SQL注入及voen查询无返回值的setParameter实现咨询
问题根源
- 拼接SQL时Java null值会被转为字符串
'null'传入存储过程,和存储过程的参数判断逻辑冲突:按voen查询时pincode参数被传入'null'字符串(非空),存储过程优先按不存在的pincode值查询,自然返回空结果 - 硬拼接SQL存在明显SQL注入风险,用户传入特殊字符会直接破坏SQL结构
修复方案
用JPA原生查询的参数绑定替换字符串拼接即可同时解决两个问题,修改后代码如下:
@Override public List<BaseClass> getCustomerInfo(String pinCode, String voen) throws SQLException, JsonProcessingException { List<BaseClass> customerInfos = new ArrayList<>(); // 用?1、?2作为位置参数占位符,不直接拼接参数 Query q = em.createNativeQuery("select CUST_INFO_COURT.GET_CUSTOMER_INFO(?1,?2) from dual"); // 绑定第一个参数对应pinCode,第二个对应voen q.setParameter(1, pinCode); q.setParameter(2, voen); List objectArray = q.getResultList(); for (Object object : objectArray) { if (object != null) { Clob clob = (Clob) object; String arrayJsonData = clob.getSubString(1, (int) clob.length()); final ObjectMapper objectMapper = new ObjectMapper(); CustomerInfo[] langs = objectMapper.readValue(arrayJsonData, CustomerInfo[].class); customerInfos.addAll(Arrays.asList(langs)); return customerInfos; } } return new ArrayList<>(); }
方案说明
- 参数绑定会自动处理null值:当参数为Java null时,会正确传入数据库级别的null,而不是字符串
'null',完全匹配存储过程的参数判断逻辑 - 自动处理特殊字符转义,彻底避免SQL注入风险
- 你也可以改用命名参数写法提升可读性:SQL语句写为
select CUST_INFO_COURT.GET_CUSTOMER_INFO(:pinCode,:voen) from dual,绑定参数时用q.setParameter("pinCode", pinCode)、q.setParameter("voen", voen)即可。
内容的提问来源于stack exchange,提问作者iwritecomeinmymind
相关产品推荐
相关产品推荐

