人人都会AI编程

15.1 命令执行安全注意事项

更新时间:2026-06-28

在代码中调用系统命令(如 execsystemsubprocess 等)时,务必遵循以下安全实践,防止命令注入和权限提升风险:

1. 禁止直接拼接用户输入
永远不要将用户输入的数据直接拼接到命令字符串中。攻击者可通过分号、管道符、反引号等特殊字符注入任意命令。

# 危险
os.system("ping " + user_input)

# 安全  
subprocess.run(["ping", user_input], shell=False)

2. 使用参数列表而非字符串
优先使用数组/列表形式传递命令参数,并确保 shell=False(或对应语言的安全模式),避免 Shell 解释器解析元字符。

3. 严格校验输入白名单
对用户输入实施白名单校验(正则表达式或允许字符集),仅允许字母、数字、有限的安全符号。拒绝包含 ;|&$\'"` 等危险字符的输入。

4. 使用绝对路径执行命令
指定命令的绝对路径(如 /usr/bin/ping 而非 ping),避免 PATH 环境变量被篡改导致的命令劫持。

5. 最小权限原则
命令执行进程应使用低权限账户(如 nobodywww-data),禁止以 root 或管理员身份运行外部命令。必要时通过 sudo 限定允许执行的特定命令。

6. 清理环境变量
执行前清除或重置敏感环境变量(如 PATHLD_PRELOADPYTHONPATH),防止动态链接库劫持或环境注入攻击。

7. 设置超时与资源限制
为外部命令设置执行超时(如 30 秒)和 CPU/内存资源上限,防止 fork 炸弹或死循环导致拒绝服务。

8. 禁用危险函数
生产环境中禁用 evalexecsystem 等高危函数。如必须使用,应经过代码审计并启用沙箱(如 seccomp、chroot)。

9. 输出与错误处理

  • 捕获并检查命令返回值(exit code),非零退出视为失败
  • 错误信息返回前端时脱敏,避免泄露系统路径、版本等敏感信息

10. 审计日志
记录所有执行的命令、参数、执行用户和时间戳,便于事后追溯。日志应独立存储,防止被篡改。

总结:能不执行系统命令就不执行;必须执行时,视为处理不可信数据,采用参数化传递、白名单校验、最小权限三层防护。