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应用也需要考虑潜在的安全风险。

最新文章

  1. Java goto,continue,break,标签
  2. eclipse配置javaee环境
  3. 【转】SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
  4. hibernate级联与反向
  5. CS异步下载
  6. typedef struct
  7. 【C语言探索之旅】 第一部分第五课:运算那点事
  8. 去除移动端点击事件出现的背景框 tap-highlight-color
  9. 在SQL Server中实现关系模型的阶梯到级别3的t -SQL DML
  10. Linux LCD 显示图片【转】
  11. html中的meta标签是什么?有哪些属性?
  12. eclipse导入新项目配置jdk、tomcat到浏览器正常访问
  13. yii2 部分很实用的代码
  14. TRIO-basic变量的状态位
  15. java并发编程系列二:原子操作/CAS
  16. rsync使用ssh指定端口
  17. Node.js IO处理输入和回显,以及当今web应用程序的发展史
  18. 除了ROS, 机器人定位导航还有其他方案吗?
  19. C#面试基础问题0
  20. linux 环境下git的安装与配置

热门文章

  1. python sys.modules 和 sys.path 及 __name__
  2. 5.基本的Dos命令
  3. Java入门 - 语言基础 - 11.switch_case
  4. 美食家App开发日记1
  5. 关于PDF阅读器
  6. Creating Form Elements --Using BeginForm and EndForm 使用内建的Form辅助器方法 精通ASP.NET MVC 5
  7. c#数字图像处理(三)灰度直方图
  8. flutter 与 android 混合开发
  9. mysql--->profile使用
  10. linux之samba使用