6月1日 09:12

WebSocket 有哪些安全问题?CSWSH/注入/DoS 防御方案

WebSocket主要面临五大安全威胁:跨站WebSocket劫持(CSWSH)、数据注入、中间人攻击、认证缺失和拒绝服务。CSWSH是最典型的——浏览器WebSocket握手自带Cookie但不受同源策略约束,攻击者在恶意页面发起ws连接即可冒用用户身份。防御核心是服务端严格校验Origin头,拒绝非白名单来源。数据注入方面,WebSocket帧内容无格式约束,服务端若不做输入验证和转义就写数据库或渲染页面,等同于XSS/SQL注入入口。中间人攻击靠WSS(WebSocket over TLS)加密传输解决,和HTTPS同理。认证授权方面,WebSocket握手阶段无法自定义Header,常见做法是URL参数带token(wss://host/ws?token=xxx)或通过Sec-WebSocket-Protocol子协议传递,后者更安全因为不暴露在日志里。DoS方面,恶意客户端可狂开连接或发送巨量数据,需限制单IP连接数、单帧大小和消息频率。

追问

CSWSH和CSRF有什么区别?

CSRF针对HTTP请求,浏览器自动携带Cookie;CSWSH针对WebSocket握手,同样自动带Cookie但连接建立后变为长连接,攻击者能持续收发消息,危害更大。防御上CSRF用CSRF Token,CSWSH靠Origin校验。

URL传token有什么安全隐患?

token出现在URL中会被浏览器历史记录、服务器访问日志、Referer头记录。改进方案:用一次性ticket——先通过HTTPS接口获取短时效ticket,再通过URL传ticket建立WebSocket,服务端验证后立即销毁,后续靠连接状态维持会话。

WSS能防中间人,能防数据注入吗?

不能。WSS只保证传输链路加密和完整性,不校验内容语义。恶意客户端照样通过WSS发送XSS payload或SQL注入语句,服务端必须独立做输入校验和输出转义。

如何限制WebSocket的DoS攻击?

服务端网关层做四件事:单IP最大连接数限制、单帧最大体积限制(如64KB)、消息频率限流(如每秒10条)、空闲超时断开。Nginx可通过limit_connproxy_read_timeout实现基础防护。

Sec-WebSocket-Protocol传token具体怎么实现?

客户端发起握手时在Header中设置Sec-WebSocket-Protocol: access_token, your_protocol,服务端从该头提取token验证,验证通过后在响应中只回传your_protocol(不回传token),这样连接正常建立。好处是token不出现在URL中,缺点是语义上属于对该字段的滥用。

标签:WebSocket