WebSocket学习笔记

embedded/2024/10/21 10:04:51/

概述

WebSocket是一种网络通信协议,它在2011年被IETF(互联网工程任务组)标准化为RFC 6455。WebSocket协议允许服务器与客户端之间进行全双工通信,即客户端和服务器可以在任何时候发送消息,而不需要像传统的HTTP请求那样等待响应。
WebSocket的主要特点包括:

  1. 全双工通信:客户端和服务器可以在任何时候发送消息,实现了真正的实时通信。
  2. 基于TCP协议:WebSocket在传输层使用TCP协议,保证了数据的可靠传输。
  3. 握手过程:WebSocket连接的建立是通过HTTP协议的升级请求来完成的。客户端发起一个普通的HTTP请求,并在请求头中包含升级到WebSocket的请求。如果服务器支持WebSocket,它会同意升级,并返回一个101 Switching Protocols的响应,之后连接就会使用WebSocket协议。
  4. 轻量级:WebSocket消息格式相对简单,减少了数据传输的开销。
  5. 跨域支持:WebSocket协议支持跨源通信,允许不同域的网页应用进行数据交换。
  6. 持久连接:一旦WebSocket连接建立,它就会保持开放状态,直到客户端或服务器显式地关闭连接。
    WebSocket的应用场景包括但不限于:
  • 实时消息传递:如即时通讯、聊天室等。
  • 实时游戏:多人在线游戏、实时对战游戏等。
  • 实时数据流:如实时股票报价、实时监控系统等。
  • 实时协作工具:如在线白板、文档协作编辑等。
    在现代Web应用中,WebSocket已经成为实现实时互动功能的重要技术之一。随着HTML5的普及,WebSocket得到了广泛的支持,几乎所有的现代浏览器都支持WebSocket协议。

websocket应用示例

这里计划使用FastAPI实现一个WebSocket服务并创建一个Python客户端来接收消息。
安装依赖:

pip install fastapi[all] websockets

服务端程序

python">from fastapi import FastAPI, WebSocket, WebSocketDisconnect
from fastapi.responses import HTMLResponse
from typing import Listapp = FastAPI()html = """
<!DOCTYPE html>
<html><head><title>WebSocket Example</title></head><body><script>var ws = new WebSocket("ws://localhost:8000/ws");ws.onmessage = function(event) {var messages = document.getElementById('messages')var message = document.createElement('li')message.appendChild(document.createTextNode(event.data))messages.appendChild(message)};function sendMessage() {var input = document.getElementById('messageInput');ws.send(input.value);input.value = '';}</script><input type="text" id="messageInput" placeholder="Type a message..."><button οnclick="sendMessage()">Send</button><ul id="messages"></ul></body>
</html>
"""active_connections: List[WebSocket] = []@app.get("/")
async def get():return HTMLResponse(html)@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):await websocket.accept()active_connections.append(websocket)try:while True:data = await websocket.receive_text()for conn in active_connections:if conn == websocket:continueawait conn.send_text(f"User: {data}")except WebSocketDisconnect:active_connections.remove(websocket)

客户端程序

python">import asyncio
import websocketsasync def hello():uri = "ws://localhost:8000/ws"async with websockets.connect(uri) as websocket:while True:response = await websocket.recv()print(f"Received message from server: {response}")asyncio.get_event_loop().run_until_complete(hello())

运行服务器和客户端
运行FastAPI WebSocket服务:

uvicorn websocket_server:app --reload

在另一个终端窗口中运行Python WebSocket客户端:

python websocket_client.py

客户端现在应该会持续运行,等待并打印出从服务器接收到的消息。如果你打开浏览器并访问http://localhost:8000,你可以在HTML页面中输入消息,这些消息会被服务器广播给所有连接的客户端,包括Python客户端。

WebSocket有哪些常见的安全问题

WebSocket协议虽然为实时通信带来了便利,但也带来了一些安全挑战。以下是一些常见的WebSocket安全问题:

  1. 跨站请求伪造(CSRF):由于WebSocket连接可以在不同域之间建立,攻击者可能会利用WebSocket接口进行CSRF攻击,强迫用户的浏览器在已登录的WebSocket会话中执行非用户意愿的操作。
  2. 跨站脚本包含(XSSI):如果WebSocket服务器返回的数据没有适当的保护措施,攻击者可能会通过XSSI攻击窃取敏感数据。
  3. 数据泄露:WebSocket连接可能会传输敏感数据,如果数据没有加密,或者加密措施不当,攻击者可能会通过中间人攻击(MITM)窃取数据。
  4. 拒绝服务攻击(DoS):由于WebSocket连接是持久的,攻击者可以通过建立大量连接来消耗服务器资源,导致合法用户无法访问服务。
  5. 权限控制不当:如果WebSocket服务器没有正确实施权限控制,攻击者可能会访问或篡改其他用户的会话。
  6. 心跳机制缺失或无效:WebSocket连接可能因为网络问题、服务器问题或客户端问题而断开。如果没有适当的心跳机制来检测连接状态,可能会导致资源泄漏或服务中断。
  7. 协议降级攻击:攻击者可能会尝试将WebSocket连接降级到不安全的HTTP协议,从而进行中间人攻击。
  8. 错误的消息验证:如果服务器没有正确验证客户端发送的消息,可能会导致注入攻击,例如SQL注入、XML注入等。
    为了防范这些安全问题,可以采取以下措施:
  • 使用wss://(WebSocket Secure)代替ws://,确保WebSocket连接使用SSL/TLS加密。
  • 实施适当的认证和授权机制,确保只有合法用户才能访问WebSocket服务。
  • 使用反向代理或API网关来管理WebSocket连接,以便实施更细粒度的安全策略。
  • 对WebSocket消息进行适当的验证和清理,防止注入攻击。
  • 实现心跳机制来监控连接状态,及时释放断开的连接资源。
  • 限制连接数量和消息速率,防止DoS攻击。
  • 对WebSocket服务进行渗透测试和代码审计,及时发现和修复安全漏洞。

http://www.ppmy.cn/embedded/37206.html

相关文章

我独自升级崛起怎么下载 我独自升级崛起下载教程来了

《我独自升级&#xff1a;崛起》作为一款炙手可热的游戏&#xff0c;其非凡的品质迅速聚拢了大量玩家的目光&#xff0c;就如同磁铁吸引铁屑一般&#xff0c;展现了优质游戏所固有的强大吸引力。在这款游戏中&#xff0c;每位玩家都能化身成为拥有超凡能力的英雄&#xff0c;体…

Pycharm远程同步的mapping与sync

用Pycharm进行项目远程部署的时候会遇到两个同步文件&#xff0c;一个是点击 tools—>deployment—>configration——>mapping 一个是链接虚拟环境的时候会有一个sync&#xff0c;那么这两种同步有什么区别呢&#xff1f; 区别就是&#xff0c;2包括1&#xff0c;要用…

redisson分布式锁中waittime的设置

之前分布式锁中使用redisson的lock.tryLock(0,0,TimeUnit.SECONDS) 这么做的逻辑是releaseTime设置为0&#xff0c;实际上会使用默认的30s并触发看门狗机制 那waitTime有没有默认值呢&#xff1f;设置为0实际会等待多少时间&#xff1f; 看源码 public boolean tryLock(long…

下一代Nginx? OpenNjet 的入门实践

何为 OpenNjet &#xff1f; OpenNJet 应用引擎是基于 NGINX 的面向互联网和云原生应用提供的运行时组态服务程序&#xff0c;作为底层引擎&#xff0c;OpenNJet 实现了NGINX 云原生功能增强、安全加固和代码重构&#xff0c;利用动态加载机制可以实现不同的产品形态&#xff0…

6. Z 字形变换

题目描述 给你一个字符串s和行数numRows&#xff0c;把s字符串按照z字形重新排列。 再从左往右进行读取&#xff0c;返回读取之后的字符串。 本题是找规律&#xff0c;但是没有找出来 解题思路 要想解出来该题&#xff0c;在进行z字变换的时候&#xff0c;我们把字符串的下…

鸿蒙编译子系统详解(二)main.py

1.5.4源码解析 1.5.4.1 build/hb/main.py脚本 这个脚本是编译的主程序脚本&#xff0c;流程如下&#xff1a; 首先是初始化各种module类&#xff0c;然后运行对应模块。 hb分为build,set,env,clean,tool,help几个模块&#xff0c;模块源码位于build/hb/modules/目录下&#xff…

喜报 | 擎创科技荣获NIISA联盟2023年度创新技术特等奖!

为深入实施创新驱动发展战略&#xff0c;紧紧把握全球科技革命和产业变革方向&#xff0c;密切跟踪前沿科技新趋势&#xff0c;经科技部中国民营促进会业务主管部门批准以及国家互联网数据中心产业技术创新战略联盟&#xff08;以下简称联盟&#xff09;总体工作安排&#xff0…

Docker in Docker(DinD)原理与实践

Docker in Docker&#xff08;DinD&#xff09;原理与实践 一、引言 随着容器化技术的快速发展&#xff0c;Docker已经成为了企业应用开发、部署和管理的首选工具。而在某些复杂场景下&#xff0c;如持续集成/持续部署&#xff08;CI/CD&#xff09;管道中&#xff0c;我们需…