參考鏈接:http://www.cnblogs.com/jivi/archive/2013/03/10/2952829.html
一、為什么要攔截檢查請求?
防止重放攻擊、篡改重放,進行使用規格檢查
1、請求可能是重放攻擊
重放攻擊的基本原理就是把以前竊聽到的數據原封不動地重新發送給接收方。很多時候,網絡上傳輸的數據是加密過的,此時竊聽者無法得到數據的準確意義。但如果他知道這些數據的作用,就可以在不知道數據內容的情況下通過再次發送這些數據達到愚弄接收端的目的。
例如,有的系統會將鑒別信息進行簡單加密后進行傳輸,這時攻擊者雖然無法竊聽密碼,但他們卻可以首先截取加密后的口令然后將其重放,從而利用這種方式進行有效的攻擊。
再比如,假設網上存款系統中,一條消息表示用戶支取了一筆存款,攻擊者完全可以多次發送這條消息而偷竊存款。
2、請求可能是篡改重放
網上有一些工具,如:IEC、fiddler,可以攔截IE表單請求,篡改請求報文數據后再提交給服務器。
- 實現攔截請求,篡改數據功能的方法有很多,如使用WINPCAP,直接從網卡截包然后篡改,或者HOOK住SEND函數,或者其它相關的網絡API。
- 使用WINPCAP實現這個功能,有點牛刀殺雞了,而使用HOOK技術,又不是太安全,基本上帶主動防御,智能行為分析的殺軟,HOOK用到的幾個函數都是被嚴密監控的。
- 我們還可以采用--代理攔截技術,看到代理兩個字,稍稍有點計算機知識的人,第一時間反應的詞語應該都是代理服務器,是的,代理攔截技術,正是基于代理服務器技術實現的。
一般的請求發送模式:
?
加入代理服務器后:
使用代理服務器后,所有的HTTP請求,都是先發到代理服務器,然后由代理服務器重新包裝后,再發給目標(實際)服務器,響應也是如此,
代理服務器先接收來自目標(實際)服務器的響應,然后包裝后發給客戶機。
所以,實現一個代理服務器,就可以攔截請求,篡改數據了。?
如何實現一個代理服務器,參見:http://www.cnblogs.com/jivi/archive/2013/03/10/2952829.html
3、需要對客戶請求進行使用規格限制
? ? ? ?同時在線請求控制
? ? ? ?時段訪問總量控制
? ? ? ? 。。。
二、網關控制
1、請求防攻擊,默認關閉?
? ? ? ?timestamp檢查 & nonce檢查
1.1、timestamp檢查
?
1.2、nonce檢查
?
2、請求防篡改,簽名比對
為了對識別有效的客戶端,我們可以對請求進行防篡改檢查,具體的做法就是客戶端對請求進行簽名發送,服務端進行簽名比對。
合法的客戶端是屬于某個開發者的,這個開發者申請使用某個api獲得服務提供者同意后,可以通過注冊中心綁定一對前端訪問密鑰,這對密鑰包括一個key和一個secret,開發者的客戶端使用secret對要發送的請求進行簽名后,在請求中攜帶key和簽名,發送請求給網關。
網關會根據請求中攜帶的key在注冊中心找到對應的secret,重新對請求進行簽名,和請求中攜帶的簽名進行比對,一致則放行,不一致則認為這個請求是被篡改過的。
2.1、客戶端簽名過程
- 請求頭中要攜帶簽名key:x-ca-front-devclientkeyey=客戶端簽名key
- 請求頭中要指定參與簽名的請求頭,請區分大小寫:x-ca-front-sign-headers='x-ca-front-timestamp,x-ca-front-nonce'
- 請求頭中要攜帶使用簽名key和簽名算法計算的簽名串:x-ca-front-signature=客戶端簽名
以下是請求簽名Sign類中定義的網關側請求頭
2.2、簽名算法
?
- String secret:簽名密鑰DevClientSecret
- String uri:服務端用request.getUri()返回的內容, 不帶參數
- String httpMethod:POST/GET/DELETE/PUT
- Map<String, String> headersToSign:要參與簽名的頭key列表,用英文逗號隔開
- Map<String, Object> paramsMap:如果是Get,所有參數列表,如果是post,url后面跟的參數列表
- byte[] inputStreamBytes:如果是post-bytes和put-bytes,就是body體的bytes;如果是post-form,字典序的參數列表串.getBytes()