如何在连接到节点上的 websocket 服务器时传递消息

Posted

技术标签:

【中文标题】如何在连接到节点上的 websocket 服务器时传递消息【英文标题】:How to pass a message while connecting to websocket server on node 【发布时间】:2019-11-25 03:16:23 【问题描述】:

我这里有这段代码 -

const wss = new SocketServer( express() );

wss.on('connection', ws => 
    console.log('Client connected');
    ws.on('message', msg => 
        console.log('received: %s', msg);
    );
    ws.on('close', () => console.log('Client disconnected'));
);

现在有一些问题,D-Dos 攻击可能会导致我的服务器崩溃。

在允许陌生人连接到 websocket 之前,有没有办法检查令牌或其他东西?此外,套接字将在另一个域上,因此 cookie 将不起作用。

或者如果用户在连接后没有发送身份验证令牌,有没有办法断开连接。

如果它正在运行并允许每个人无限期地连接,那么这是一个安全风险。服务器可以轻松关闭。

【问题讨论】:

【参考方案1】:

使用 Socket.io 可以实现您需要的设置,请参阅 Authenticating socket io connections

否则你必须自己实现它,但你应该遵循一些标准。我能想到的第一个丑陋的手工解决方案是这样的:

wss.on('connection', ws => 
    console.log('Client connected');

    isAuthenticated = false

    ws.on('message', msg => 
        if (!isAuthenticated ) 
            // check if message is a token
            // else comunicates back the error
        

        console.log('received: %s', msg);
    );

    ws.on('close', () => console.log('Client disconnected'));
);

对于 DDos 攻击,如果他们有一个令牌,他们可以发送无限的垃圾请求:同样的,你应该自己计算传入的按摩率并实施类似限制策略的东西。

【讨论】:

有没有办法有效断开连接 x 秒后不发送消息的客户端 console.log('Client connected');之后可以放置setTimeout(() => ws.close(), 5000),并在收到消息时清除该超时 我对你有帮助吗? 是的,特别是这个链接帮助 - ***.com/questions/36788831/…

以上是关于如何在连接到节点上的 websocket 服务器时传递消息的主要内容,如果未能解决你的问题,请参考以下文章

Node 在连接到 Postgres 方面比 .NET Core 快 20 倍

我在连接到数据库时遇到错误使用节点包 mysql v2.16.0 错误:数据包乱序。得到:80 预期:0

使用服务器端 Blazor,在连接到 SQL Server 数据库时如何使用 Windows 身份验证模拟用户?

无法使用 Vue 插件连接到 WebSocket

iPhone 定位服务在连接到 XCode 后显示错误的位置

如何使用 cpprestsdk 设置 websocket SSL 连接?