PHP fsockopen是一个功能比较强大的函数。我们在这篇文章中将会对这个函数做一个具体的介绍,希望对大家有所帮助。记得以前的B2C网站就是通过这个函数实现前台和订单处理系统的交互。

PHP fsockopen函数说明:

语法:
resource fsockopen ( string $hostname [, int KaTeX parse error: Expected 'EOF', got '&' at position 20: … = -1 [, int &̲errno [, string &$errstr [, float $timeout = ini_get(“default_socket_timeout”) ]]]] )

开启PHP fsockopen这个函数

PHP fsockopen需要 PHP.ini 中 allow_url_fopen 选项开启。

allow_url_fopen = On

参数:

hostname 如果安装了OpenSSL,那么你也许应该在你的主机名地址前面添加访问协议ssl://或者是tls://,从而可以使用基于TCP/IP协议的SSL或者TLS的客户端连接到远程主机。
port 端口号。如果对该参数传一个-1,则表示不使用端口,例如unix://。
errno 如果errno的返回值为0,而且这个函数的返回值为 FALSE ,那么这表明该错误发生在套接字连接(connect())调用之前,导致连接失败的原因最大的可能是初始化套接字的时候发生了错误。
errstr 错误信息将以字符串的信息返回。
timeout 设置连接的时限,单位为秒。

返回值:

fsockopen() 将返回一个文件句柄,之后可以被其他文件类函数调用(例如: fgets() , fgetss() , fwrite() , fclose() 还有 feof() )。如果调用失败,将返回 FALSE 。

**

php fsockopen使用案例

**

1、fsockopen 来模拟生成 HTTP 连接

<?php$fp = fsockopen("127.0.0.1",80,$errno,$errstr,30);if(!$fp){echo "$errstr ($errno)<br />\n";}else{$out = "GET / HTTP/1.1\r\n";$out .= "Host: 127.0.0.1\r\n";$out .= "Connection: Close\r\n\r\n";fwrite($fp,$out);$content = '';while(!feof($fp)){$content .= fgets($fp,128);}echo $content;fclose($fp);}
?>

运行结果:

2、PHP fsockopen模拟POST/GET方法

fsockopen除了像上面实例模拟生成 HTTP 连接之外,还能实现很多功能,比如模拟post 和 get 传送数据的方法。
get :

<?php
$url = "http://localhost/test2.php?site=www.tbrer.com";
print_r(parse_url($url));// 解析 URL,返回其组成部分/* get提交 */
sock_get($url,'user=gonn');// fsocket模拟get提交
function sock_get($url,$query){$data = array('foo' => 'bar','baz' => 'boom','site' => 'www.tbrer.com','name' => 'nowa magic');$query_str = http_build_query($data);// http_build_query()函数的作用是使用给出的关联(或下标)数组生成一个经过 URL-encode 的请求字符串$info = parse_url($url);$fp = fsockopen($info["host"],80,$errno,$errstr,30);$head = "GET " . $info['path'] . '?' . $query_str . " HTTP/1.0\r\n";$head .= "Host: " . $info['host'] . "\r\n";$head .= "\r\n";$write = fputs($fp,$head);while(!feof($fp)){$line = fread($fp,4096);echo $line;}
}
?>

post :

<?php
$url = "http://localhost/test2.php?site=www.tbrer.com";
print_r(parse_url($url));// 解析 URL,返回其组成部分/* get提交 */
sock_post($url,'user=gonn');// fsocket模拟get提交
function sock_post($url,$query){$info = parse_url($url);$fp = fsockopen($info["host"],80,$errno,$errstr,30);$head = "POST " . $info['path'] . "?" . $info["query"] . " HTTP/1.0\r\n";$head .= "Host: " . $info['host'] . "\r\n";$head .= "Referer: http://" . $info['host'] . $info['path'] . "\r\n";$head .= "Content-type: application/x-www-form-urlencoded\r\n";$head .= "Content-Length: ". strlen(trim($query)) . "\r\n";$head .= "\r\n";$head  .= trim($query);$write = fputs($fp,$head);while(!feof($fp)){$line = fread($fp,4096);echo $line;}
}
?>

接收页面 test2.php 的代码为:

<?php$data = $_REQUEST;echo '<pre>';print_r($data);echo '</pre>';
?>

3、fsockopen以Socket方式模拟HTTP下载文件

<?php/* *   Socket 模拟HTTP协议传输文件*   Http是应用层协议使用80端口*/$hostname = '127.0.0.1';$port = '80';// 建立连接$fp = fsockopen($hostname,$port,$errno,$errstr);stream_set_blocking($fp,true);if(!$fp){echo "$errno : $errstr<br />";}else{// 发送一个HTTP请求信息头$request_header = "GET /aaa.txt";// 起始行// 头域 $request_header .= "Host: $hostname\n";// 再一个回车换行表示头信息结束$request_header .= "\n";// 发送请求到服务器fputs($fp,$request_header);// 接受响应$fp2 = fopen('aaa.txt','w');while(!feof($fp)){$line = fputs($fp2,fgets($fp,128));echo $line;}// 关闭fclose($fp2);fclose($fp);}
?>

执行程序,你会发现在这个程序文件的同级目录就会出现那个你需要下载的文件了。

这实质上是 Socket 模拟HTTP协议传输文件。同时还要注意一下 PHP 的超时限制,这里设置我 PHP 服务器超时为无限才能正确下载,否则可能下载不全 PHP 程序就停止了。

注意:
bool stream_set_blocking ( resource $stream , int $mode )
为 stream 设置阻塞或者阻塞模。

此函数适用于支持非阻塞模式的任何资源流(常规文件,套接字资源流等)。

参数
stream

资源流。mode
如果 mode 为0,资源流将会被转换为非阻塞模式;如果是1,资源流将会被转换为阻塞模式。 该参数的设置将会影响到像 fgets() 和 fread() 这样的函数从资源流里读取数据。 在非阻塞模式下,调用 fgets() 总是会立即返回;而在阻塞模式下,将会一直等到从资源流里面获取到数据才能返回。

返回值
成功时返回 TRUE, 或者在失败时返回 FALSE。

4、使用 fsockopen 伪造来路

<?php
$host = "127.0.0.1"; //你要访问的域名
$ip = '127.0.0.1';
$target = "/test2.php"; //你要访问的页面地址
$referer = "http://www.tbrer.com/"; //伪造来路页面
//$fp = fsockopen($host, 80, $errno, $errstr, 30);
$fp = fsockopen($ip, 80, $errno, $errstr, 30);
if(!$fp)
{echo "$errstr($errno)<br />\n";
}
else
{$end = "\r\n";$out = "GET $target HTTP/1.1$end";$out .= "Host: $ip$end";$out .= "Referer: $referer$end";$out .= "Connection: Close$end";$out .= "$end";fwrite($fp, $out);while(!feof($fp)){echo fgets($fp, 1024);}fclose($fp);
}
?>

test2.php 的代码为:

<?php$data = $_REQUEST;echo '<pre>';print_r($data);echo '</pre>';
?>

可以看到 HTTP_REFERER 的值为 http://www.tribrer.com/,即来路已经伪造成功。

详解PHP fsockopen的使用方法相关推荐

  1. fscokopen php,详解PHP fsockopen的使用方法

    PHP fsockopen是一个功能比较强大的函数.我们在这篇文章中将会对这个函数做一个具体的介绍,希望对大家有所帮助.记得以前的B2C网站就是通过这个函数实现前台和订单处理系统的交互. 还有一个以c ...

  2. php使用fsockopen,详解PHP fsockopen的使用方法_PHP教程

    还有一个以curl_开头的函数,可以实现很多功能.有时间要好好研究!下面是关于fscokopen的介绍 1.PHP fsockopen函数说明: Open Internet or Unix domai ...

  3. 一分钟详解initUndistortRectifyMap函数bug修复方法

    本文首发于微信公众号「3D视觉工坊」--一分钟详解initUndistortRectifyMap函数bug修复方法 在上一篇文章OpenCV中initUndistortRectifyMap函数存在bu ...

  4. Fragment详解之二——基本使用方法

    前言:依然没有前言--文章写的太快,生活过得太有章程,前言都不知道写什么了-- 相关文章: 1.<Fragment详解之一--概述> 2.<Fragment详解之二--基本使用方法& ...

  5. java time 周期性执行,详解ScheduledExecutorService的周期性执行方法

    详解 ScheduledExecutorService 的周期性执行方法 在最近的工作中,需要实现一个当一个任务执行完后,再等 100 毫秒然后再次执行的功能.当时最先反映到的就是 java 线程池的 ...

  6. 图文详解Java环境变量配置方法

    今天动力节点java学院小编为大家介绍"图文详解Java环境变量配置方法",希望对各位小伙伴有帮助,下面就和小编一起来看看Java环境变量配置方法吧. 首先是要安装JDK,JDK安 ...

  7. java mysbatis select_java相关:详解Mybatis中的select方法

    java相关:详解Mybatis中的select方法 发布于 2020-7-3| 复制链接 摘记: selectById方法根据id,查询记录 ```java public void updateRe ...

  8. 详解ScheduledExecutorService的周期性执行方法

    2019独角兽企业重金招聘Python工程师标准>>> 详解 ScheduledExecutorService 的周期性执行方法 在最近的工作中,需要实现一个当一个任务执行完后,再等 ...

  9. jQuery选择器代码详解(一)——Sizzle方法

    对jQuery的Sizzle各方法做了深入分析(同时也参考了一些网上资料)后,将结果分享给大家.我将采用连载的方式,对Sizzle使用的一些方法详细解释一下,每篇文章介绍一个方法. 若需要转载,请写明 ...

最新文章

  1. 这些代码改变了科学界:从Fortran、arXiv到AlexNet
  2. 解决crond引发大量sendmail、postdrop进程问题
  3. 【必看】小公司如何做网络规划
  4. 2018-2019年度 AI方向Top10 综述
  5. SAP UI的加载动画效果和幽灵设计(Ghost Design)
  6. 织梦自定义html文本,织梦自定义标签dede:sql根据自定义字段填的文章id获取相关文章...
  7. 【HDU - 1116】【POJ - 1386】Play on Words(判断半欧拉图,欧拉通路)
  8. 常染色体的隐性疾病数学建模(代数模型)
  9. C++工作笔记-对static_cast的进一步认识(强制转换改变内存,并且删除存在的问题)
  10. 鬼子进村(洛谷 1503)
  11. 第一课~Django~简介
  12. 经典股票图形:蛟龙出海
  13. access建立er图_Visio绘制ER图教程
  14. 再次思考Z = X+Y,Z = XY的概率密度求解
  15. Java2048游戏源代码
  16. 在线更换背景网站(白色背景换为蓝色背景证件照)
  17. [转载]document.readyState
  18. 电脑双屏有一个黑屏_电脑显示器 黑屏(只应对其中一个原因的方案)
  19. 电脑蓝屏黑屏无法开机.BIOS更新.进不去系统只能重装?驱动人生解决方案
  20. [web] request的Content-Type小结

热门文章

  1. 实战丨用云开发快速构建最美AI毕业照小程序
  2. 自定义实现HashMap(简单实现)
  3. 织梦手机端跳转到index.html,两种方法实现织梦自带手机端搜索页直接跳转到search_m.htm手机站页面...
  4. 股票中的一些名词术语(一)
  5. NRF52840学习历程(十一) 幻彩RGB灯WS2812多路(两路)输出
  6. 动态规划-b站up主正月点灯笼DP教程代码python+java版
  7. 再识华为云数据库——GaussDB
  8. python机器学习应用案例---PCA
  9. c语言线索二叉树作用,C语言递归实现线索二叉树
  10. JavaScript截取小数点后2位