Come dovrebbe essere trasmessa e archiviata la chat in un MMO?


8

I giocatori nei giochi MMO di solito possono inviare messaggi su canali diversi (privati, pubblici, corporazioni, ecc.).

Come trasmettere e archiviare questi dati in modo da impedire agli utenti esterni di accedere ai messaggi di chat privati ​​di qualcuno? Devo archiviare i dati in un registro di gioco temporaneo o in un database?


3
Chiedere "come lo fanno gli MMO" è troppo ampio e richiede conoscenze interne per rispondere con convinzione. Ho regolato la tua domanda di concentrarsi di più su come si dovrebbe implementare chat per il tuo progetto, con l'obiettivo di preservare la sicurezza quanto più possibile.

Risposte:


13

Non rimuoverai mai davvero la possibilità per una parte esterna di intercettare i pacchetti di chat dai client e non dovresti preoccuparti troppo, perché quando costruisci un MMO stai costruendo un gioco, non un punto di forza industriale piattaforma di chat crittograficamente sicura.

È necessario implementare i messaggi di chat come segue:

  • Il client trasmette i dati della chat, che almeno include il messaggio di chat ma probabilmente include anche informazioni sul canale o sul gruppo (come chat pubblica, chat di gilda, sussurro da giocatore a giocatore, ecc.).
  • Il server ottiene i dati della chat. Prima lo registra, probabilmente da qualche parte offline perché non è necessario mantenerlo in memoria più a lungo del necessario. La registrazione è importante e spesso trascurata, ma è incredibilmente utile per l'arbitrato GM e la diagnostica forense. Quando si esegue un MMO, si desidera registrare tutto .
  • Una volta che i dati sono stati registrati, il server determina chi deve ricevere il messaggio di chat e lo trasmette in modo appropriato. Il server può quindi rilasciare i dati rimanenti sul pavimento; non ne ha più bisogno.

Il punto più vulnerabile qui è la trasmissione iniziale da client a server. Se qualcuno ficcasse quei pacchetti, potrebbero vedere messaggi non tecnicamente destinati a loro. Potresti crittografare i dati, ma questo è un grande sforzo per un guadagno minimo. Il client deve essere in grado di decrittografare i pacchetti di chat alla fine e intercettare i pacchetti quando escono dal client sarebbe il posto migliore per eseguire il suddetto snooping, quindi la chiave è già disponibile per lo snooper, solo un po 'più difficile da trovare.

È molto importante passare la chat attraverso un server di cui hai il controllo, però. Non è necessario che sia il server di gioco, può essere un server dedicato per la canalizzazione della chat, ma vuoi controllare il routing. Ti consente di controllare le controversie GM, ti consente di applicare le richieste degli utenti per bloccare o silenziare altri utenti, risolve i problemi che potresti avere con il punch NAT o altri shenanigan di rete che potresti avere tentando di fare chat peer-to-peer e fornisce abbastanza una barriera agli hacker casuali (a cui è soggetta la chat peer-to-peer) per risolvere il 90% dei problemi di sicurezza. Che è circa buono come otterrai.


Utilizzando HTTPS funzionerebbe? Presumibilmente i messaggi di chat non sono critici per la latenza come il resto del gioco e quindi potrebbero essere inviati e ricevuti tramite HTTPS (ad es. Usando WebSocket) usando un meccanismo separato da altri pacchetti relativi al gioco.
Giustino,

1
Potresti farlo funzionare, ma non vedo perché varrebbe la pena implementare quel canale laterale aggiuntivo, specialmente quando potresti voler ancora alcuni messaggi di chat elaborati dal server di gioco per altri motivi (forse sono in realtà comandi slash , forse contengono una sorta di markup di collegamento degli oggetti, ecc.). È un'opzione però.

2

Sinceramente non sono sicuro al 100% di ciò che stai chiedendo. Speriamo che quanto segue sia utile.

Se guardi al planeshift , un MMO open source, puoi guardare il loro codice e vedere come hanno deciso di progettare il loro sistema. Questo non ti darà una visione esatta di tutti gli MMO, ma molto probabilmente le implementazioni sono simili in diversi giochi.

Ecco alcune indicazioni per scaricare la loro fonte. Dovrai verificarlo tramite SVN

Ho dato un'occhiata e se entri src/client/gui/vedrai una classe ChatWindow. Si occupa di inviare messaggi indietro e quarta al server per chattare e si occupa anche della cronologia degli input. Sembra che impacchettano le informazioni e le inviano al server per la consegna. Immagino quindi che queste informazioni sulla chat siano memorizzate sul loro server e quindi non raggiungibili da chiunque. Questo a meno che tu non sia in grado di accedere al database dei server per accedere ai record della chat. Non riesco nemmeno a immaginare che siano in grado di mantenere tutto. Se mantengono i registri delle chat probabilmente è solo per un certo periodo di tempo (forse qualche giorno?)

Comunque, una risposta ampia per una domanda ampia. Non posso davvero fare molto meglio di così senza una domanda più mirata. Sentiti libero di commentare se hai domande più strette e posso provare a risponderle.

Edit1: Notare inoltre che nella cartella client è possibile trovare e la classe authentclient. Gestisce l'autenticazione client, ecc. Immagino che gestirà anche la sicurezza relativa alla chat in termini di autenticazione su un server di chat. Potrebbero non avere server dedicati per la chat. Quindi potrebbe essere solo il server di gioco che esegue anche servizi di chat per tutti i suoi client. Questo è qualcosa che puoi capire studiando davvero il codice.

Per i MMO più grandi metterei soldi su di loro con server di chat dedicati solo per prendersi cura delle chat tra i giocatori. (Proprio come fanno per esempio).


1

La maggior parte degli MMO che ho giocato non memorizza i messaggi per un periodo di tempo più lungo. Perché questo molto probabilmente li trasformerebbe in una GameCompany con un badge negativo come l'NSA. A meno che, i giocatori abbiano avuto accesso diretto al loro database.

Runescape ha i messaggi archiviati nella cache ed è disponibile solo per un piccolo periodo di tempo. Non ho mai sentito parlare di nessuno messo al bando a causa del fatto che tali dati sono stati archiviati. Se uno dovesse mai riferire un'altra commedia per quello che ha detto. Deve essere veloce, fino a quando il suo limite di chat di 500 ~ non viene esaurito. Trascorso tale termine, tutti i suoi messaggi verranno eliminati. Nel posto più affollato, dove i giocatori si gridano a vicenda, dura fino a 10 secondi.

I messaggi vengono sempre inviati tramite server e la memorizzazione avviene su server non client. Altrimenti, il giocatore A che ha violato il client, sarebbe in grado di manipolare l'array responsabile della chat e scrivere letteralmente che PLAYER B ha scritto qualcos'altro. Dopo un po 'potrebbe segnalare quel giocatore per aver scritto qualcosa e la cache degli altri giocatori potrebbe non contenere più tali informazioni.

Se memorizzi i messaggi sul CLIENT, che è stato eseguito da un portale di chat GaduGadu.pl, gli utenti perderanno la possibilità di controllare le loro chat su PC diversi. I dati generati dall'utente sarebbero vulnerabili a terzi. Principalmente negli internet caffè pubblici. O a casa di amici che potrebbero cercare vendetta sul suo ex amico.

Se lo memorizzi sul tuo server, è impossibile per il Giocatore B accedere ai dati del Giocatore A e viceversa. Tieni presente che dire "il giocatore B può accedere a tali dati" è una domanda ampia. Non puoi mai dire se i dati sono al sicuro, a meno che il tuo server non sia offline! Ecco un esempio


0

La memorizzazione dei messaggi è necessaria solo per la consegna quando si desidera recapitarli in un secondo momento. Ad esempio, quando si desidera consentire alle persone di inviare messaggi ai giocatori offline che vengono recapitati al successivo accesso o quando si desidera consentire a un amministratore di leggere la chat in un secondo momento.

Quando non è necessario, la gestione della chat può e deve essere eseguita completamente in memoria.

Ogni messaggio di chat inviato da un client deve includere alcune informazioni sul destinatario (messaggio pubblico, gilda, messaggio privato al giocatore X). Il server dovrebbe quindi determinare i caratteri a cui è consentito leggere il messaggio:

  • Per i messaggi pubblici, questi sono i caratteri in un raggio specifico attorno al carattere di invio
  • Per i messaggi di gilda, questi sono i personaggi che hanno la stessa gilda del mittente che sono attualmente online
  • Per i messaggi privati, è il personaggio con lo stesso nome, quando è online

Il messaggio dovrebbe quindi essere inviato ai client che controllano questi caratteri.

L'invio di un messaggio a un client che non dovrebbe mostrarlo all'utente è uno spreco di traffico e una violazione del principio "non fidarsi mai del cliente".


1
Tale approccio rimuove la possibilità per gli amministratori del gioco di rivedere i registri delle chat in un secondo momento per arbitrare le controversie e gestire i reclami di abuso. Quindi potrebbe essere efficiente, ma come amministratore MMO, probabilmente non è quello che vuoi. Tutta la chat deve essere registrata e tenuta in modo sicuro, almeno per un periodo di tempo predefinito prima di essere archiviata / eliminata.
Mr Cranky,

Sono d'accordo con quello che dici di non inviarlo a clienti che non dovrebbero essere autorizzati a leggerlo; il filtro deve essere eseguito sul lato server.
MrCranky,

@MrCranky Quando vuoi davvero accedere alla chat privata - che potrebbe violare le leggi sulla privacy in alcuni paesi in determinate condizioni - puoi comunque registrarla in un file o database, ma non è correlato a chi lo invii. Risposta aggiornata, però.
Philipp,

1
Non è privato se lo stai inviando al server di gioco e l'EULA dovrebbe sempre chiarirlo. Non credo che troverai MMO là fuori che pretendono diversamente. Non ci sono interazioni private quando il giocatore utilizza il gioco come intermediario; questa non è un'esperienza di chat peer-to-peer, stanno interagendo con il gioco.
MrCranky,

1
Non c'è aspettativa di privacy in un gioco online, le leggi non funzionano in questo modo.
Patrick Hughes,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.