使用用户名/密码和Servlet安全性保护WebSockets
RFC 6455提供了WebSockets安全注意事项的完整列表。 其中一些是在协议本身中烘焙的,其他一些则需要更多有关如何在特定服务器上实现它们的解释。 让我们谈谈协议本身内置的一些安全性:
- HTTP请求中的Origin头仅包含标识发起该请求的主体(网页,JavaScript或任何其他客户端)所需的信息(通常是发起源的方案,主机和端口)。 对于WebSocket,此标头字段包含在客户端的打开握手中。 这用于通知服务器生成WebSocket连接请求的脚本来源。 然后,服务器可以决定相应地接受或拒绝握手请求。 这样一来,服务器就可以防止使用浏览器中使用WebSocket API的脚本对WebSocket服务器进行未经授权的跨域使用。例如,如果Java EE 7 WebSocket聊天示例已部署到WildFly并通过localhost:8080 / chat /访问, Origin标头为“ http:// localhost:8080”。 非浏览器客户端可以使用Origin头来指定请求的来源。 WebSocket服务器在接收此类请求时应格外小心。
- 来自客户端的WebSocket打开握手必须包含Sec-WebSocket-Key和Sec-WebSocket-Version HTTP标头字段。 XMLHttpRequest可用于发出HTTP请求,并允许将标头作为该请求的一部分设置为:
xhr.onreadystatechange = function () {if (xhr.readyState == 4 && xhr.status == 200){document.getElementById("myDiv").innerHTML = xhr.responseText;} } xhr.open("GET", "http://localhost:8080", true); xhr.setRequestHeader("foo", "bar"); xhr.setRequestHeader("Sec-WebSocket-Key", "myKey"); xhr.send();
如果XMLHttpRequest尝试设置以Sec-开头的任何头字段,则将忽略它们。 因此,恶意用户无法使用HTML和JavaScript API模拟与服务器的WebSocket连接。
除了这两种主要方法外,还可以使用任何HTTP服务器可用的客户端身份验证机制来保护WebSocket。 该技术提示将显示如何验证在WildFly上部署的Java EE 7 WebSockets。
让我们开始吧!
- 克隆Java EE 7示例工作空间:
git clone https://github.com/javaee-samples/javaee7-samples.git
- “ websocket / endpoint-security”示例显示了如何从客户端启动WebSocket握手之前完成客户端身份验证。 这是通过包含以下部署描述符来触发的:
<security-constraint><web-resource-collection><web-resource-name>WebSocket Endpoint</web-resource-name><url-pattern>/*</url-pattern><http-method>GET</http-method></web-resource-collection><auth-constraint><role-name>g1</role-name></auth-constraint> </security-constraint><login-config><auth-method>BASIC</auth-method><realm-name>file</realm-name> </login-config><security-role><role-name>g1</role-name> </security-role>
有关此描述符的一些关键点:
- <url-pattern>表示将提示对此应用程序发出的任何请求进行身份验证
在我们的特定情况下,创建WebSocket连接的页面受到基本身份验证的保护。
- 下载WildFly 8.1 ,解压缩并通过调用以下脚本来添加新用户:
./bin/add-user.sh -a -u u1 -p p1 -g g1
这将在组“ g1”中添加密码为“ p1”的用户“ u1”。 此处指定的组需要匹配部署描述符中的<role-name>中定义。
- 通过提供以下命令来部署样本:
mvn wildfly:deploy
现在,当通过localhost:8080 / endpoint-security访问该应用程序时,将弹出一个安全对话框,如下所示:
输入“ u1”作为用户名,输入“ p1”作为密码进行身份验证。 这些凭据在部署描述符中引用的组“ g1”中定义。 任何其他凭据将继续使对话框恢复。
成功验证请求后,将建立WebSocket连接,并在浏览器中显示一条消息。
如果您只想保护WebSocket URL,请从以下位置更改URL模式:
/*
至:
/websocket
在websocket.js中,更改URL以从以下位置创建WebSocket端点:
var wsUri = "ws://" + document.location.host + document.location.pathname + "websocket";
至:
var wsUri = "ws://u1:p1@" + document.location.host + document.location.pathname + "websocket";
请注意,如何在URL本身中传递凭据。 从Google Chrome 38.0.2125.104开始,如果仅WebSocket URL需要身份验证,则不会出现浏览器弹出窗口。
下一技巧提示将说明如何使用wss://
协议保护WebSocket的安全。
翻译自: https://www.javacodegeeks.com/2014/10/securing-websockets-using-usernamepassword-and-servlet-security.html
使用用户名/密码和Servlet安全性保护WebSockets相关推荐
- websockets_使用用户名/密码和Servlet安全性保护WebSockets
websockets RFC 6455提供了WebSockets安全注意事项的完整列表. 其中一些是在协议本身中烘焙的,其他一些则需要更多有关如何在特定服务器上实现它们的解释. 让我们来谈谈协议本身内 ...
- win7系统ftp服务器密码修改,win7ftp服务器设置用户名密码设置
win7ftp服务器设置用户名密码设置 内容精选 换一换 建议您的密码由数字.大小写字母.特殊符号组成,长度在8至26位.同时建议您从华为云的云市场中下载并安装虚拟化杀毒产品和主机安全加固产品,这样可 ...
- 二、Prometheus TLS加密认证和基于 basic_auth 用户名密码访问
文章目录 Prometheus 基于用户名密码访问 1. `Node Export`端配置密码 2. 在被监控端这里生成密码 3. 在node_exporter中新增配置文件 4. node_expo ...
- 密码学读书笔记系列(三):《商用密码应用与安全性评估》
密码学读书笔记系列(三):<商用密码应用与安全性评估> 思考/前言 第1章 密码基础知识 1.1 密码应用概述 1.2 密码应用安全性评估(密评)的基本原理 1.3 密码技术发展 1.4 ...
- swing程序 过时拉嘛_密码已过时-如何保护您的应用程序和保护用户
swing程序 过时拉嘛 重点 (Top highlight) I've said this part before, so if you read the previous article, ski ...
- 商用密码应用与安全性评估要点笔记(密码协议设计、密码功能实现)
1.19 密码协议设计 词条 内容 协议设计与分析 根据经验设计的密钥协议时非常脆弱和危险的,各种未知的攻击会不断涌现.协议安全缺乏安全性证明. 密码协议设计原则 (1)独立完整性原则.(2)消息前提 ...
- 通过用户名密码认证保障 MQTT 接入安全
认证是一种安全措施,用于识别用户并验证他们是否有权访问系统或服务器.它能够保护系统免受未经授权的访问,确保只有经过验证的用户才能使用系统. 物联网连接万物,对试图访问基础设施的用户进行认证至关重要.未 ...
- 【转】解决IIS 用localhost需要用户名密码!
打开iis,站点右键----属性----目录安全性----编辑----允许匿名访问钩选 IIS连接127.0.0.1要输入用户名密码的解决办法 原因很多,请尝试以下操作: 1.查看网站属性--文档 看 ...
- [WCF安全系列]认证与凭证:用户名/密码认证与Windows认证
如果要给认证下一个定义,我个人的倾向这样的定义:认证是确定被认证方的真实身份和他或她申明(Claim)的身份是否相符的行为.认证方需要被认证方提供相应的身份证明材料,以鉴定本身的身份是否与声称的身份相 ...
最新文章
- 分类(classification)是认知的基础、分类步骤及主要算法、分类与回归的区别、分类过程
- 第一个项目的需求分析
- centos 6.8 搭建svn服务器
- sql server转oracle需要注意的几点
- zookeeper C API
- 测度论相关概念(吐)
- 1.4 isAlive()方法
- 力登:以智能化管理提升数据中心服务能力成熟度
- el-popover超过固定高度后出现滚动条_「测绘精选」RTK测量不出现固定解的原因...
- 在csdn中输入公式的方法
- 机器人softmove_ABB 工业机器人 SoftMove功能介绍
- 比特币在推特上的活跃度正接近2017年水平
- 后置增强this advice advises no methods_增强消防意识 提高消防能力 重庆天一新城小学积极参加消防技能比赛活动...
- html推箱子过关检测函数,HTML5推箱子实现
- 压缩算法之算术编码浅析与实现
- 口袋小精灵JAVA版下载_口袋小精灵200合一
- 算术平均值c语言函数名称,求算术平均数和集合平均数的源代码
- 组策略开启计算机管理员账号,怎么用组策略禁用本地管理员|组策略提升管理员权限方法...
- javaScript键值码
- 绘画系统——P5.js
热门文章
- 关于文档的基本操作---ElasticSearch
- SparkContext源码分析
- centos7 切换中文输入法 无需安装
- MySQL笔记 - 用户管理
- 本地方法(JNI)——从java 程序中调用C函数
- 如何添加数据到session中
- openshift_OpenShift Origin中的Kubernetes Spark运算符(第1部分)
- fork join框架_Java中的Fork / Join框架的简要概述
- 子模板继承父模板示例_模板设计模式示例
- mongodb实验报告_Dropwizard,MongoDB和Gradle实验