本文作者:心月

php执行shell命令的安全隐患

心月IT博客 2019-10-28
php执行shell命令的安全隐患摘要:在php项目中执行shell命令可以通过exec、system函数来执行,在php5.4以前的版本中使用这两个函数时需要关闭安全模式,可见官方都认为这两个函数存在安全隐患。

        在php执行shell命令可以通过exec、system函数来执行,在php5.4以前的版本中使用这两个函数时需要关闭安全模式,可见官方都认为这两个函数存在安全隐患。虽然php5.4以后移除了安全模式,但这两个函数的安全隐患依然存在。

下面通过php手册上对这两个函数的解释来具体说说。

1、exec——执行一个外部程序

        语法 : string exec ( string command [, array &output [, int &return_var]] )
  说明 :
  exec( )执行给予的命令command,不过它并不会输出任何东西,它简单的从命令的结果中传回最后一行,如果你需要去执行一个命令,并且从命令去取得所有资料时,可以使用passthru( )这个函数。
  如果有给予参数array,则指定的数组将会被命令所输出的每一行填满,注意 : 如果数组先前已经包含了一些元素的话,exec( )将会把它附加在数组的后面,如果你不想要此函数附加元素的话,你可以在传递此数组给exec( )之前呼叫unset( )。
  如果有给予参数array和return_var,则传回执行的状态命令将会写到这个变量。
  注意 : 如果你允许来自使用者输入的资料,可以传递到此函数,那么你应该使用escapeshellcmd( )来确定此使用者无法哄骗(trick)系统来执行武断的(arbitrary)命令。
  【注意】 : 如果你使用此函数来启动一个外部程序,而且希望在背景里(background)执行的时候离开它,你必须确定此程序的输出是转向(redirected)到一个文件或是一些输出的资料流,否则PHP将会悬挂(hang)直到程式执行结束。  


2、system——执行外部程序,并且显示输出

        语法 : string system ( string command [, int &return_var] )
  说明 :
  system( )执行给予的命令command,并且输出结果。如果有给予参数return_var,则执行命令的状态码将会写到这个变量。
  注意 : 如果你允许来自使用者输入的资料,可以传递到此函数,那么你应该使用escapeshellcmd( )来确定此使用者无法哄骗(trick)系统来执行武断的(arbitrary)命令。
  【注意】 : 如果你使用此函数来启动一个程式,而且希望在背景里(background)执行的时候离开它,你必须确定此程式的输出是转向(redirected)到一个文件或是一些输出的资料流,否则PHP将会悬挂(hang)直到程式执行结束。
  如果PHP是运作成伺服器模组,在输出每一行后,system( )会试着自动地清除web伺服器的输出缓冲。
  成功则传回命令的最后一行,失败则传回false。
  如果你需要去执行一个命令,并且从命令去取得所有资料时,可以使用passthru( )这个函数。

  虽然 exec 和 system 都是用来调用系统shell命令, 它们之间还是有不同点的:

        exec可以把执行的结果全部返回到$output函数里(数组),$status是执行的状态 0为成功 1为失败
  systerm不需要提供$output函数,他是直接把结果返回出来,同样$return_var是执行的状态码 0为成功 1为失败 。

        


文章版权及转载声明:

本文由 心月IT技术博客 博主整理于 2019-10-28
若转载请注明原文及出处:https://www.xinyueseo.com/other/442.html

分享到:
赞(
发表评论
快捷输入:

验证码

    评论列表 (有 0 条评论,人围观)参与讨论