一个比欺骗表单更高级和复杂的攻击方式是HTTP请求欺骗。这给了攻击者完全的控制权与灵活性,它进一步证明了不能盲目信任用户提交的任何数据。

为了演示这是如何进行的,请看下面位于http://example.org/form.php的表单:

1 <form action="process.php" method="POST">
2   <p>Please select a color:
3   <select name="color">
4     <option value="red">Red</option>
5     <option value="green">Green</option>
6     <option value="blue">Blue</option>
7   </select><br />
8   <input type="submit" value="Select" /></p>
9 </form>

如果用户选择了Red并点击了Select按钮后,浏览器会发出下面的HTTP请求:

1 POST /process.php HTTP/1.1
2 Host: example.org
3 User-Agent: Mozilla/5.0 (X11; U; Linux i686)
4 Referer: http://example.org/form.php
5 Content-Type: application/x-www-form-urlencoded
6 Content-Length: 9
7  
8 color=red

看到大多数浏览器会包含一个来源的URL值,你可能会试图使用$_SERVER['HTTP_REFERER']变量去防止欺骗。确实,这可以用于对付利用标准浏览器发起的攻击,但攻击者是不会被这个小麻烦给挡住的。通过编辑HTTP请求的原始信息,攻击者可以完全控制HTTP头部的值,GET和POST的数据,以及所有在HTTP请求的内容。

攻击者如何更改原始的HTTP请求?过程非常简单。通过在大多数系统平台上都提供的Telnet实用程序,你就可以通过连接网站服务器的侦听端口(典型的端口为80)来与Web服务器直接通信。下面就是使用这个技巧请求http://example.org/页面的例子:

01 $ telnet example.org 80
02 Trying 192.0.34.166...
03 Connected to example.org (192.0.34.166).
04 Escape character is '^]'.
05 GET / HTTP/1.1
06 Host: example.org
07  
08 HTTP/1.1 200 OK
09 Date: Sat, 21 May 2005 12:34:56 GMT
10 Server: Apache/1.3.31 (Unix)
11 Accept-Ranges: bytes
12 Content-Length: 410
13 Connection: close
14 Content-Type: text/html
15  
16 <html>
17 <head>
18 <title>Example Web Page</title>
19 </head>
20 <body>
21 <p>You have reached this web page by typing "example.com",
22 "example.net"or "example.org" into your web browser.</p>
23 <p>These domain names are reserved for use in documentation and are not
24 available for registration. See
25 <a href="http://www.rfc-editor.org/rfc/rfc2606.txt">RFC 2606</a>, Section
26 3.</p>
27 </body>
28 </html>
29  
30 Connection closed by foreign host.
31 $

上例中所显示的请求是符合HTTP/1.1规范的最简单的请求,这是因为Host信息是头部信息中所必须有的。一旦你输入了表示请求结束的连续两个换行符,整个HTML的回应即显示在屏幕上。

Telnet实用程序不是与Web服务器直接通信的唯一方法,但它常常是最方便的。可是如果你用PHP编码同样的请求,你可以就可以实现自动操作了。前面的请求可以用下面的PHP代码实现:

01 <?php
02   
03   $http_response '';
04   
05   $fp fsockopen('example.org', 80);
06   fputs($fp"GET / HTTP/1.1\r\n");
07   fputs($fp"Host: example.org\r\n\r\n");
08   
09   while (!feof($fp))
10   {
11     $http_response .= fgets($fp, 128);
12   }
13   
14   fclose($fp);
15   
16   echo nl2br(htmlentities($http_response, ENT_QUOTES, 'UTF-8'));
17   
18 ?>

当然,还有很多方法去达到上面的目的,但其要点是HTTP是一个广为人知的标准协议,稍有经验的攻击者都会对它非常熟悉,并且对常见的安全漏洞的攻击方法也很熟悉。

相对于欺骗表单,欺骗HTTP请求的做法并不多,对它不应该过多关注。我讲述这些技巧的原因是为了更好的演示一个攻击者在向你的应用输入恶意信息时是如何地方便。这再次强调了过滤输入的重要性和HTTP请求提供的任何信息都是不可信的这个事实。

PHP安全编程:HTTP请求欺骗(转)的更多相关文章

  1. arp协议分析&python编程实现arp欺骗抓图片

    arp协议分析&python编程实现arp欺骗抓图片 序 学校tcp/ip协议分析课程老师布置的任务,要求分析一种网络协议并且研究安全问题并编程实现,于是我选择了研究arp协议,并且利用pyt ...

  2. axios添加了header信息后发送的get请求自动编程option请求了

    axios添加了header信息后发送的get请求自动编程option请求了 webpack 代理转发 Provisional headers are shown 在Vue中如何使用axios跨域访问 ...

  3. 网络编程---(数据请求+slider)将网络上的大文件下载到本地,并打印其进度

    网络编程---将网络上的大文件下载到本地,并打印其进度. 点击"開始传输"button.将网络上的大文件先下载下来,下载完毕后,保存到本地. UI效果图例如以下: watermar ...

  4. Go Web 编程之 请求

    概述 前面我们学习了处理器和处理器函数,如何编写和注册处理器.本文我们将学习如何从请求中获取信息. 请求的结构 通过前面的学习,我们知道处理器函数需要符合下面的签名: func (w http.Res ...

  5. IOS网络编程之请求内容

    资料均来自互联网,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任. 人魔七七:http://www.cnblogs.com/qiqibo/ 一个http请求只要由三 ...

  6. Servlet 编程 http请求类型

    HTTP协议的8种请求类型介绍 HTTP协议中共定义了八种方法或者叫“动作”来表明对Request-URI指定的资源的不同操作方式,具体介绍如下: OPTIONS:返回服务器针对特定资源所支持的HTT ...

  7. TCP网络编程-----客户端请求连接服务器、向服务器发数据、从服务器接收数据、关闭连接

    SOCKET m_sockClient; unsigned short portNum; ------------------------------------------------------- ...

  8. 《PHP安全编程系列》系列分享专栏

    PHP安全编程系列收藏夹收藏了有关PHP安全编程方面的知识,对PHP安全编程提供学习参考 <PHP安全编程系列>已整理成PDF文档,点击可直接下载至本地查阅https://www.webf ...

  9. C# - 多线程 之 异步编程

    异步编程 同步编程,请求响应模型,同步化.顺序化.事务化. 异步编程,事件驱动模型,以 Fire and Forget 方式实现. 异步编程模式  -§- 异步编程模型 (APM) 模式: IAsyn ...

随机推荐

  1. ExtJs4 学习3 combox自动加载的例子

    Ext.onReady(function() {   delivery_datas = [{ "Id" : "1", "Name" : &q ...

  2. 一起来背ABC

    construction 构造,结构 constructor  构造函数,施工员

  3. PHP常用代码:

    1.$array=explode(separator,$string); //字符串->数组 2.$string=implode(glue,$array);//数组->字符串 3.file ...

  4. 快速访问WCF服务--ServiceModel 元数据实用工具 (Svcutil.exe)

    基本定义 ServiceModel 元数据实用工具用于依据元数据文档生成服务模型代码,以及依据服务模型代码生成元数据文档. SvcUtil.exe ServiceModel 元数据实用工具可在 Win ...

  5. 利用Xilinx中的ROM构造查找表来计算sin和cos的方法探讨

    1.使用matlab制作.coe文件 查找表的构造 构造256点的正余弦表 exp(-j*2*pi*(0:255)/256),分别得到 cos和sin的查找表 matlab代码: 求sin fid = ...

  6. 2D地图随机生成

    2D地图随机生成基础绘图 海陆分布

  7. crf 分词(待)

    http://blog.csdn.net/marising/article/details/5769653

  8. Infinite Scroll–无限分页

    一.前言 现在有很多网站都有这样的交互 1.当你往下浏览页面时,页面会自动去异步加载数据. 无限分页效果 infinite scroll 效果图 –ifxoxo.com 2.在页面下方有一个“点击加载 ...

  9. BZOJ 1185 最小矩形覆盖

    Description Input Output Sample Input Sample Output HINT 其实这题就是一道旋转卡壳的裸题,但是我的精度萎了.直接上hzwer的代码吧... #i ...

  10. C#程序设计基础——类、对象、方法

    类与对象 类 类是一种构造,通过使用该构造,用户可以将其他类型的变量.方法和事件组合在一起,从而创建自定义类型.类就像一个蓝图,它定义类型的数据和行为. 对象 定义类之后,便可通过将类加载到内存中来使 ...