You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 11:54:07