参考链接: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()