Sì, è vulnerabile, ma non nel modo in cui sospetti. L'utente malintenzionato non proverebbe a modificare l'URL caricato, ma a eseguire direttamente il codice. Ad esempio:
$_GET['fname'] = '"+(function(){/*any_code_i_like*/})()+"';
diventerà:
$.ajax({
url: "http://mywebsite/script?param="+(function(){/*any_code_i_like*/})()+""
e il codice verrà eseguito anche prima di richiedere l'URL con ajax. È solo un esempio, ci sono altri vettori che potrebbero funzionare anche qui . Il modo più semplice per evitare il parametro per evitare che XSS in questo contesto utilizzi urlencode()
in PHP come questo:
$.ajax({
url: "http://mywebsite/script?param=<?php echo urlencode($_GET["fname"]); ?>"
dataType: "jsonp",
success: function(response) {
document.write(/*fields from response object*/);
},
});
Inoltre, dai un'occhiata a Foglio trucchi OWASP XSS Prevenzione .
Aggiornamento: Dopo aver aggiornato la domanda - non esiste una vulnerabilità XSS qui (non è possibile ad esempio indirizzare la richiesta a un altro dominio), ma l'esempio è vulnerabile a una bestia diversa - Polivalenza dei parametri HTTP . Potrebbe non avere importanza in questo caso esatto, ma immagina che il parametro indicato sia:
a_valid_value¶m=another_param_injected
L'utente malintenzionato è in grado di iniettare parametri HTTP GET aggiuntivi che potrebbero essere importanti per l'applicazione e potrebbe modificare il flusso di esecuzione (ad esempio, il parametro admin=1
). Dovresti abituarti a scappare / codificare tutto ciò che proviene dall'input dell'utente. In questo caso modificato, dovresti usare la funzione Javascript encodeURIComponent
che impedisce a attacker di iniettare '&', '=' e '?':
"http://mywebsite/script?param=" + encodeURIComponent($("#field").val()),