Básicamente, está preguntando si su creación de objeto a través de una consulta de URL parametrizada puede explotarse de tal manera que se pueda cargar con un código XSS. La respuesta corta no es a menos que planees usar este objeto recién creado para cualquier cosa. La respuesta larga, por supuesto, depende de lo que planee hacer con este objeto recién creado, saneará sus propiedades y llamadas de función, y si se da cuenta de que su código no tiene nada que ver con la mitigación de ataques de tipo XSS, y eso en realidad, permite que un explotador potencial cargue cualquier objeto al que pueda estar haciendo referencia posteriormente con cargas útiles maliciosas y llamadas a funciones. En esencia, su código no hace nada más que dividir la consulta de URL parametrizada después de #
en una estructura de objeto:
esta URL:
mywebsite.com#method1=document.location.href%3D%22do.not.ever.open.me%22
en este objeto:
var myObject = {
method1 : "document.location.href=\"do.not.ever.open.me\""
};
¿Es seguro usar este objeto? Si aún no sabe la respuesta, entonces mi respuesta debe ser: no !
Explicación :
Como no incluyó la forma en que estos valores se usarán más adelante en su código, realmente no podemos responder qué tan seguros son de usar. Pero no debe considerarlos como más seguros que una parte de hash no analizada de su URI, de lo contrario, y al mismo tiempo no hace nada por el resto de su URL, hasta la parte #
de la misma.
Demonstration:
Para demostrar dónde está el problema, imagine este escenario:
obj = new Object();
obj.something = parseparameters().method1;
eval(obj.something);
Lo que sucedió es que el navegador web cargó el URI pasado. Adelante, es seguro que lo intente usted mismo, ya que lo hice así que simplemente carga esta ubicación como una ruta relativa a la URL del documento de apertura, lo que resulta en una ubicación mywebsite.com/do.not.ever.open.me
solicitada. Sin embargo, cambiarlo a una ruta completamente calificada, o incluso cambiar otra cosa que simplemente cargar una nueva URI, es completamente trivial y usar decodeURIComponent()
no cambia eso un poco.