3

私は、プレイヤーが他のプレイヤーをパーティーに招待できるようにすることや、その他の長い行に基づいて Web ページを作成しています。

あなたのパーティーのチャット/ユーザーの基本的な送信/受信/更新があります。唯一のことは、誰かがそこに座って開発者コンソールを開いて移動するのを止めるにはどうすればよいかということです

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) ありがとう!

4

5 に答える 5

4

私もこの問題に直面しました。これは、スパムが発する限り、私の解決策でした(悪意のあるソケットの使用)..

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で機能しました)。次にsocket.handshake.cookie['sessionid']、セッションがWebサーバーに保存されているエントリと一致させます

于 2014-01-07T09:26:14.270 に答える
1

一般的には難しい問題です。あなたができる2つのこと:

1) クライアント側で自己呼び出し関数を使用します。つまり、

(function(w) {
    // define your sockets here
    var socket = ...;
})(window);

明らかにそれはクライアント側にあるため、これは実際には安全ではありません. でも、そんな壁があるのも悪くない。

2) サーバー側で、投稿の頻度を追跡します。たとえば、誰かが 1 秒間に 5 回投稿した場合、それはスパムであると見なして、そのソケットをブロックできます。認証や複雑な登録と組み合わせると特に効果的です (そのため、新しいアカウントを作成する際に問題が発生します)。

于 2014-01-07T09:41:20.710 に答える
0

Cookie のように動作する md5/sha キーを使用します。

特定のユーザーのキーを生成してクライアントに送信し、着信リクエストが同じキーを持っていることを常に確認します

ハッカーは常にソース コードまたは localStorage でキーを見つけることができますが、コードを難読化して隠そうとするため、完全に安全というわけではありません。

于 2013-05-23T17:01:40.760 に答える