Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何防止恶意使用套接字?_Javascript_Node.js_Websocket_Socket.io - Fatal编程技术网

Javascript 如何防止恶意使用套接字?

Javascript 如何防止恶意使用套接字?,javascript,node.js,websocket,socket.io,Javascript,Node.js,Websocket,Socket.io,我正在制作一个基于玩家的网页,玩家可以邀请其他玩家参加聚会,以及其他一些事情 我有你的基本发送/接收/更新的聊天室/用户在你的党。唯一的问题是,什么能阻止某人坐在那里打开开发人员控制台并继续 socket.emit('updateUsers', 'Weiner'); socket.emit('updateUsers', 'Idiot'); socket.emit('updateUsers', 'Bad word'); socket.emit('updateUsers', 'Other stupi

我正在制作一个基于玩家的网页,玩家可以邀请其他玩家参加聚会,以及其他一些事情

我有你的基本发送/接收/更新的聊天室/用户在你的党。唯一的问题是,什么能阻止某人坐在那里打开开发人员控制台并继续

socket.emit('updateUsers', 'Weiner');
socket.emit('updateUsers', 'Idiot');
socket.emit('updateUsers', 'Bad word');
socket.emit('updateUsers', 'Other stupid malicious really long spam the chat name');
我如何防止他们这样做呢

(完整的JS堆栈,Node.JS)
谢谢

使用行为类似于cookie的md5/sha密钥

为特定用户生成密钥并将其发送到客户端,并始终检查传入的请求是否具有相同的密钥


它不会是完全安全的,因为黑客总是可以在源代码或本地存储中找到您的密钥,但试图通过混淆您的代码来隐藏它

我也遇到了这个问题,这是我的解决方案,因为垃圾邮件(恶意套接字使用)

基本上绑定到所有emit,并检查emit名称是否包含在
spamCheckFunctions
中,如果是,则会添加一个垃圾邮件点,如果用户超过垃圾邮件分数金额(
maxparm
);他将被断开连接。在
antiSpam
中定义的每一毫秒将减去在
antiSpamRemove

我肯定有更干净的解决方案,但这一个对我来说非常好:)

只需确保验证/验证用户即可

这就是我对它们进行身份验证的方式(不是将nodejs用作web服务器,而是使用django):

现在您可以访问
socket.handshake.cookie['sessionid']
(在我的例子中,这与django一起工作)
然后将
socket.handshake.cookie['sessionid']
与会话存储在Web服务器上的条目相匹配,这通常是一个难题。你可以做两件事:

1) 在客户端使用自调用函数,即

(function(w) {
    // define your sockets here
    var socket = ...;
})(window);
显然,它是在客户端,所以这不是真正安全的。但有这样的墙也不错


2) 在服务器端,跟踪发布的频率。例如,如果某人在一秒钟内发布了5次帖子,那么您可以假设这是一个垃圾邮件,您可以阻止该套接字。如果与身份验证和复杂的注册相结合,它尤其有效(因此人们在创建新帐户时会遇到问题)。

防止垃圾邮件的一种方法是实施用户身份验证和/或数据包速率限制器。添加一个中间件函数,跟踪socketId和通过该套接字发送的数据包数量。当超过限制时,断开插座

您甚至可以添加一个额外的功能来跟踪该套接字的IP地址,如果某个IP地址由于垃圾邮件而经常断开连接,您可以禁止该IP。添加对允许的IP地址的连接事件的检查。

使用包限制每秒的事件数。通过IP进行限制是最简单的,但如果可能,最好通过用户ID进行限制

const app = require('http').createServer();
const io = require('socket.io')(app);
const { RateLimiterMemory } = require('rate-limiter-flexible');

app.listen(3000);

const rateLimiter = new RateLimiterMemory(
  {
    points: 5, // 5 points
    duration: 1, // per second
  });

io.on('connection', (socket) => {
  socket.on('bcast', async (data) => {
    try {
      await rateLimiter.consume(socket.handshake.address); // consume 1 point per event from IP
      socket.emit('news', { 'data': data });
      socket.broadcast.emit('news', { 'data': data });
    } catch(rejRes) {
      // no available points to consume
      // emit error or warning message
      socket.emit('blocked', { 'retry-ms': rejRes.msBeforeNext });
    }
  });
});

阅读

中的更多信息,您需要注册和验证用户。它不需要是fort knox,只要一个通过点击协议屏幕的cookie或ip就足够了。@dandavis哦,我不知道cookies通过了套接字,但是,如果他们登录并且cookie存在,他们仍然能够通过套接字发送垃圾邮件。不?cookies不在套接字中,但是,假设有人首先访问您的http页面,您可以通过连接升级或通过更高级别的分组(如socket.io的内置集合)来跟踪它们。我也面临着这个问题。。。感觉无助…如果人们想查看,我用这段代码制作了一个NPM包:
(function(w) {
    // define your sockets here
    var socket = ...;
})(window);
const app = require('http').createServer();
const io = require('socket.io')(app);
const { RateLimiterMemory } = require('rate-limiter-flexible');

app.listen(3000);

const rateLimiter = new RateLimiterMemory(
  {
    points: 5, // 5 points
    duration: 1, // per second
  });

io.on('connection', (socket) => {
  socket.on('bcast', async (data) => {
    try {
      await rateLimiter.consume(socket.handshake.address); // consume 1 point per event from IP
      socket.emit('news', { 'data': data });
      socket.broadcast.emit('news', { 'data': data });
    } catch(rejRes) {
      // no available points to consume
      // emit error or warning message
      socket.emit('blocked', { 'retry-ms': rejRes.msBeforeNext });
    }
  });
});