1. 危险的字符串拼接:Runtime.exec()的隐秘陷阱
"老张,我这有个Java程序调用系统命令总是报错,你帮我看看?"上周又一位同事拿着他的代码来找我。瞟了一眼,果然又是熟悉的Runtime.exec()里直接拼接字符串执行命令。这种写法在Java项目中太常见了,但就像在代码里埋了颗定时炸弹——今天不炸,明天也得炸。
Runtime.exec()是Java调用系统命令的经典方式,但直接拼接命令字符串会导致至少三类严重问题:
- 命令注入漏洞(最危险)
- 特殊字符解析异常(最常见)
- 跨平台兼容性问题(最隐蔽)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 为什么字符串拼接是定时炸弹?
2.1 命令注入:黑客的VIP通道
java复制// 典型危险写法
String userInput = request.getParameter("filename");
Runtime.getRuntime().exec("sh /scripts/process.sh " + userInput);
当用户输入是"test.txt; rm -rf /"时会发生什么?你的服务器根目录就没了。这就是命令注入攻击——通过拼接用户输入构造恶意命令。
安全警示:所有涉及Runtime.exec()的安全事故中,83%源于未过滤的用户输入(OWASP数据)
2.2 特殊字符:意料之外的"语法错误"
假设要压缩文件:
java复制String path = "/data/my documents/";
Runtime.getRuntime().exec("zip -r archive.zip " + path);
空格会让命令解析为三个参数,而路径实际是一个参数。这类问题在包含空格、引号、$、&等字符时必然出现。
2.3 跨平台噩梦:Windows和Linux的鸿沟
java复制// Windows下正常
Runtime.getRuntime().exec("cmd /c dir C:\\Users");
// Linux下崩溃
Runtime.getRuntime().exec("cmd /c dir C:\\Users");
路径分隔符(/ vs \)、命令差异(dir vs ls)、环境变量等都会导致跨平台运行时失
