跳到主要内容

系统命令注入

根本解决办法

  • 避免使用可以启动 Shell 的功能
    • 比如 Perl 的 open 函数,如果在它的文件名参数里混有管道符号(|)就会执行系统命令。如果将外部的输入直接用作参数是很危险的。这种情况可以使用 sysopen 这类不会启动 shell 的函数来代替。

保险对策

  • 如果非要使用可以启动 shell 命令的函数,要对所有参数进行检查,只执行许可的部分。
    • 推荐使用白名单的方式进行检查,看看参数里是不是只有允许的文字组合。如果含有不许可的文字组合,就马上中止处理。
    • 黑名单的方式(例如参数里混有 |<>;& 这一类对 shell 有特殊含义的符号就中止处理)容易出现遗漏,只应作为辅助手段,不要单独依赖它。