html - EventSource/SSE(服务器发送事件)- 安全

标签 html security server-sent-events

我已经通读了 w3 规范 @ http://www.w3.org/TR/eventsource/关于 EventSource/SSE 的工作原理,但我找不到任何关于如何创建私有(private)流的有用信息。

基本上,我想创建一种将私有(private)数据发送到特定用户 session 的方法。 下面的两个想法似乎都符合我的要求,但我不太确定它们的安全性。

例子;连接到同一事件源 URL 的每个浏览器是否都会收到相同的数据,并且浏览器会跟踪它想要的事件名称?

var source = new EventSource('/stream');
source.addEventListener('l0ngr4nd0mSessionID', function(e){
    console.log('Received a private message:', e.data);
});

没有事件名称 l0ngr4nd0mSessionID 的任何人都能收到此消息吗?

这个案例呢;

var source = new EventSource('/stream/l0ngr4nd0mSessionID ');
source.addEventListener('private', function(e){
    console.log('Received a private message:', e.data);
});

这些示例是否与设置 withCredentials 选项一样好? 我的 sse 服务器是独立于主 Web 服务器的服务器,因此我宁愿不使用 withCredentials 发送身份验证数据,而是使用其中一个示例。

最佳答案

每个流都是私有(private)的。 SSE 不是一种广播技术(除非你故意这样实现)。相反,每个浏览器客户端都有一个专用的套接字连接到您的服务器。您的服务器将使用并发事件处理程序来处理该客户端,并将选择要发送给该客户端的信息。您也可以获得该客户的 cookie,因此可以识别他们的 session ,并且基本身份验证也有效。

当涉及 CORS 时,一切都会变得更加复杂,即如果您的 SSE 服务器与提供 HTML 的来源不同。就是你描述的情况。您的服务器必须发回"Access-Control-Allow-Origin: *",但如果您乐意发送唯一的sessionID,则无需使用withCredentials .但请注意,您不会获得 cookie 或基本身份验证数据。

回到你的问题,第一个例子不好。这意味着您的服务器正在向所有客户端广播私有(private)数据。除了隐私问题,这也是对带宽的可怕浪费。

您的第二种方法更好:您在 URL 中使用某些内容来标识用户应该接收的数据,而不是使用 cookie 或身份验证。请注意,任何知道此 URL 的人都可以获得相同的数据。 SSL 将无济于事。我猜您的 session ID 是他们在登录您的主网站时获得的,并且在他们注销时过期。在大多数情况下,我认为这已经足够好了:黑客必须为相对较短的访问窗口付出很多努力。换句话说,使用社会工程获取用户的身份验证详细信息更容易。但是您需要进行自己的风险/ yield 评估。

最安全的方法是将 SSL 与 cookie 或基本身份验证结合使用。如果 Web 服务器和流媒体服务器是相同的 origin,这很容易;否则你需要使用 withCredentials

关于html - EventSource/SSE(服务器发送事件)- 安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20324657/

相关文章:

java - 将事件源连接到创建并返回 SSEEmitter 的 Java 函数时如何防止 "net::ERR_SPDY_PROTOCOL_ERROR 200"?

html - 访问效果选项卡 CSS

javascript - 背景图像大小调整

php - 使用 PHP 以 AES-256 加密文件的最佳方法是什么?

linux - X权限绕过

asp.net-mvc - 对未经授权的 HTTP 请求的正确响应是什么?

php - 在嵌套在 html 中的 php 中创建一个从 1 到 100 的表

javascript - AngularJS:创建一个我可以在我的 app.js 文件中使用的类来使用超链接图片

javascript - 用于处理服务器端事件的 PHP 服务器导致 Apache 连接过多

python - 如何在调用更新后端状态的函数时从 python (fastapi) 发送服务器端事件