1.6 OS命令执行
1.6.1【建议】避免不可信数据拼接操作系统命令
当不可信数据存在时,应尽量避免外部数据拼接到操作系统命令使用 Runtime
和 ProcessBuilder
来执行。优先使用其他同类操作进行代替,比如通过文件系统API进行文件操作而非直接调用操作系统命令。
1.6.2【必须】避免创建SHELL操作
如无法避免直接访问操作系统命令,需要严格管理外部传入参数,使不可信数据仅作为执行命令的参数而非命令。
禁止外部数据直接直接作为操作系统命令执行。
避免通过”cmd”、“bash”、“sh”等命令创建shell后拼接外部数据来执行操作系统命令。
对外部传入数据进行过滤。可通过白名单限制字符类型,仅允许字符、数字、下划线;或过滤转义以下符号:|;&$><`(反引号)!
白名单示例:
private static final Pattern FILTER_PATTERN = Pattern.compile("[0-9A-Za-z_]+");
if (!FILTER_PATTERN.matcher(input).matches()) {
// 终止当前请求的处理
}