javax.persistence.EntityManager SQL 注入
Posted
技术标签:
【中文标题】javax.persistence.EntityManager SQL 注入【英文标题】:javax.persistence.EntityManager SQL INJECTION 【发布时间】:2021-12-28 09:57:15 【问题描述】:在你看到的这个方法中,我是根据pincode或者voen从oracle数据库中的程序接收数据。
@Override
public List<BaseClass> getCustomerInfo(String pinCode, String voen) throws SQLException, JsonProcessingException
List<BaseClass> customerInfos = new ArrayList<>();
Query q = em.createNativeQuery("select CUST_INFO_COURT.GET_CUSTOMER_INFO('" + pinCode + "','" + voen + "') from dual");
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);
List<CustomerInfo> langList = new ArrayList(Arrays.asList(langs));
for (CustomerInfo customerInfo : langList)
customerInfos.add(customerInfo);
return customerInfos;
return new ArrayList<>();
但是有一个问题。问题是我可以按照 PIN 码接收数据,但是当我以 voen 搜索时,我无法获取值。当我根据密码搜索时,我的查询是这样的。
Hibernate:
select
CUST_INFO_COURT.GET_CUSTOMER_INFO('',
'null')
from
dual
输出中的数据如下:
[
"full_name": "",
"doc_sr": "",
"doc_id": "",
"customer_id": ,
"pin_code": "",
"voen": "",
"position": null
]
当我根据 voene 搜索时,它会做同样的事情。
Hibernate:
select
CUST_INFO_COURT.GET_CUSTOMER_INFO('null',
'')
from
dual
输出中的数据如下:
[]
有一个问题,我认为是 SQL INJECTION。我正在考虑使用setParameter()
方法以这种方式发送参数,但我不知道如何将其应用于此代码。
【问题讨论】:
【参考方案1】:你可以使用这样的参数:
Query q = em.createNativeQuery(
"select CUST_INFO_COURT.GET_CUSTOMER_INFO(?,?) from dual");
q.setParameter(1, pinCode);
q.setParameter(2, voen);
【讨论】:
以上是关于javax.persistence.EntityManager SQL 注入的主要内容,如果未能解决你的问题,请参考以下文章