1. 程式人生 > 其它 >PHP網路技術(二)——模擬網路灌水攻防

PHP網路技術(二)——模擬網路灌水攻防

PHP網路技術(二)——模擬網路灌水攻防

(原創內容,轉載請註明來源,謝謝)

一、概念

網路上如留言板、論壇等,可以提交評論的地方,或者其他可以給使用者提交內容並且需要存入資料庫的地方,就存在灌水的可能。灌水,即破壞者通過大量輸入無用資訊,造成網站負擔嚴重,資料庫儲存空間變大,多了大量無用的資料。

二、瀏覽器

瀏覽器是一個實現HTTP協議的客戶端軟體,在整個過程中,作為一個執行者,負責訊息傳送和接收展示。因此,模擬傳送資訊就是模擬HTTP協議和伺服器進行互動。

三、PHP

在客戶端可以用AJAX傳送請求,服務端PHP有自帶的函式,也可以用抓包軟體如Fiddler構造HTTP Request包。

PHP自帶處理HTTP的函式如下:

1)get_headers(解釋的內容來自PHPManual)

該函式取得伺服器響應一個 HTTP 請求所傳送的所有標頭,返回包含有伺服器響應一個 HTTP 請求所傳送標頭的索引或關聯陣列,如果失敗則返回 FALSE。

格式是array get_headers( string $url [, int $format = 0 ] ),URL是目標URL,如果將可選的format 引數設為 1,則get_headers() 會解析相應的資訊並設定陣列的鍵名。

2)file系列函式

file系列如fopen、file_get_contents等,不僅可以操作檔案,也可以操作網路資源。

3)stream系列函式

該系列是流處理函式,可以傳送各種協議的檔案,不僅限於HTTP,在modernphp讀書筆記裡面有詳細的介紹。

4)Socket系列函式

可以通過Socket的套接字方式,傳送和請求資料,包括但不限於HTTP協議。

5)curl擴充套件庫

CURL是一個非常強大的開源庫,支援很多協議,包括HTTP、FTP、TELNET等,我們使用它來發送HTTP請求。它給我們帶來的好處是可以通過靈活的選項設定不同的HTTP協議引數,並且支援HTTPS。CURL可以根據URL字首是“HTTP”還是“HTTPS”自動選擇是否加密傳送內容。

6)http_build_query

生成請求串。用該函式或者file系列函式,PHP會自動建立一個變數叫做$http_response_header,用於儲存HTTP響應的報頭。

四、模擬傳送垃圾評論

為了模擬傳送垃圾評論,先自己建一個html,用於簡單的評論,將評論提交到資料庫,採用ajax的方式獲取頁面資料往後臺傳。較為簡單就不附上程式碼。

然後,再建立一個php頁面,用於傳送垃圾評論。程式碼如下:

<?php
$data = array('comment' => 'attackcomment');
$data = http_build_query($data);
$opts = array(
         'http'=> array(
                   'method'=> 'POST',
                   'header'=> 'Content-type:application/x-www-form-urlencoded; charset=UTF-8'.'rn'
                                               .'Content-Length:'.strlen($data).'rn'
                                               .'User-Agent:Mozilla/5.0(Windows NT 6.1; Win64; x64; rv:53.0) Gecko/20100101 Firefox/53.0'.'rn'
                                               .'Referer:http://127.0.0.1/phpnet/remark.html'.'rn',
                   'content'=> $data
         )
);
$context = stream_context_create($opts);
ini_set('user_agent','Mozilla/5.0 (WindowsNT 6.1; Win64; x64; rv:53.0) Gecko/20100101 Firefox/53.0');
$html =@file_get_contents('http://127.0.0.1/phpnet/remark.html', false, $context);

上述使用到了http_build_query、stream_context_create、file_get_contents等函式,頁面重新整理一次就提交一條資料到資料庫。而如果把$html放到for迴圈裡面,可以每次重新整理頁面就提交更多資料,對資料庫造成極大的風險。

五、防範措施

防範措施通常有四種:IP限制、驗證碼、Token和表單欺騙、稽核機制。

1、IP限制

HTTP協議是應用層協議,是基於TCP/IP的協議,因此IP難以偽造。可以使用PHP的SERVER中的變數REMOTE_ADDR,功能是瀏覽當前頁面的使用者的 IP 地址。

關於PHP獲取IP的方法,除了REMOTE_ADDR,還有HTTP_CLIENT_IP、HTTP_X_FORWARDED_FOR等。

比較:REMOTE_ADDR不可以顯式的偽造,雖然可以通過代理將ip地址隱藏,但是這個地址仍然具有參考價值,因為它就是與你的伺服器實際連線的ip地址。當伺服器直接暴露在客戶端前面的時候,只需要讀取REMOTE_ADDR就行了,其他方法都不可信。

相比之下,HTTP_CLIENT_IP、HTTP_X_FORWARDED_FOR這兩種ip地址都可以通過http header來偽造,但並不意味著它們一無是處。生產環境中很多伺服器隱藏在負載均衡節點後面,你通過REMOTE_ADDR只能獲取到負載均衡節點的ip地址,一般的負載均衡節點會把前端實際的ip地址通過HTTP_CLIENT_IP或者HTTP_X_FORWARDED_FOR這兩種http頭傳遞過來。後端再去讀取這個值就是真實可信的,因為它是負載均衡節點告訴你的而不是客戶端。

IP限制就是獲取使用者請求的IP,然後再加以判斷,可以自己設定規則。比如一段時間內連續傳送請求,則設定成黑名單或者禁用幾小時;或者設定一個IP一段時間內只能提交一次內容等。

2、Token

該方法的目的在於加大供給的難度。可以在html頁面隱藏一些內容,如可變的Token,每次提交都要和伺服器進行校對,如果不通過則提交失敗。

具體方法為,在前臺傳一個碼到後臺,後臺利用時間、加密等進行計算,這樣就沒法簡單的用for迴圈來進行攻擊,而需要可變動的提交內容,加大攻擊的難度。

3、驗證碼

驗證碼是有效的防止措施,當要求比較高時,往往可以設計複雜的驗證碼,如12306的驗證碼。還有淘寶等需要滑動的驗證碼,安全性相對也較高。雖然這樣對使用者不夠友好,但是卻可以防止網站被灌水攻擊。

4、人工稽核

這是最後一道坎,即將使用者提交的內容先存到一個臨時表,經人工稽核通過後的資料遷移到正式的表中。甚至可以將臨時表的資料庫放到一個獨立的伺服器,這樣即使被攻擊導致崩潰也不會影響到其他正常的業務。

六、抓包工具

抓包在前端、網路開發等具有重要作用,對於手機APP介面開發也具有重要作用,通過抓包可以判斷每個請求服務端的事件所呼叫的PHP端的路徑、類名、方法名、傳的引數等,對於除錯具有重要作用。

對於抓包工具,我最熟悉的是Fiddler,此為免費軟體,網路上有很多使用方法介紹的很詳細,在此貼上幾個我覺得講的不錯的連結。

http://blog.csdn.net/qq_21445563/article/details/51017605

http://www.cnblogs.com/Darren_code/archive/2011/09/28/Fiddler.html

——written by linhxx 2017.07.15