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