客戶端與服務端之間數據的傳輸離不開HTTP,然而HTTP傳輸的過程是否徹底安全呢?答案確定不是javascript
本文介紹HTTP傳輸數據過程當中存在的安全問題及防護前端
用戶側使用的APP、網站、小程序等java
用戶從客戶端發起請求數據到達後端服務的網絡過程,過程當中可能通過負載均衡(elb)、網絡專線、網絡規則VPC等網絡節點node
響應、保存客戶端請求數據git
通常而言,http協議是以明文方式進行傳輸。前端向後端發起http請求,中間都會通過各類各樣的網關、節點、專線等,最後到達目標服務器。可是在傳輸過程當中的節點上,是能夠獲取到http傳輸的信息,能夠隨意的進行數據的竊聽和篡改!這也是http明文傳輸的弊端所在。github
若是沒有保證傳輸層的安全,那麼系統中的xss、csrf防護的措施,也就沒有意義。web
只要用戶的敏感信息在網絡傳輸,就均可以被獲取到。好比銀行的登陸帳號、密碼;郵件內容等chrome
用戶經過客戶端正常訪問某個部署在雲端的A系統,在整個訪問過程當中通過某些節點、網管到達目標服務器,儘管傳輸層存在諸多鏈路,可是這些大多都是XX雲的產品或者開發者自行部署,鏈路相對來講都是受控且安全的。
若是在整個傳輸過程當中加入另外一臺不受控制且不安全的代理服務器尼?
舉幾個例子:
1.公共wifi
2.國內是沒法直接訪問網外,可是加上代理就能夠
3.訪問部署在XX雲上的服務,出現了XX雲的廣告
4.攻擊者號稱快速安全的代理服務器
...shell
這些都是經過代理服務器的方式去訪問目標服務器,此時就能夠在代理服務器中作處理,去竊聽、篡改用戶數據。
HTTP傳輸竊聽就是發生在代理服務器中。npm
主要以nodejs的代理工具庫-anyproxy爲主講解
阿里開源的代理服務器,用於移動端的抓包測試等
官網地址:github.com/alibaba/any…
一、AnyProxy 是阿里巴巴基於 Node.js 開發的一款開源代理服務器
二、代理服務器站在客戶端和服務端的中間,它能夠收集雙方通訊的每一個比特。一個完整的代理請求過程爲:客戶端首先與代理服務器建立鏈接,接着根據代理服務所使用的代理協議,請求對目標服務器建立鏈接或者獲取目標服務器的指定資源。一些代理協議容許代理服務器改變客戶端的原始請求、目標服務器的原始響應。
三、AnyProxy 是徹底能夠靈活配置的代理服務器。它支持 https明文代理 ,且提供了 Web 界面便於觀測請求狀況,同時支持二次開發,能夠用 JavaScript 來控制代理的所有流程,搭建前端個性化調試環境。
一、全局安裝
npm install -g anyproxy
複製代碼
二、默認啓動
anyproxy #默認啓動端口8001
# 或者
anyproxy --port 8001
複製代碼
三、可視化訪問
pc端訪問http://127.0.0.1:8002/
,進入web可視化頁面訪問
這步結束,anyproxy配置完畢,接着配置瀏覽器代理
四、配置chrome代理
a.chrome-設置-高級-打開您計算機的代理設置
b.代理-使用代理服務器-配置地址:127.0.0.1 端口:8001
訪問目標網址後,便可在anyproxy的可視化界面上看到傳輸數據
經過代理服務器訪問目標服務器,過程當中全部的傳輸數據對於代理服務器來說,都將是可獲取、可修改的。
規則模塊是AnyProxy的特性。能夠說是一箇中間件,在中間件中編寫本身的代碼能夠在傳輸的任何階段來竊聽、篡改請求。
官方簡易版request_header.js
/* sample: modify the user-agent in requests toward httpbin.org test: curl http://httpbin.org/user-agent --proxy http://127.0.0.1:8001 */
module.exports = {
*beforeSendRequest(requestDetail) {
if (requestDetail.url.indexOf('http://httpbin.org') === 0) {
const newRequestOptions = requestDetail.requestOptions;
newRequestOptions.headers['User-Agent'] = 'AnyProxy/0.0.0';
return {
requestOptions: newRequestOptions
};
}
},
};
複製代碼
官方簡易版response_header.js
/* sample: modify response header of http://httpbin.org/user-agent test: curl -I 'http://httpbin.org/user-agent' --proxy http://127.0.0.1:8001 expected response: X-Proxy-By: AnyProxy */
module.exports = {
*beforeSendResponse(requestDetail, responseDetail) {
if (requestDetail.url.indexOf('http://httpbin.org/user-agent') === 0) {
const newResponse = responseDetail.response;
newResponse.header['X-Proxy-By'] = 'AnyProxy';
return {
response: newResponse
};
}
}
};
複製代碼
再將規則配置進代理服務器,就能夠完成代理服務器的搭建
var proxy = require("anyproxy");
//create cert when you want to use https features
//please manually trust this rootCA when it is the first time you run it
!proxy.isRootCAFileExists() && proxy.generateRootCA();
var options = {
type : "http",
port : 8001,
hostname : "localhost",
rule : require("path/to/my/ruleModule.js"),//代理規則
dbFile : null, // optional, save request data to a specified file, will use in-memory db if not specified
webPort : 8002, // optional, port for web interface
socketPort : 8003, // optional, internal port for web socket, replace this when it is conflict with your own service
throttle : 10, // optional, speed limit in kb/s
disableWebInterface : false, //optional, set it when you don't want to use the web interface
setAsGlobalProxy : false, //set anyproxy as your system proxy
silent : false //optional, do not print anything into terminal. do not set it when you are still debugging.
};
new proxy.proxyServer(options);
複製代碼
經過分析,在規則代碼邏輯裏就能夠竊聽、保存、篡改用戶經過代理服務器訪問目標服務器的請求及響應數據。
由此聯想,公共場所的wifi、訪問國外的代理服務器...一旦被攻擊者利用,對於用戶來說就不存在數據安全可言。
用戶名密碼加密,加密方法越複雜越安全。
根據須要,常見的MD5(不可逆),aes(可逆)自由搭配,再加入特殊符號等。
HTTP+TLS(SSL)=>HTTPS
基於HTTP協議,經過SSL或TLS提供加密處理數據、驗證對方身份以及數據完整性保護。
客戶端——中間層——目標服務器
中間層能夠解密瀏覽器發送的數據,而後加密後發送給服務器。可是這樣也會收到http的竊聽和篡改風險。這時就須要認證過程。 加密解密必須是可信任的——CA證書機制。
瀏覽器會內置信任列表,標識目標網站服務器是否安全可信。 目標服務器須要向CA證書發佈的機構進行證書申請。有證書的網站在訪問時,瀏覽器會對比目標服務器域名信息和CA證書的信任信息是否相同,若是信任的網站,就可正常訪問。