运行任意用户命令就像运行基于用户输入的查询......转义是关键。
首先,验证它是否是使用is_executable()
的可执行文件。
PHP暴露了两个功能是:escapeshellarg()
和escapeshellcmd()
。
escapeshellarg()
围绕字符串添加单引号,引号/转义所有现有单引号,允许您将字符串直接传递给shell函数并将其视为单个安全参数。
escapeshellcmd()
逸出在可能用于欺骗外壳命令到执行任意的命令字符串的任何字符。
这应该限制风险的大小。
if(is_executable($somethingAUserHasEntered)) {
shell_exec(escapeshellarg($somethingAUserHasEntered) . " --version");
}
毕竟,做rm --version
也不是很有害的,"rm -rf/&&" --version
将让你在任何地方非常快。
编辑:既然你提到PATH
...这里是一个快速的函数来验证,如果该文件是可执行根据PATH
规则:
function is_exec($file) {
if(is_executable($file)) return true;
if(realpath($file) == $file) return false; // Absolute Path
$paths = explode(PATH_SEPARATOR, $_ENV['PATH']);
foreach($paths as $path) {
// Make sure it has a trailing slash
$path = rtrim($path, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
if(is_executable($path . $file)) return true;
}
return false;
}
+1我个人不会提示用户,但只会沿着路径寻找.exe是的,我想他们可以重新命名mysql,但这有多现实?在最糟糕的情况下,您可能会输出“对不起,我无法在路径上找到mysql(.exe)。是否已安装?可能是您重命名了它?” –
Mawg
2010-06-08 05:22:34