跳到主要内容

系统命令注入

根本解决办法

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

保险对策

  • 如果非要使用可以启动 shell 命令的函数,要对所有参数进行检查,只执行许可的部分。
    • 例如可以使用白名单的方式进行检查,看看参数里是不是只有允许的文字组合。如果含有不许可的文字组合,就马上中止处理。
    • 也可以使用黑名单的方式进行检查,例如参数里混有 <> 这一类会引发注入的符号就马上中止处理。