最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

如何防止恶意使用我的插座?

运维笔记admin10浏览0评论

如何防止恶意使用我的插座?

如何防止恶意使用我的插座?

我正在根据各地的玩家能够邀请其他玩家聚会,和其他东西长行的网页。

我有你的基本的发送/接收/在你的聚会聊天/用户的更新。唯一的一点是,什么是从坐在那里打开了一个开发者控制台,并打算停止某人

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的)谢谢!

回答如下:

我藏汉面临这个问题,这是我的解决方案尽可能垃圾邮件发出去(恶意插座使用)..

var spamData = new Object();
var spamCheckFunctions = ["updateUsers","moreEmits"]; // anti-spam will check these socket emits
var antiSpam = 3000; // anti spam check per milliseconds
var antiSpamRemove = 3; // -spam points per antiSpam check
var maxSpam = 9; // Max spam points before disconnect is thrown to the socket

io.sockets.on('connection', function (socket) {

    // Spam Check, this binds to all emits
    var emit = socket.emit;
    socket.emit = function() {
        data = Array.prototype.slice.call(arguments);
        if(spamCheckFunctions.contains(data[0])){
            addSpam(socket);
        };
        emit.apply(socket, arguments);
    };

    var $emit = socket.$emit;
    socket.$emit = function() {
        data = Array.prototype.slice.call(arguments);
        if(spamCheckFunctions.contains(data[0])){
            addSpam(socket);
        }
        $emit.apply(socket, arguments);
    };

});


function maxSpamCheck(socket){
    if(spamData[socket.username].spamScore>=maxSpam && !socket.spamViolated){
      socket.spamViolated = true;
      socket.disconnect();

   }
}
function checkSpam(){
    for(user in spamData){
        if(spamData[user].spamScore>=1) spamData[user].spamScore-=antiSpamRemove;
    }
    return;
}
setInterval(checkSpam,antiSpam);

function addSpam(socket){
    if(socket.spamViolated) return;
    spamData[socket.username].spamScore+=1;
    maxSpamCheck(socket);
}


// Then add this where your user is authenticated
function authenticate(socket){
    socket.username = username // here you define username
    socket.spamViolated = false;

    spamData[socket.username] = {
        spamScore: 0
    }
}

Array.prototype.contains = function(k) {
    for(var p in this)
        if(this[p] === k)
            return true;
    return false;
};

如果发射名称包含在spamCheckFunctions如果它是它会增加一个垃圾邮件一点上,如果用户超过一个垃圾邮件分数的量(maxSpam)基本上结合所有发射和检查;他将被断开。而在antiSpam定义的每个毫秒都会减去用户垃圾邮件分数在antiSpamRemove定义

我敢肯定有清洁的解决方案,但这个工作就不错,我:)

只要确保验证/认证用户。

我这是怎么验证他们的身份(不使用作为的NodeJS web服务器,但有Django的):

io.configure(function(){
    io.set('authorization', function(data, accept){
        if(data.headers.cookie){
            data.cookie = cookie_reader.parse(data.headers.cookie);
            return accept(null, true);
        }
        return accept('error', false);
    });
});

现在你可以访问socket.handshake.cookie['sessionid'](在我的情况下,这个曾与Django的),然后配合您的会话存储在Web服务器上一个条目socket.handshake.cookie['sessionid']

发布评论

评论列表(0)

  1. 暂无评论