Sí, es vulnerable, pero no de la forma que sospechas. El atacante no intentaría modificar la URL cargada, sino ejecutar el código directamente. Por ejemplo:
$_GET['fname'] = '"+(function(){/*any_code_i_like*/})()+"';
se convertirá en:
$.ajax({
url: "http://mywebsite/script?param="+(function(){/*any_code_i_like*/})()+""
y el código se ejecutará incluso antes de solicitar la URL con ajax. Es solo un ejemplo, hay otros vectores que también funcionarían aquí . La forma más sencilla de escapar del parámetro para evitar XSS en este contexto sería usar urlencode()
en PHP como este:
$.ajax({
url: "http://mywebsite/script?param=<?php echo urlencode($_GET["fname"]); ?>"
dataType: "jsonp",
success: function(response) {
document.write(/*fields from response object*/);
},
});
También, eche un vistazo a Hoja de trucos de prevención OWASP XSS .
Actualización: Después de actualizar la pregunta, aquí no hay una vulnerabilidad de XSS (no puede, por ejemplo, dirigir la solicitud a otro dominio), pero el ejemplo es vulnerable a una bestia diferente, polución del parámetro HTTP . Puede que no importe en este caso exacto, pero imagine que el parámetro dado es:
a_valid_value¶m=another_param_injected
El atacante puede inyectar parámetros HTTP GET adicionales que podrían ser importantes para su aplicación y podrían cambiar el flujo de ejecución (por ejemplo, el parámetro admin=1
). Debería adquirir el hábito de escapar / codificar todo lo que proviene de la entrada del usuario. En este caso modificado, debe usar la función Javascript encodeURIComponent
que evita que el atacante inyecte '&', '=' and '?':
"http://mywebsite/script?param=" + encodeURIComponent($("#field").val()),