
本文介绍在java web应用中对上传文件(如pdf、excel)及用户输入内容进行实时安全校验的方法,涵盖javascript自动执行检测、excel公式注入识别、xss风险拦截,并结合正则与文档解析技术构建可扩展的校验体系。
本文介绍在java web应用中对上传文件(如pdf、excel)及用户输入内容进行实时安全校验的方法,涵盖javascript自动执行检测、excel公式注入识别、xss风险拦截,并结合正则与文档解析技术构建可扩展的校验体系。
在现代Web应用开发中,仅依赖后端参数校验或前端过滤远远不足以保障系统安全。尤其当用户可上传PDF、Excel等富文档,或通过表单字段动态生成导出文件时,攻击者可能嵌入恶意JavaScript(如PDF的OpenAction)、危险Excel公式(如=CMD|' /C calc'!A0触发命令执行),甚至利用Office宏或DDE(Dynamic Data Exchange)机制实现客户端提权操作。因此,必须在服务端对文件二进制内容和结构化数据流实施深度扫描。
以下是一个轻量、可集成的安全校验实践方案,基于Apache PDFBox与Apache POI实现:
✅ PDF文件:拦截文档级JavaScript自动执行
PDF中的OpenAction若为PDActionJavaScript,即表示文档打开时将自动运行JS代码,构成典型XSS或沙箱逃逸风险。示例校验逻辑如下:
public static void pdfJavascriptCodeCheck(final byte[] contents) throws PossibleXSSException {
try (PDDocument document = PDDocument.load(new ByteArrayInputStream(contents))) {
PDAction openAction = document.getDocumentCatalog().getOpenAction();
if (openAction instanceof PDActionJavaScript) {
throw new PossibleXSSException("PDF contains auto-executing JavaScript (OpenAction)");
}
} catch (IOException e) {
throw new PossibleXSSException("Failed to parse PDF structure", e);
}
}
⚠️ 注意:还需额外检查
AdditionalActions(如WillSave/DidSave)、嵌入的RichMedia对象及Launch动作,完整防护建议配合PDFBox的COSName.JS遍历与COSObject深度扫描。
✅ Excel文件:识别高危公式与DDE/Command注入
Excel中以=开头的单元格可能包含恶意公式,尤其是含管道符(|)、感叹号(!)及系统命令关键字(如cmd、powershell)的组合。以下正则虽作基础识别,但需谨慎优化:
public class PrivilegeScalingRegexValidator {
// 改进版:更精准匹配DDE/EXEC类注入模式(避免误报纯公式如 "=SUM(A1:A10)")
private static final String DDE_INJECTION_PATTERN =
"^=\s*(?:DDE|EXEC|CMD|SHELL|REG|TEXT|WEBSERVICE)\s*\|.*?![^\r\n]*$";
public static boolean isDangerousFormula(String cellValue) {
if (cellValue == null || !cellValue.trim().startsWith("=")) return false;
return Pattern.compile(DDE_INJECTION_PATTERN, Pattern.CASE_INSENSITIVE | Pattern.MULTILINE)
.matcher(cellValue.trim())
.find();
}
}
在ExcelValidator中调用:
private void checkJavaScriptCodeOnRow(Row row) throws PossiblePrivilegeScalingException {
for (Cell cell : row) {
String value = getCellStringValue(cell);
if (isDangerousFormula(value)) {
throw new PossiblePrivilegeScalingException(
String.format("Suspicious formula detected in cell %s: %s",
new CellAddress(cell.getAddress()).formatAsString(), value));
}
}
}
? 提示:Apache POI 5.2.4+ 已默认禁用DDE链接(需设置
WorkbookFactory.create(fis, password, true)启用严格模式),但仍需业务层主动拦截——因为攻击者可能绕过POI解析直接构造恶意流。
✅ 文本输入与Excel生成环节:防御“二次注入”
当用户在文本框输入如 =HYPERLINK("http://evil.com","click") 并被写入Excel时,该内容虽非直接执行,但在用户双击时仍可能触发跳转或下载。因此,在生成Excel前务必对所有用户输入做输出编码 + 白名单过滤:
// 生成Excel单元格前净化
String safeInput = userText.replaceAll("[=\[\]]", "_") // 禁用公式起始符与引用符
.replaceAll("(?i)cmd|powershell|shell|dde", "_");
cell.setCellValue(safeInput);
?️ 最佳实践与补充建议
- 分层防御:文件校验 ≠ 替代杀毒软件。应将上述逻辑作为第一道网关,再交由商用AV引擎(如ClamAV REST API、Windows Defender ATP)进行二进制特征扫描;
-
沙箱解析:对未知格式文件(如
.docm,.xlsm),应在隔离容器中调用LibreOffice Headless转换为PDF后再校验,规避宏执行风险; -
响应设计:抛出
PossibleXSSException等自定义异常时,应记录完整上下文(文件名、MD5、用户ID、时间戳),并返回HTTP 400 + 安全提示,切勿泄露内部错误堆栈; -
持续演进:定期更新正则规则与文档结构检查点(如新增对PDF中的
AA(Additional Actions)事件、Excel中的ExternalLinkTable的扫描)。
通过将内容解析、语义识别与行为建模相结合,开发者可在不牺牲用户体验的前提下,显著提升文件上传与动态导出场景的安全水位。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











