Non penso che sarebbe una saggia idea dare un how-to sugli attacchi XSS; sebbene esistano molte risorse, ad es. Ch. 12 del WAHH su XSS.
Il modo migliore per prevenire gli attacchi XSS è sostituire tutti i caratteri speciali utilizzati in questi attacchi (ad esempio <
, >
, &
, "
, '
con il loro equivalente carattere HTML <
, >
, &
, "
, '
) per tutto il testo fornito dall'utente e che consente agli utenti di contrassegnare i loro commenti usando un linguaggio di markup non html limitato (come markdown) che viene solo sostituito in una cassastrong sottoinsieme di html nell'ultima fase di elaborazione. (Fai attenzione anche che i loro commenti non vengano mai eseguiti in nessuna sorta di elaborazione javascript che hai scritto).
Se decidi di ignorarlo e di disinfettare solo tag specifici (come <script>
, <object>
, javascript
controlla che l'igienizzazione sia eseguita in modo ricorsivo (quindi <scr<script>ipt>
non diventa <script>
dopo un singolo -passare l'igiene), è insensibile al caso / spazio bianco, e si ferma solo quando l'ultimo tentativo di risanamento non ha modificato l'input. In python qualcosa come
import re
def sanitation_single_pass(user_input):
pattern = re.compile('<[^>]*(script|object|meta|style)[^>]*>', re.IGNORECASE)
# this is very quick sample regex that could appear in a sanitation routine
# not meant to be inclusive of most XSS threats;
# e.g. this doesn't prevent having javascript in links or img src, etc.
return pattern.sub('', user_input)
def sanitation(user_input):
processed_user_input = sanitation_single_pass(user_input)
while processed_user_input != user_input:
user_input = processed_user_input
processed_user_input = sanitation_single_pass(user_input)
return processed_user_input
Fai anche attenzione ai problemi di codifica, assicurati di definire un set di caratteri ( <meta charset="utf-8">
nella parte superiore dei modelli html) e di forzare l'input dell'utente in questa codifica prima della sanitizzazione. Prova anche a riconoscere che alcuni browser interpretano cose come java
script
come javascript
( 

è un'interruzione di riga), ecc.