在escapeshellcmd的php文档页面中有一个警告:
应该在整个命令字符串上使用转义器(),它仍然允许攻击者传递任意数量的参数。为了转义,应该使用单个参数--转义-- escaping ()。
从这点我能了解到什么:
谢谢你,科斯明
发布于 2013-03-28 02:57:00
总之
假设您的php版本依赖bash执行命令,我们从巴什手册中了解到,
单引号中包含的字符保留引号中每个字符的文字值。单引号之间可能不会出现单引号,即使在前面加上反斜杠时也是如此。
因此,我们可以得出结论,以下创建命令的方法应该足够了:
$c = escapeshellcmd( $cmd ) . ' ' . escapeshellarg( $arg1 );但是,如果需要将$c传递给以下函数之一,则会出现问题: exec、system、passthru等。经验分析表明,这些函数可以评估某些字符。作为一个例子,请尝试如下:
$cmd = 'echo';
$arg = 'TEST\0ING'; // Since we are using single quotes, \0 shouldn't be evaluated as a null byte char
$c = escapeshellcmd( $cmd ) . ' ' . escapeshellarg( $arg1 ); // echo 'TEST\0ING'
exec( $c . ' > output.txt'); // writes TEST without the ING to output.txtexec函数将'\0‘计算为空字节字符,因此output.txt将只包含数据直到'\0’。这已经在运行PHP5.4.6的Ubuntu上进行了测试。在我看来,这是一个错误,因为数据的字面意义丢失了。因此,在完整字符串上使用转义符相对更安全,因为它也转义反斜杠'\‘,这是一个shell元字符:
$c = escapeshellcmd( $cmd . ' ' . escapeshellarg( $arg1 ) );
exec( $c . ' > output.txt'); // writes TEST\0ING to output.txt这种方法的缺点是,其他元字符也将被转义,并且必须由传递参数的程序($cmd)取消转义。
请注意,我们没有在完整的命令字符串上使用转义符。我们省略了doesn> output.txt‘>部分,这样doesn>就不会逃跑了.
Conclusions:
发布于 2013-03-22 19:16:07
因此,我认为escapeshellcmd可以防止多个命令运行。
escapeshellcmd()转义字符串中的任何字符,这些字符可能用于欺骗shell命令执行任意命令。
escapeshellarg是为了确保用户提供的参数只是一个参数。
escapeshellarg()在字符串周围添加单引号,引号/转义任何现有的单引号,允许您将字符串直接传递给shell函数,并将其视为单个安全参数。
因此,从本质上说,如果您(您的程序)正在定义命令,那么您只需要在每个用户提供的参数上使用escapeshellarg,但是如果用户命令命令(除非您已经设置了真正可靠的服务器权限)和参数,那么这两个参数都是非常不确定的。
免责声明:这只是我对文件的解释。
编辑:
我同意这里的文件非常混乱。我认为这一警告意味着将其封装在整个命令周围并不会阻止用户使用这样的参数。
actualArg -someEvilFlag
或
actualArg -someEvilFlag evilFlagArgument发布于 2013-03-22 19:02:01
我要提到的是逃跑和逃避有什么区别?,它将进一步详细介绍每一种方法的优点。
接下来,我想说的是,接受这个用户输入并将它抛到一个shell中,只使用转义的shell可能会导致糟糕的结局。我将重点关注清理和输入验证,并使用上述函数作为代码安全过程的“最后一部分”。
https://stackoverflow.com/questions/15577949
复制相似问题