问题描述:
? ? ? ?如果不符合程序员的一个或多个假设,则通常会出现 null 指针异常。如果程序明确将对象设置为 null,但稍后却间接引用该指针,则将出现 dereference-after-store 错误。此错误通常是因为程序员在声明变量时将该变量初始化为 null 所致。
? ? ? 空指针问题是Fortofy安全漏洞中最容易解决的问题,不同的代码触发空指针的方式不同,本篇文章演示几个常见的空指针及解决思路。
问题代码1 对null数据进行操作导致空指针异常:
//查询数据库获取Map类型数据
Map<String, String> ruleMap=new HashMap<>();
Map<String, Object> map =jdbcTemplate.queryForMap(sql, bussId, materials, userId, orgId);
if(!map1.isEmpty()){
for (Map.Entry<String, Object> obj : map.entrySet()) {
//这行代码会被扫描出空指针,如果obj的value为空,那么null.toString()就会空指针异常
ruleMap.put(obj.getKey(),obj.getValue().toString());
}
}
解决方案:
//查询数据库获取Map类型数据
Map<String, String> ruleMap=new HashMap<>();
Map<String, Object> map =jdbcTemplate.queryForMap(sql, bussId, materials, userId, orgId);
if(!map1.isEmpty()){
for (Map.Entry<String, Object> obj : map.entrySet()) {
//提前判断obj的value值是否为空,如果是空则不做toString,直接赋值即可
String mapValue=obj.getValue()!=null?obj.getValue().toString():null;
ruleMap.put(obj.getKey(),mapValue);
}
}
问题代码2?调用空对象中方法触发空指针:
JSONObject obj = null;
StringBuffer objJSON = new StringBuffer("。。。。。。。");
// 转换成JSONObject对象
obj = JSON.parseObject(objJSON.toString());
//obj为null触发空指针
obj.put("sort", sort);
解决方案:增加非空判断
if(obj!=null){
obj.put("sort", sort);
}