Controllo su ultima entry in DB postato il 10/01/2017 17:43:38 nel forum programmazione, gdrcd, open source, hosting e modificato da gdr-online.com il 10/01/2017 17:47:00
Buonasera,
scrivo perché vorrei sapere come impostereste un controllo sull'ultima immissione fatta in DB...
Nello specifico, vorrei fare un controllo sull'ultima entry in DB, nella Tabella 'Chat'.
L'idea (che potrebbe tornare utile anche ad altri) è quella di creare un "if" che impedisca allo stesso utente di mandare la stessa frase in chat più di una volta.
Questo per evitare il problema dei multipli invii in chat dovuti a:
- Problemi di linea (che causano il reinseriment della stessa frase 5 volte di seguito XD)
- Problemi di refresh esagerati (chi preme f5 ogni 2 secondi XD)
- Disturbatori (che inviano la stessa frase, magari anche offensiva, in chat, tanto per dare fastidio)
Il controllo quindi dovrebbe verificare se:
La frase inviata in chat dall'utente X è la stessa frase inviata dallo stesso utente nell'ultima azione inviata in chat.
Quindi, a parole:
Pagine → 1
10/01/2017 20:50:51 e modificato da dyrr il 10/01/2017 20:53:56
Per i primi due casi citati più che un controllo sull'ultima azione inviata dal giocatore nel database imposterei il form con un token di controllo.
Qui puoi trovare un esempio dettagliato di cosa intendo: https://css-tricks.com/serious-form-security/ https://css-tricks.com/serious-form-security/ ma puoi trovarne molti altri cercando fon form token o crsf token.
In pratica il concetto è questo come flusso:
Viene generato un token univoco con php
Viene salvato sia in sessione sia in un campo hidden del form.
Quando il form viene inviato viene fatto un controllo se il token in sessione corrisponde al token inviato dal form, se i due corrispondono vengono effettuate le operazioni sul form, altrimenti no.
Cosa succede se il form viene inviato più volte tipo con un F5:
essendo la pagina strutturata così:
blocco di controllo
generazione del token
Laprima volta che viene inviato il form i due token corrispondono, la seconda volta il token di sessione è diverso da quello del form perchè ne è stato generato uno nuovo.
Per i disturbatori più che un contorllo sulla stessa frase, visto che potrebbero aggirare il controllo, semplicemente cambiando l'ultima lettera della frase o altro, io imposterei un controllo antiflood, ovvero che impedisca l'invio di un messaggio in chat se non è passato almeno un tot di tempo dal precedente messaggio in chat dell'autore.
Visti i tempi medi di una giocata in un play by chat, anche se imposti un controllo che un personaggio non possa inviare due messaggi di fila prima che siano passati un paio di minuti il gioco non ne dovrebbe risentire minimamente.
Fare questo controllo è abbastanza semplice, fai una query TIPO questa
12/01/2017 01:18:41
Hmm, l'idea del Token mi piace molto (molto più elegante dei mei mille "if" XD)
La soluzione del "antiflood" (a parte che mi ricorda i Flood di Halo XD) invece, sarebbe un po' "problematica" in quanto in gioco abbiamo una funzione che ci permette di inviare in chat una correzione alla frase inviata (un semplice comando che permette di inserire una frase in rosso, che rappresenta la correzione dell'errore inviato). Quindi bloccando l'invio per tot min, impedirei anche agli utenti di mandare la correzione. Inoltre in alcuni casi il master potrebbe voler inviare più dadi (per esiti separati dai vari PG) e quindi potrebbe rappresentare un problema. (ovvio, potrei creare eccezioni per il comando "Correzione" e per i "Master" e i "Dadi master", ma un eventuale disturbatore potrebbe usare anche il comando delle correzioni per dare fastidio...
Grazie mille per i consigli. Intanto tenterò di procedere con la strada Token (che risolve cmq il problema inizialmente sollevato, e principale, quello dei refresh maniacali e dei hickup XD)
Vi terrò aggiornati anche per postare l'eventuale codice funzionante per chi ne avesse/avrà bisogno.
Grazie
12/01/2017 01:52:37
puoi bloccare l'invio anche solo per l'invio di determinati tipi di azioni per tot tempo, nel senso a suo tempo quando lo avevo fatto io solo i messaggi normali erano bloccati come intervallo ad 1 minnuto di tempo minimo tra l'uno e l'altro per lo stesos utente. skill, messaggi dei master, tiri di dado invece non lo erano
Discussione seguita da
Pagine → 1
Rispondi alla Discussione Aggiungi ai Preferiti Inoltra Discussione Forum Programmazione, GDRCD, Open Source, Hosting Elenco Forum
Planethos GdR: Una nuova profezia
NosTale → Con l’aiuto della spada e della bacchetta magica risolverai abilmente intricate missioni e domerai coraggiosamente mostri selvaggi!
Metin2: Informazioni sul server migliorate
Age of Crystals: Rallentamenti estivi
dbzgdr ha risposto alla discussione: Dragon Ball Z Gdr
Titan Revenge: Calendario eventi fino a fine mese online!
Due Città → Le Due Città - Gioco di Ruolo Fantasy Storico. Scrivi la tua storia e lasciati trasportare dalla fantasia!
Enlisted: Modifiche al sistema di aggiornamento
pyro72 ha aperto un annuncio di ricerca: World Without Heroes ricerca Giocatore
World of Tanks → Lanciati in epiche battaglie spalla a spalla con altri giocatori. Conquista la supremazia nel mondo dei Carri Armati!
World Without Heroes: News GDR: Pubblicazione e Nuovo Inizio
I dati del generatore di rank sono stati aggiornati!
Il gestore di Nexi Generation ha risposto alla recensione di deanna
World Without Heroes → Affronta le forze occulte che minacciano il mondo in World Without Heroes, un gdr play-by-mobile su Whatsapp basato sulle teorie del complotto!
PbC epidemia del web? - Gioco di Ruolo testuale (gdr by chat): un fenomeno squisitamente nostrano, o epidemia del Word Wide Web?
Cleveland City - Fantagiochi presenta il gioco di ruolo via chat Cleveland City!
Giochi Twilight - Lista completa dei giochi di ruolo online ambientati nel mondo di Twilight
GDR e Realtà - Analizziamo con la Dott.ssa Altoviti la fuga dalla realtà mediante i GDR-online..
Eroic Fantasy - Aspetti della fantasy eroica nella letteratura contemporanea
Attacchi e Difese - Lista degli attacchi e difese possibili in questo breve manuale da tenere sempre a portata di mano!