104 lines
2.0 KiB
Markdown
104 lines
2.0 KiB
Markdown
排查附件问题,支撑上线。
|
|
|
|
在凌晨支撑了上线,算是第一次接触了上线业务,感觉对整个的开发流程掌握的更多了。
|
|
|
|
在早晨被告知了,信安附件校验问题。
|
|
|
|
下午开始排查,做了自己的第一个工具类,可以进行文件魔数校验:
|
|
|
|
```java
|
|
|
|
private static String getUpperCaseHexString(byte[] file) {
|
|
|
|
StringBuilder sb = new StringBuilder();
|
|
|
|
for (int i = 0; i < HEADER_LENGTH; i++) {
|
|
|
|
int v = file[i] & 0xFF;
|
|
|
|
String hv = Integer.toHexString(v);
|
|
|
|
if (hv.length() < 2) {
|
|
|
|
sb.append(0);
|
|
|
|
}
|
|
|
|
sb.append(hv);
|
|
|
|
}
|
|
|
|
return sb.toString().toUpperCase(Locale.ENGLISH);
|
|
|
|
}
|
|
|
|
```
|
|
|
|
```java
|
|
|
|
log.info("开始校验是否是非法文件");
|
|
|
|
List<String> defaultFileHeaderList = new ArrayList<>();
|
|
|
|
//XLS格式8位魔法数字
|
|
|
|
defaultFileHeaderList.add("D0CF11E0");
|
|
|
|
//XLSX格式8位魔法数字
|
|
|
|
defaultFileHeaderList.add("504B0304");
|
|
|
|
//获取信安附件文件类型-由文件名获得-fileName不为空,上方有初始化
|
|
|
|
String fileSuffix = fileName.substring(fileName.lastIndexOf(".") + 1);
|
|
|
|
log.info("由文件名获取得文件类型是{}", fileSuffix);
|
|
|
|
if (!ObjectUtils.isEmpty(bytes)) {
|
|
|
|
//获取实际附件请求头-由附件bytes得到-8位
|
|
|
|
String fileHead = getUpperCaseHexString(bytes);
|
|
|
|
log.info("由实际附件获取得文件16位校验码是{}", fileHead);
|
|
|
|
//如果实际文件和获取的文件8位校验码不相符则为非法文件。
|
|
|
|
if (defaultFileHeaderList.stream().noneMatch(fileHead::startsWith)) {
|
|
|
|
log.info("文件不合法,返回空,不进行信安附件校验");
|
|
|
|
return null;
|
|
|
|
} else if (!ObjectUtils.isEmpty(httpResponse) && !ObjectUtils.isEmpty(bytes)) {
|
|
|
|
//如果MongoDB找不到文件,从远程拉去的文件,保存到附件表
|
|
|
|
ByteArrayInputStream byteIn = new ByteArrayInputStream(bytes);
|
|
|
|
// 保存文件
|
|
|
|
FileInfoPO gridFSFile;
|
|
|
|
try {
|
|
|
|
gridFSFile = fileService.storageBackContent(byteIn, fileName);
|
|
|
|
} catch (Exception e) {
|
|
|
|
log.error("文件信息保存到数据库失败{}", e.getMessage(), e);
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
byteIn.close();
|
|
|
|
return gridFSFile;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|