WebSocket协议分析
1.什么是WebSocket协议
WebScoket协议是基于TCP协议建立的全双工通信,所谓的全双工通信就是双向同时通信。
2.WebSocket协议优点
WebSocket协议使客户端和服务器之间的数据交换更加简单,允许服务器主动向客户端推送数据。
在WebSoket协议中客户端只需要和服务器建立一次握手,俩者之间就可以直接建立持久性的连接。
3.与HTTP协议对比
HTTP协议:半双工协议(同一时刻流量只能单向流动)
Socket协议:全双工
HTTP协议:如果需要进行轮询只能客户端不断的进行请求服务端信息,消耗了系统大量的带宽资源
Socket协议:服务端可以主动推送,进行轮询
4.WebSoket协议握手
WebSoket协议握手只需要进行一次,即可进行数据传输。
基于HTTP/1.1进行请求,成功后服务端返回101。
5.WebSoket协议特性
WebSocket定义了两种URI格式
“ws://“和“wss://”,类似于HTTP和HTTPS, “ws://“使用明文传输,默认端口为80,”wss://“使用TLS加密传输,默认端口为443。
ws-URI : "ws://host[:port]path[?query]"
wss-URI : "wss://host[:port]path[?query]"
6.WebSoket协议安全性问题
6.1 认证问题
WebSocket协议没有规定服务器在握手阶段应该如何认证客户端身份。
也就是说无论是哪个客户端都可以尝试与之进行握手,尝试建立WebSocket连接。
6.2 授权问题
WebSocket协议没有指定任何授权方式,应用程序中用户资源访问授权问题取决于服务端和系统开发者。
WebSocket应用也会存在和传统Web应用相同的安全风险,如:垂直权限提升和水平权限提升。
6.3 跨域请求
在发起WebSocket握手请求时,浏览器会在请求中添加一个名为Origin的HTTP头,Oringin字段表示发起请求的源,以此来防止未经授权的跨站点访问请求。
WebSocket 的客户端不仅仅局限于浏览器,因此 WebSocket 规范没有强制规定握手阶段的 Origin 头是必需的,并且WebSocket不受浏览器同源策略的限制。如果服务端没有针对Origin头部进行验证可能会导致跨站点WebSocket劫持攻击。
什么是WebSocket劫持攻击?
1、用户A正常登陆一个需要建立WebSocket的应用B 。
2、攻击者诱导用户A访问网页(该网页上存在JS代码,当用户A访问时会系统建立WebSoket连接,同时由于用户A已经成功登陆B,当建立连接时浏览器会自动的带上存储的Cookie信息,这样攻击者即可绕过身份认证从而建立WebSocket连接。)
3、由于WebSocket是全双工通信,服务端会主动发送数据给客户端。从而攻击者可被动获取数据和主动发起请求。
如何防范?
1、在服务器端的代码中增加 对Origin头的检查,如果客户端发来的 Origin 信息来自不同域,服务器端可以拒绝该请求。
2、仅仅是检查是不够的,因为Origin头可以进行伪造,绕过对Origin头的检查。
3、可以参考CSRF加Token机制。
6.4 拒绝服务
客户端拒绝服务攻击
客户端发起超多的WebSocket连接(不同浏览器的限制数不同)
服务端拒绝服务攻击
WebSocket建立的是持久连接,只有客户端或服务端其中一发提出关闭连接的请求,WebSocket连接才关闭,因此攻击者可以向服务器发起大量的申请建立WebSocket连接的请求,建立持久连接,耗尽服务器资源,引发拒绝服务。
7. 总结
在即时通讯等应用中,WebSocket具有很大的性能优势, 并且非常适合全双工通信,但是,和任何其他技术一样,开发WebSocket应用也需要考虑潜在的安全风险。
最新文章
- Java goto,continue,break,标签
- eclipse配置javaee环境
- 【转】SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
- hibernate级联与反向
- CS异步下载
- typedef struct
- 【C语言探索之旅】 第一部分第五课:运算那点事
- 去除移动端点击事件出现的背景框 tap-highlight-color
- 在SQL Server中实现关系模型的阶梯到级别3的t -SQL DML
- Linux LCD 显示图片【转】
- html中的meta标签是什么?有哪些属性?
- eclipse导入新项目配置jdk、tomcat到浏览器正常访问
- yii2 部分很实用的代码
- TRIO-basic变量的状态位
- java并发编程系列二:原子操作/CAS
- rsync使用ssh指定端口
- Node.js IO处理输入和回显,以及当今web应用程序的发展史
- 除了ROS, 机器人定位导航还有其他方案吗?
- C#面试基础问题0
- linux 环境下git的安装与配置
热门文章
- python sys.modules 和 sys.path 及 __name__
- 5.基本的Dos命令
- Java入门 - 语言基础 - 11.switch_case
- 美食家App开发日记1
- 关于PDF阅读器
- Creating Form Elements --Using BeginForm and EndForm 使用内建的Form辅助器方法 精通ASP.NET MVC 5
- c#数字图像处理(三)灰度直方图
- flutter 与 android 混合开发
- mysql--->;profile使用
- linux之samba使用