Come eseguire correttamente l'escape di una stringa da un campo di input, evitando gli attacchi XSS in JavaScript

1

Ho una piccola applicazione e ho letto molto su XSS, quindi voglio disinfettare l'input che ho.

Durante la ricerca su google, mi sono imbattuto nella guida OWASP in cui si afferma che è necessario utilizzare quanto segue per disinfettare correttamente l'input:

String safe = ESAPI.encoder().encodeForJavaScript( request.getParameter( "input" ) );

Sono abbastanza nuovo per la codifica, quindi lo copio / incollato alla mia funzione JavaScript e non sembra funzionare.

Una rappresentazione approssimativa di ciò che sto cercando di fare è eseguibile qui , il codice:

<input name="this" type="text" maxlength="16" id="this" />
<button onclick="run()">run</button>

<script>
function run() {

// how I used to do it
// a = document.getElementById("this").value;

safe = ESAPI.encoder().encodeForURL( document.getElementById("this").value );

alert(safe);
}

</script>

I caratteri validi per le mie applicazioni sono solo i numeri [0-9] e un punto ( . ).

Come faccio a uscire / disinfettare correttamente un campo di input in JavaScript per prevenire attacchi XSS.

    
posta MikeDyson 09.03.2017 - 09:49
fonte

1 risposta

4

I'm quite new to coding so I copy/pasted it to my JavaScript function and doesn't appear to be working.

Potrebbe non funzionare perché ESAPI è una libreria a cui devi fare riferimento in un tag script HTML; non fa parte del javascript principale fornito con il browser. ESAPI sembra essere disponibile da github , che contiene anche un file README.md che spiega come caricarlo in HTML . Potresti aver perso quella parte? La tua domanda non dice.

Inoltre, nota che dovrebbe essere

var safe = ....

non solo

safe = ....

Questo è importante in javascript. Non puoi creare variabili globali e inquinare lo spazio dei nomi globale se puoi aiutarlo.

Valid characters for my applications are only the numbers [0-9] and a dot (.).

In questo caso, ti suggerirei di usare un'espressione regolare javascript per vedere se il tuo input corrisponde a questi caratteri e mostrare un messaggio di errore se non lo fa. ESAPI sembra essere eccessivo per quello. Convalidare input "conosciuti" è molto più sicuro che cercare di pensare a tutti gli input problematici e rimuoverli / trasformarli attraverso una routine di igiene. Fai qualcosa del genere:

var validationRegex = new RegExp('^[0-9.]+$');
var text = document.getElementById("this").value;
if (text.match(validationRegex)) { }; // do something when text matches

Non ho molta esperienza di javascript, quindi potresti voler leggere su come le espressioni regolari funzionano in javascript per ricontrollare quel codice. Fai attenzione con il carattere punto - al di fuori di [ ] , significa "qualsiasi carattere tranne newline" nelle espressioni regolari.

Infine, se invii i dati del tuo campo di input estratto a un server (sto intelligentemente partendo dal presupposto che non vuoi semplicemente produrre i dati tramite alert(safe) - nel qual caso non avresti bisogno di disinfettare in primo luogo), sarebbe molto meglio disinfettare i dati sul server, perché ci si può fidare dei servizi igienico-sanitari. Se si disinfetta il client, un utente malintenzionato potrebbe comunque inviare i dati del server non pubblicitari.

    
risposta data 09.03.2017 - 10:03
fonte

Leggi altre domande sui tag