使用用户名/密码和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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 功放机电脑喇叭接线图(功放机接喇叭的接法
- 下一篇: 怎么把照片传输在电脑上如何从手机上传照片