EventSource/SSE(Server-Sent-Svents) - 安全性

 覃思慧_419 发布于 2023-02-13 14:34

我已经阅读了w3规范@ http://www.w3.org/TR/eventsource/,了解了EventSource/SSE的工作原理,但是我找不到有关如何创建私有流的任何好信息.

基本上,我想创建一种将私有数据发送到特定用户会话的方法.以下两个想法似乎都符合我的要求,但我不确定它们的安全性.

例; 连接到同一个EventSource 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发送身份验证数据,而是使用其中一个示例.

1 个回答
  • 每个流都是私有的.SSE不是广播技术(除非您故意实施它).而是为每个浏览器客户端提供与服务器的专用套接字连接.您的服务器将使用并发事件处理程序来处理该客户端,并将选择它要发送给该客户端的信息.您也可以获得该客户端的cookie,因此可以识别其会话,并且基本身份验证也可以.

    当涉及CORS时,一切都变得复杂得多,即如果您的SSE服务器与提供HTML的源服务器不同.这就是你描述的情况.你的服务器不得不发回"Access-Control-Allow-Origin: *",但你并不需要使用withCredentials,如果你高兴地发送唯一会话ID.但请注意,您不会获得cookie或基本身份验证数据.

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

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

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

    2023-02-13 14:38 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有