Recentemente mi sono unito a un team che lavora su un'applicazione con un sistema di chat integrato. È un sistema di chat standard che consente ai client di comunicare, con i messaggi instradati attraverso un server centrale.
Di solito quando si ha a che fare con il testo di input dell'utente, si consiglia di "escape-on-output" invece di "escape-on-input". Esistono numerosi esempi ( 1 , 2 , 3 ) sul motivo per cui è meglio, ma in pratica si riduce a: è necessario disinfettare il testo in base al contesto in cui viene utilizzato. Se si inserisce un messaggio di chat utente in un database, è necessario eseguire l'escape per SQL e utilizzare istruzioni preparate. Se visualizzi il messaggio chat su un browser web, dovresti eseguire l'escape per HTML. Ecc.
Sfortunatamente, nessuno dei precedenti problemi di sicurezza è stato riconosciuto fino a poco tempo fa. (Sì, davvero).
La soluzione rapida per "hackerare" era filtrare i messaggi di chat degli utenti quando venivano ricevuti dal server, e escludere qualsiasi personaggio dall'aspetto nefasto (<, >, ", ', {, }, \, ecc.) Ciò ha portato a molti reclami da parte degli utenti, dal momento che la loro punteggiatura sarebbe scomparsa magicamente durante la visualizzazione nel canale di chat.
Voglio credere che possiamo fare meglio di questo "hacking" attuale e consentire agli utenti di digitare qualsiasi testo che desiderano in un ambiente sicuro.
Il problema è che sto lavorando con restrizioni apparentemente impossibili. Disponiamo di numerose versioni del client, distribuite su molti dispositivi, migliaia di utenti e lenti tassi di adozione delle nuove versioni. C'è molta frammentazione e non possiamo forzare l'aggiornamento dei client.
La gestione non si preoccupa troppo dell'esperienza utente e in pratica mi ha detto:
Implement a solution to protect against every possible type of malicious user-input without having to touch the clients. Oh, and also protect against any future 'careless' developer who doesn't know what they are doing and might accidentally try to
eval()
the user chat message.
(Sì, in realtà mi è stato detto che l'ultima parte).
C'è una soluzione migliore a questo problema che fornisca un'esperienza utente leggermente migliore?
Grazie per la lettura.