PHP安全編程:HTTP請求欺騙(轉)

一個比欺騙表單更高級和複雜的攻擊方式是HTTP請求欺騙。這給了攻擊者徹底的控制權與靈活性,它進一步證實了不能盲目信任用戶提交的任何數據。php

爲了演示這是如何進行的,請看下面位於http://example.org/form.php的表單:html

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請求:web

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代碼實現:app

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是一個廣爲人知的標準協議,稍有經驗的攻擊者都會對它很是熟悉,而且對常見的安全漏洞的攻擊方法也很熟悉。dom

相對於欺騙表單,欺騙HTTP請求的作法並很少,對它不該該過多關注。我講述這些技巧的緣由是爲了更好的演示一個攻擊者在向你的應用輸入惡意信息時是如何地方便。這再次強調了過濾輸入的重要性和HTTP請求提供的任何信息都是不可信的這個事實。網站

相關文章
相關標籤/搜索