客户端与服务端之间数据的传输离不开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证书的信任信息是否相同,若是信任的网站,就可正常访问。