避免使用system()等危险函数,优先采用subprocess.run(args, shell=False)或fork()+exec();2. 严格校验输入,使用白名单过滤字符,限制长度,禁用;、|、&等特殊符号;3. 用专用API替代shell命令,如opendir()代替ls,socket代替ping;4. 遵循最小权限原则,以低权限账户运行服务,结合容器或chroot隔离环境。核心是不信任用户输入,杜绝命令拼接,坚持参数化调用。

Shell注入是由于程序将用户输入直接传递给系统shell执行,导致攻击者通过特殊字符操控命令逻辑。在Linux环境中,防止Shell注入的核心在于严格输入校验与避免直接调用shell。以下是有效的防护策略。
1. 避免使用危险的shell执行函数
很多编程语言提供直接执行系统命令的接口(如C的system()、Python的os.system()、PHP的exec()等),这些函数若传入未过滤的用户输入,极易引发注入。
建议做法:
- 优先使用语言提供的安全替代方式,例如Python使用subprocess.run(args, shell=False),其中args为列表形式,避免解析shell元字符。
- 在C语言中,尽量使用fork() + exec()组合,而不是system()。
- 不设置shell=True,除非绝对必要。
2. 严格输入校验与白名单过滤
对所有来自外部的输入(如表单、URL参数、配置文件)进行格式和内容检查。
有效方法包括:
- 使用正则表达式限制输入字符,仅允许字母、数字及必要符号。例如只允许[a-zA-Z0-9._-]。
- 对文件名、用户名等字段长度设限,防止超长或异常构造。
- 拒绝包含;、|、&、$、`、(、)、、>等shell控制字符的输入。
3. 使用安全的API与参数化调用
许多系统操作可通过专用API完成,无需调用shell。
示例:
- 需要列出目录内容时,使用opendir()/readdir()而非ls命令。
- 文件操作使用系统调用(如open()、unlink())代替rm或cat。
- 网络检测使用socket API,而不是ping + 字符串拼接。
4. 最小权限原则与环境隔离
即使发生注入,也应限制其影响范围。
实施建议:
- 运行服务的用户应使用低权限账户,避免以root身份执行脚本。
- 使用容器或chroot环境隔离关键操作。
- 关闭不必要的系统命令访问权限(如移除非必需的二进制文件或设置PATH限制)。
基本上就这些。关键是不依赖“用户不会乱输”这种假设,始终把输入当作潜在威胁处理。只要避免拼接命令字符串、坚持参数分离、做好校验,Shell注入风险就能大幅降低。









