首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >逃逸警告

逃逸警告
EN

Stack Overflow用户
提问于 2013-03-22 18:59:24
回答 3查看 6.6K关注 0票数 5

escapeshellcmd的php文档页面中有一个警告:

应该在整个命令字符串上使用转义器(),它仍然允许攻击者传递任意数量的参数。为了转义,应该使用单个参数--转义-- escaping ()。

从这点我能了解到什么:

  1. 我是否应该始终使用转义来转义整个命令字符串,包括已经用escpaeshellarg转义的参数?
  2. 我是否应该只转义不是参数的命令项(如果你问我,这是唯一合乎逻辑的事情)?
  3. 我是否应该忽略这个令人怀疑的警告,因为它对这两个函数如何相互补充造成了更多的混淆?

谢谢你,科斯明

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-28 02:57:00

总之

  • escapeshellarg:用于用单引号将参数括起来,并在参数中转义引号。
  • escapeshellcmd:用于转义shell元字符,即<、>、\\等。

假设您的php版本依赖bash执行命令,我们从巴什手册中了解到,

单引号中包含的字符保留引号中每个字符的文字值。单引号之间可能不会出现单引号,即使在前面加上反斜杠时也是如此。

因此,我们可以得出结论,以下创建命令的方法应该足够了:

代码语言:javascript
复制
$c = escapeshellcmd( $cmd ) . ' ' . escapeshellarg( $arg1 );

但是,如果需要将$c传递给以下函数之一,则会出现问题: exec、system、passthru等。经验分析表明,这些函数可以评估某些字符。作为一个例子,请尝试如下:

代码语言:javascript
复制
$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.txt

exec函数将'\0‘计算为空字节字符,因此output.txt将只包含数据直到'\0’。这已经在运行PHP5.4.6的Ubuntu上进行了测试。在我看来,这是一个错误,因为数据的字面意义丢失了。因此,在完整字符串上使用转义符相对更安全,因为它也转义反斜杠'\‘,这是一个shell元字符:

代码语言:javascript
复制
$c = escapeshellcmd( $cmd . ' ' . escapeshellarg( $arg1 ) );
exec( $c . ' > output.txt'); // writes TEST\0ING to output.txt

这种方法的缺点是,其他元字符也将被转义,并且必须由传递参数的程序($cmd)取消转义。

请注意,我们没有在完整的命令字符串上使用转义符。我们省略了doesn> output.txt‘>部分,这样doesn>就不会逃跑了.

Conclusions:

  • 尽量避免将字符串作为命令行参数传递。相反,将数据写入文件并从文件中读取。通过这种方式,您可以确保正在传递的数据保持不变。
  • 如果您绝对需要将字符串作为命令行参数传递,请始终确保它们是字母数字。
  • 如果您绝对需要将字符串作为命令行参数传递,则在完整字符串上使用转义符相对更安全。
票数 7
EN

Stack Overflow用户

发布于 2013-03-22 19:16:07

因此,我认为escapeshellcmd可以防止多个命令运行。

escapeshellcmd()转义字符串中的任何字符,这些字符可能用于欺骗shell命令执行任意命令。

escapeshellarg是为了确保用户提供的参数只是一个参数。

escapeshellarg()在字符串周围添加单引号,引号/转义任何现有的单引号,允许您将字符串直接传递给shell函数,并将其视为单个安全参数。

因此,从本质上说,如果您(您的程序)正在定义命令,那么您只需要在每个用户提供的参数上使用escapeshellarg,但是如果用户命令命令(除非您已经设置了真正可靠的服务器权限)和参数,那么这两个参数都是非常不确定的。

免责声明:这只是我对文件的解释。

编辑:

我同意这里的文件非常混乱。我认为这一警告意味着将其封装在整个命令周围并不会阻止用户使用这样的参数。

actualArg -someEvilFlag

代码语言:javascript
复制
actualArg -someEvilFlag evilFlagArgument
票数 2
EN

Stack Overflow用户

发布于 2013-03-22 19:02:01

我要提到的是逃跑和逃避有什么区别?,它将进一步详细介绍每一种方法的优点。

接下来,我想说的是,接受这个用户输入并将它抛到一个shell中,只使用转义的shell可能会导致糟糕的结局。我将重点关注清理和输入验证,并使用上述函数作为代码安全过程的“最后一部分”。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15577949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档