La respuesta de Anders ya explica por qué su código está bien. Me gustaría concentrarme en la siguiente declaración:
el if (hashVal === link.attr ('href') podría ser explotado con algo como # 1 || verdadero) {}; // algún código malicioso ...; //.
Parece que estás asumiendo que el #1 || true){}; // some malicous code ; //
llevaría a lo siguiente:
if(#1 || true){}; //some malicious code...; // === link.attr('href') {
// do something with link
}
(lo cual no tendría mucho sentido de todos modos porque el # 1 no es un javascript legal, que yo sepa). Sin embargo, no es así como Javascript (o cualquier lenguaje de programación que conozco) evalúa las expresiones.
Para mí, su ejemplo parece que está intentando usar un ataque de inyección SQL en Javascript. La inyección de SQL se realiza correctamente porque las personas pegan consultas de esta manera (en lugar de utilizar consultas parametrizadas):
query = 'SELECT * FROM users WHERE loginname = "' + name + '"'
Este es un error horrible porque el nombre podría contener algo como 1"; drop table users; #
.
Al pegar una cadena de consulta como la que permite a un atacante escapar de la protección de la cadena citada a SQL sin formato.
Pero no estamos en la misma posición al escribir código Javascript. Para poder hacer posible el tipo de vulnerabilidad que temía en Javascript, tendría que pegar el código como si la gente pegara las consultas de SQL, tal como esto:
var jscode = 'if (' + hash + ' === link.attr("href") { ... }'
Luego si hash
contenía algo como true) { malicious_code() }
,
y si como dijo Anders, pondrías el contenido de jscode
en el DOM o hacer eval(jscode)
, el código malicioso se ejecutaría.
De lo contrario, está muy bien aislado dentro de una cadena inofensiva.