JavaScript - Socket.io チャットルームにスパム対策を設定するにはどうすればよいですか?

okwaves2024-01-25  8

socket-anti-spam モジュールを使用して、socket.io チャットルームにスパム対策機能を追加したいのですが、その方法がわかりません。いくつか試してみましたが、うまくいかなかったようです。

ソケットアンチスパムモジュールが役に立たない場合は、他のモジュールでも問題ありません。私のserver.jsのこのバージョンにはスパム対策設定がありますが、機能していないようです。

HTML や CSS など、他の情報 (必要になるとは思えませんが) が必要な場合は、コメントしてください。この質問を更新します。

私のserver.js:

var PORT = process.env.PORT || 3000;
var express = require("express");
var app = express();
var http = require("http").Server(app);
var io = require("socket.io")(http);
var moment = require("moment");
var connectedUsers = {};
var prefix = "^";
var sysusername = "Twintails🎀";


function sleep(ms) {
  var unixtime_ms = new Date().getTime();
  while (new Date().getTime() < unixtime_ms + ms) {}
}

 const SocketAntiSpam  = require('socket-anti-spam')
  const socketio = require('socket.io').listen(8080)

  const socketAntiSpam = new SocketAntiSpam({
    banTime:            30,         // Ban time in minutes
    kickThreshold:      2,          // User gets kicked after this many spam score
    kickTimesBeforeBan: 1,          // User gets banned after this many kicks
    banning:            true,       // Uses temp IP banning after kickTimesBeforeBan
    io:                 socketio,  // Bind the socket.io variable
  })

app.use(express.static(__dirname + "/public"));

io.on("connection", function(socket) {

  socketAntiSpam.event.on('ban', data => {
    socket.emit("message", {
    username: sysusername,
    text: "A user was banned...",
    timestamp: moment().valueOf()
  });
  })

  console.log("A user is connected.");

  socket.on("disconnect", function() {
    var userData = connectedUsers[socket.id];
    if (typeof userData !== "undefined") {
      socket.leave(connectedUsers[socket.id]);
      io.to(userData.room).emit("message", {
        username: sysusername,
        text: userData.username + " has left!",
        timestamp: moment().valueOf()
      });
      delete connectedUsers[socket.id];
    }
  });

  socket.on("joinRoom", function(req, callback) {
    if (req.username.replace(/\s/g, "") !== "Twintails🎀") {
      if (req.username.replace(/\s/g, "").length < 24) {
        if (
          req.room.replace(/\s/g, "").length > 0 &&
          req.username.replace(/\s/g, "").length > 0
        ) {
          var nameTaken = false;

          Object.keys(connectedUsers).forEach(function(socketId) {
            var userInfo = connectedUsers[socketId];
            if (
              userInfo.username.toUpperCase() === req.username.toUpperCase()
            ) {
              nameTaken = true;
            }
          });

          if (nameTaken) {
            callback({
              nameAvailable: false,
              error: "This username is taken, please choose another one."
            });
          } else {
            connectedUsers[socket.id] = req;
            socket.join(req.room);
            socket.broadcast.to(req.room).emit("message", {
              username: sysusername,
              text: req.username + " has joined!",
              timestamp: moment().valueOf()
            });
            callback({
              nameAvailable: true
            });
          }
        } else {
          callback({
            nameAvailable: false,
            error: "Please complete the forum."
          });
        }
      } else {
        callback({
          nameAvailable: false,
          error: "Please make a username less than 24 characters."
        });
      }
    } else {
      callback({
        nameAvailable: false,
        error: "Your username can't be: " + sysusername
      });
    }
  });

  socket.on("message", function(message, callback, req) {
    if (message.text.length > null) {
      if (message.text !== " ") {
        if (message.text !== "  ") {
          if (message.text !== "   ") {
            if (message.text !== "    ") {
              if (message.text !== "     ") {
                if (message.text !== "      ") {
                  if (message.text !== "       ") {
                    if (message.text !== "        ") {
                      if (message.text !== "         ") {
                        if (message.text.length < 200) {
                          message.timestamp = moment().valueOf();
                          io.to(connectedUsers[socket.id].room).emit(
                            "message",
                            message
                          );
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  });

  socket.emit("message", {
    username: sysusername,
    text: "Ask someone to join this chat room to start talking.",
    timestamp: moment().valueOf()
  });

  socket.on("message", function(message) {
    if (message.text === prefix + "discord") {
      socket.emit("message", {
        username: sysusername,
        text: "Join the Twintails🎀 server here: https://discord.gg/fK9ynNq",
        timestamp: moment().valueOf()
      });
      sleep(1000);
    }
  });

  socket.on("message", function(message) {
    if (message.text === prefix + "bot") {
      socket.emit("message", {
        username: sysusername,
        text: "Coming soon...",
        timestamp: moment().valueOf()
      });
      sleep(1000);
    }
  });
});

http.listen(PORT, function() {
  console.log("Server started on port " + PORT);
});

ありがとうございます!

嘆願タイトルにタグを入れること、特にすべて大文字でタグを入れることは避けてください。これは人々が質問を見つけるのに役立ちません (タグ ボックスに入力されたタグがその役割を果たします)。また、すべて大文字はインターネットの多くの隅で叫んでいるように読まれます。

– 異端の猿

2020 年 9 月 4 日 17:04



------------------------

ユーザーが送信したメッセージを保存し、現在のメッセージが以前のメッセージと似ている場合に送信を防ぐことができます。

共有 この回答を改善しますフォローする

2020 年 9 月 4 日、午後 5 時に回答

デビッド・レベル

デビッド・レベル

11

1

銅バッジ 1 個

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。