系统命令注入
根本解决办法
- 避免使用可以启动 Shell 的功能
- 比如 Perl 的 open 函数,如果在它的文件名参数里混有管道符号(
|)就会执行系统命令。如果将外部的输入直接用作参数是很危险的。这种情况可以使用 sysopen 这类不会启动 shell 的函数来代替。
- 比如 Perl 的 open 函数,如果在它的文件名参数里混有管道符号(
保险对策
- 如果非要使用可以启动 shell 命令的函数,要对所有参数进行检查,只执行许可的部分。
- 推荐使用白名单的方式进行检查,看看参数里是不是只有允许的文字组合。如果含有不许可的文字组合,就马上中止处理。
- 黑名单的方式(例如参数里混有
|、<、>、;、&这一类对 shell 有特殊含义的符号就中止处理)容易出现遗漏,只应作为辅助手段,不要单独依赖它。