1.6 OS命令执行

1.6.1【建议】避免不可信数据拼接操作系统命令

当不可信数据存在时,应尽量避免外部数据拼接到操作系统命令使用 RuntimeProcessBuilder 来执行。优先使用其他同类操作进行代替,比如通过文件系统API进行文件操作而非直接调用操作系统命令。

1.6.2【必须】避免创建SHELL操作

如无法避免直接访问操作系统命令,需要严格管理外部传入参数,使不可信数据仅作为执行命令的参数而非命令。

  • 禁止外部数据直接直接作为操作系统命令执行。

  • 避免通过”cmd”、“bash”、“sh”等命令创建shell后拼接外部数据来执行操作系统命令。

  • 对外部传入数据进行过滤。可通过白名单限制字符类型,仅允许字符、数字、下划线;或过滤转义以下符号:|;&$><`(反引号)!

    白名单示例:

    1. private static final Pattern FILTER_PATTERN = Pattern.compile("[0-9A-Za-z_]+");
    2. if (!FILTER_PATTERN.matcher(input).matches()) {
    3. // 终止当前请求的处理
    4. }