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
To Capitol City GDR: Gioco Chiuso!
enchantedbaygdr ha aperto un annuncio di ricerca: Enchanted Bay Gdr ricerca Tester
World of Warship → MMO gratuito con frenetiche battaglie navali ambientate nel ventesimo secolo. Salpa con la tua nave ed affronta i nemici!
Ardhalyce: ✨ Benvenuti ad Ardhalyce! ✨
deanna ha recensito Ex Gratia GDR
Il gestore di La Tana del Ladro ha risposto alla recensione di greg
Il gestore di La Tana del Ladro ha risposto alla recensione di ethara
Sponsorizzati con noi! → Sponsorizza il tuo gioco su GDR-online! Trova nuovi giocatori fra i migliaia di appassionati che ogni giorno visitano il portale!
Age of Crystals: Buon compleanno Age of Crystals!
Il portale raggiunge i 16.200 giochi catalogati! Grazie a tutti!
Nuovo Play by Forum Scolastico → Sunday Bloody Sunday
Entropia Universe → Lascia che il tuo avatar esplori nuovi mondi e viaggi tra i pianeti in questo stupendo MmoRpg Sci-Fi Free to Play!
I dati del generatore di rank sono stati aggiornati!
Shadow Scape: ✨ Aggiornamento: Razze da BG aperte!
Raxhodya Yaoi GdR: Un po' di eclissi. [Quest gialla-evento Roma]
Legacy of Magic: Il tentativo di furto del Tomo
World of Tanks → Lanciati in epiche battaglie spalla a spalla con altri giocatori. Conquista la supremazia nel mondo dei Carri Armati!
Chat RpgEngine - Impara a creare e gestire le chat su RPGENGINE
La Terra di Mezzo - Recensione del GDR Fantasy "La Terra di Mezzo" ambientato nel fantastico mondo di Tolkien
Giochi Mitologici - Lista dei giochi mitologici in cui gli Dei camminano fra di noi..
Statistiche Tecniche 2017 - Gdr-online.com pubblica i dati tecnici dei suoi visitatori per l'anno 2017. Spulcia i dati disponibili!
GdR su ForumCommunity - Lista dei giochi di ruolo play by forum sul circuito ForumCommunity
Scarica GDRCD - Scarica gratuitamente GDRCD. L'Open Source più famoso ed utilizzato per realizzare GdR Play by Chat
Jedi Survivor - Star Wars Jedi: Survivor, sarà una trilogia? Leggiamo il commento di Stig Asmussen!
Eternal Dream - Intervista al gestore di Eternal Dream Hunter X Hunter Story play by chat manga!