Ho un'idea su come sconfiggere XSS in modo così semplice che potrebbe funzionare e mi chiedevo se qualcuno avesse già fatto qualcosa di simile.
L'obiettivo qui non è l'efficienza ma la sicurezza. In altre parole, non mi interessa di scambiare bandwith per sicurezza. La mia idea sarebbe quella di servire ogni singolo personaggio all'interno di semplici tag HTML.
Sostanzialmente se il seguente, per qualsiasi motivo, sarebbe un exploit XSS funzionante: 0WNED!byXSS
(che per qualsiasi ragione nessuno avrebbe rilevato), allora sarebbe servito come:
<i>0</i><i>W</i><i>N</i>E<i>D</i>!<i>by</i>X<i>S</i>S<i>
Fondamentalmente un ciclo si assicurerebbe di fare solo:
- scrivi
<i>
- scrivi un singolo carattere
- scrivi
</i>
Qualcosa del genere potrebbe funzionare tecnicamente (problemi di performance e bandwith a parte) e qualcosa del genere è mai stato fatto?
Modifica
Ecco un esempio (semplificato) di ciò a cui sto pensando.
Invece di servire questo:
<html>
<head>
<title>Sample</title>
</head>
<body>
<table>
<tr>
<td>Here goes user input</td>
<td>potentially containing an XSS exploit</td>
</tr>
</table>
</table>
</body>
</html>
Mi servirebbe questo:
<html>
<head>
<title>Sample</title>
</head>
<body>
<table>
<tr>
<td><i>H</i><i>e</i><i>r</i><i>e</i><i> </i><i>g</i><i>o</i><i>e</i><i>s</i><i> </i><i>u</i><i>s</i><i>e</i><i>r</i><i> </i><i>i</i><i>n</i><i>p</i><i>u</i><i>t</i></td>
<td><i>p</i><i>o</i><i>t</i><i>e</i><i>n</i><i>t</i><i>i</i><i>a</i><i>l</i><i>l</i><i>y</i><i> </i><i>c</i><i>o</i><i>n</i><i>t</i><i>a</i><i>i</i><i>n</i><i>i</i><i>n</i><i>g</i><i> </i><i>a</i><i>n</i><i> </i><i>X</i><i>S</i><i>S</i><i> </i><i>e</i><i>x</i><i>p</i><i>l</i><i>o</i>it</td>
</tr>
</table>
</table>
</body>
</html>
Il tag <i>
è stato scelto arbitrariamente, qualsiasi tag (preferibilmente a una sola lettera) farebbe.
Diverse funzionalità del sistema operativo / browser sembrano continuare a funzionare correttamente:
- Posso ritagliare correttamente il menu negli appunti
- Posso ancora cercare testo ( eg Posso cercare "goes" e nonostante ogni singola lettera di "vada" è racchiuso tra tag il browser lo trova ancora valido)
Considero che il motore di ricerca avrebbe comunque analizzato / indicizzato correttamente il contenuto (non troppo sicuro di quello che ha detto).
Per me sembra un modo abbastanza semplice ed efficace per prevenire molti exploit sulla base di cattivi input dell'utente.