首页/安全/漏洞与攻击面速查/安全调用外部命令的工程实践
Web 漏洞原理与防护55 条

安全调用外部命令的工程实践

运维工具类系统常需调用外部命令(图像处理、格式转换、备份脚本);应建立统一封装:固定命令与参数白名单、超时、资源限制与输出净化。

漏洞与攻击面速查安全更新于 2026-10-12

封装要点(Python 示意)

封装要点(Python 示意)
import subprocess
ALLOWED = {'convert', 'ffmpeg'}

def run_tool(tool, args, timeout=30):
    if tool not in ALLOWED:
        raise ValueError('tool not allowed')
    proc = subprocess.run([tool, *args], capture_output=True, timeout=timeout, check=False)
    return proc.returncode, proc.stdout

工程要求

工程要求
参数来自枚举/数值/校验后的格式
不允许用户传入命令片段
设置超时与输出大小限制
执行账号降权、工作目录隔离
把命令执行集中到单一封装函数,便于审计与静态检查(检索 subprocess/os.system 调用点)。

易错点

  • 统一了封装函数但参数仍做字符串拼接:函数化不等于安全,参数必须保持『值』语义

数据来源与参考

  • OWASP OS Command Injection Defense Cheat Sheet
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌