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 Segui Discussione Inoltra Discussione Forum Programmazione, GDRCD, Open Source, Hosting Elenco Forum
I dati del generatore di rank sono stati aggiornati!
The Eyrie GdR: Halloween ad Harrenhal
RAID Shadow Legends → Plasma i tuoi eroi fino a farli diventare vere e proprie armi viventi e assembla i più epici gruppi d'assalto mai visti finora!
piromee ha aperto un annuncio di ricerca: Momentum Incantatio ricerca Tester
Il gestore di Portus: Harry Potter Gioco di Ruolo ha risposto alla recensione di dreamboy
Black Sails Chronicles: ON - Casa delle Aste
RAID Shadow Legends: Summon Boost e Champion Chase
CRSED: F.O.A.D. → Brutale sparatutto MMO in cui vince l'ultimo giocatore che resta in vita! Il giocatore sarà accompagnato da armi realistiche e magie!
Storie di Esperia: Uno strappo nella notte
Crystal Tokyo: Ingresso nella Via Magica
alexandros si è accreditato come gestore di Shinobi no Saisei - Naruto x Boruto GDR
Il gestore di Naruto x Boruto GDR - New Rebirth ha risposto alla recensione di jimcho
Enlisted → Guida la tua squadra di soldati in combattimenti su larga scala, con fanteria, veicoli corazzati e aerei della IIa Guerra Mondiale!
Il gestore di Naruto x Boruto GDR - New Rebirth ha risposto alla recensione di theduelist92
War Thunder: Chieftain 900: Capo della Royal Ordnance
Il portale raggiunge i 17.200 giochi catalogati! Grazie a tutti!
Hero Wars: Anomalia dei Pets! 🐾
Storie di Agarthi → Un Varco si apre davanti a te, un mondo tra i mondi è a portata di mano. Lasciati alle spalle le certezze, inizia l'avventura!
Signore del Male - Le 100 cose che farò se mai diventerò un Signore del Male!
Radio per GdR - Semplici istruzioni su come utilizzare Spreaker.com per creare un canale webradio per il proprio GdR
Cartoon Village - Video - Intervista ai gestori di Naruto World e One Piece Islands
Giochiamo di + - Il fenomeno del play by hangout, ovvero il gioco di ruolo online nella comunità di Google+, e un'intervista a Matteo Suppo!
Sailor Land - Intervista alla gestione di Sailor Land, il play by chat ambientato nell'universo di Sailor Moon!
I Vampiri - La nascita del Vampiro nella letteratura e nel cinema Europei
Guida NFT - Guida agli NFT: Come creare, vendere e acquistare Token Non Fungibili anche in ambito gaming!