Protezione di una chat [ajax / php / mysql] postato il 14/10/2009 00:28:42 nel forum programmazione, gdrcd, open source, hosting e modificato da ghennadi72 il 14/10/2009 10:08:30
Ciao, ho alcuni dubbi sul come proteggere al meglio la chat che sto realizzando. Ero partito con l'idea di impementare una chat "old-style", poi mi sono incuriosito sui thread che parlano delle possibili implementazioni di ajax, e ho provato a fare quanto segue.
Premetto che ho una formazione da autodidatta, cominciata con turbo pascal, transitata brevemente in delphi, piccola carrellata su c++ e poi l'approdo a php, saltando del tutto o quasi javascript (allergia di pelle?). Peggio, ho una mentalità tipicamente da programmazione strutturata, la OOP mi causa malditesta già al classico esercizio dell'ascensore... 😁
Quello che ho fatto forse può sembrare molto raffazonato, un po' come un carro funebre ottocentesco dotato di compressore e dipinto a vernice rossa fosforescente (citazione da Stephen King).
Il sistema chat si compone di 5 file:
chatpub.php : é solo il frameset (lo so, sono deprecabili e deprecati, mi cospargerò il capo di cenere) che contiene le due pagine legate all'input e all'output.
Riceve l'id della locazione con metodo GET (filtrato con intval() per evitare il get di stringhe impostate manualmente) e lo scrive anche in una variabile di sessione; al caricamento (e all'eventuale refresh forzato) imposta a zero una variabile di sessione lastchat (che mi serve dopo, per verificare se l'utente é appena entrato in chat o se ci stava già) e una variabile di sessione ingressochat impostata con la funzione time() di php.
chatpub_input.php: é il frame di inserimento del testo. Riceve l'ID della locazione dalla sessione, ed invia a sé stesso con metodo POST. In base alla presenza o meno di caratteri speciali (per le azioni, le stringhe di masterizzazione o moderazione, sussurri, etc)
classifica il tipo di messaggio per tipo e lo salva nel database. La logica é quasi identica a quella delle chat di GDR-CD extreme.
chatpub_view.php: é il frame visibile in cui viene mostrato l'output della chat. La pagina di per sè non si refresha. Qui interviene ajax, che tramite un js incluso avvia una funzione al primo caricamento della pagina e aggiorna i contenuti del DIV principale, identificato tramite il parametro ID="div_main".
chatajax.js: é il "motore" dell'inserimento dei contenuti nel DIV principale della chatbub_view.php; la funzione effettua una chiamata XMLHttpRequest all'ultimo file della cinquina, che va a cercare nel database secondo l'ID della locazione (in sessione) e le variabili lastchat e ingressochat (anche quest in sessione). Saltando i dettagli, richiama un contenuto col sistema XmlHttp.responseText e aggiunge il contenuto in coda al contenuto già presente nel DIV con la funzione .innerHTML. Poi si auto timerizza per un nuovo ciclo dopo 2 secondi e posiziona la barra di scrolling in fondo.
chatpub_xmlhttp.php: é il "motore" nascosto, che in base ai parametri di cui sopra presenti in sessione (e altri, tipo l'id del personaggio, etc) compone il DIV da mostrare alla pagina richiedente sotto forma di normale codice html, trattato come se fosse un file di testo dal metrodo .responseText
A seconda che sia il primo ingresso in chat, la pagina genera l'html necessario a visualizzare le azioni degli ultimi 10 minuti, se presenti, oppure solo le azioni inviate dopo l'ultima già visualizzata in precedenza.
Terminato l'output che viene inviato a chatpub_view.php, la pagina aggiorna in sessione la variabile lastchat.
I tipico output di chatpub_xmlhttp.php potrebbe somigliare a questo (supponendo che la riga da mostrare sia identificata come una stringa di normalissimo parlato):
Pagine → 1
14/10/2009 14:18:18
Fai l'escape, in input, di ogni carattere potenzialmente pericoloso direttamente da funzione e non manualmente con un replace :)
mysql_real_escape_string($testo) è la funzione definitiva e più sicura.
Ti consiglio htmlentities($var) perchè a differenza di specialchars, quest'ultima codifica ogni carattere html nella sua relativa entità. Ma sono scelte che non intaccano molto la tua sicurezza :P
Per il resto la sicurezza in chat (se non sono in ballo altri meccanismi oltre al testo) è abbastanza semplice, l'importante è che usando ajax lo si usi un po' con la testa e non semplicemente per evitare lo sfarfallio o il reload.
14/10/2009 14:25:23
Dopo aver effettuato gli escape di cui ti ha suggerito Il "mistico" Lato Oscuro della Colazione, converti tutto (server side, in post) in hex con rawurlencode e te lo riconverti in lettura con javascript con decodeURIcomponent.
Questa soluzione oltre a fornire un perfetto escape delle informazioni che passi alla query, ti torna utile per far visualizzare sempre e comunque alla perfezione qualsiasi carattere, indipentendemente dalla codifica (giuro, ho provato b.b).
15/10/2009 01:21:52
Aggiungo: l'importante è che tutti i controlli di sicurezza li esegui lato server, lato client lascia solo tutte quelle scemenze che riguardano la visualizzazione in quanto è facile eseguire a piacimento gli script nella pagina, basta utilizzare la barra degli indirizzi del browser addirittura.
es:
Discussione seguita da
Pagine → 1
Rispondi alla Discussione Aggiungi ai Preferiti Inoltra Discussione Forum Programmazione, GDRCD, Open Source, Hosting Elenco Forum
World of Warship: Aggiornamento 13.11: anteprima
gdr-online.com ha risposto alla discussione: Parere su BrowserGame
World of Tanks → Lanciati in epiche battaglie spalla a spalla con altri giocatori. Conquista la supremazia nel mondo dei Carri Armati!
W40K Dathyar: Specializzazioni
NosTale: Ora nel NosMall: dolcissimi mini-pet
DarkOrbit: Aggiorna la scatola dell'Apocalisse!
I dati del generatore di rank sono stati aggiornati!
Game of Thrones → Pronto a diventare il Signore dei Sette Regni? Guida la tua grande casata in epiche battaglie PvP ed esplora il mondo di Westeros!
aik ha aperto una nuova discussione: Parere su BrowserGame
eXtremelot: La Bussola dei Cartografi di Lot
Dallas Black Gold: [Trama] JFK Memorial
Hero Wars: Artefatti dei Titani!
OGame → In OGame migliaia di giocatori da tutto il mondo competono tra di loro per conquistare l'intero universo!
bother ha recensito Never Have I Ever: Mysteries of Laconia Bay
Games of Thrones Winter is Coming: #giveaways codice regalo! 🥳
Enlisted: Migliorare e ottimizzare le ombre
Road to Hamartia: CACCIA: Sarà uno o tre?
Pirates of the Caribbean → Parti per un'avventura con Jack Sparrow, Will Turner, il Capitano Barbossa e altri spadaccini del franchise cinematografico Pirati dei Caraibi!
DreamAge - Intervista ai gestori di DreamAge, play by chat fantasy aperto da oltre 12 anni!
Altervista e i GdR - Il blog ufficiale di Altervista parla dei nostri amati giochi di ruolo online!
Tolkien e Lingua - Aspetti linguistici e traduttologici nell'opera di J.R.R. Tolkien.. scarica la tesi!
AfterHogwarts GDR - Intervista ai gestori del GdR play by forum potteriano AfterHogwarts GDR!
Angels City - Intervista al gestore del gioco di ruolo via chat erotico Angels City
Dati Demografici - Analizziamo assieme i Dati Demografici dei Giocatori di Ruolo Online grazie a Google Analytics