De MDN :
encodeURIComponent
escapa a todos los caracteres excepto lo siguiente: alfabético, dígitos decimales,
- _ . ! ~ * ' ( )
Normalmente, necesitarías un carácter de espacio para agregar otro atributo (como onclick
), desafortunadamente esto se codificará como parte de la URI.
Sin embargo, desde OWASP XSS (Cross Site Scripting) Prevention Cheat Sheet :
Los atributos sin comillas se pueden dividir con muchos caracteres, incluidos
[space] % * + , - / ; < = > ^ and |
Por lo tanto, es posible que desee probar los caracteres -
o *
para intentar crear un nuevo atributo.
por ejemplo establece somevar
en http://www.example.com-onclick=alert('xss')
o http://www.example.com*onclick=alert('xss')
Su kilometraje puede variar entre los navegadores y, lamentablemente, =
seguirá estando codificado en la URL, por lo que también tendrá que superar ese obstáculo. Por lo tanto, aunque el valor no se cotice ni se codifique correctamente, puede que no sea posible convertir este defecto de codificación en un exploit XSS.
Su segundo ejemplo es más seguro, aunque el valor realmente debería estar codificado en HTML:
$("<td><a href=somefile.php?url=\""+htmlEscape(encodeURIComponent(somevar))+"\">Download Here</a></td>");
donde htmlEscape
es: -
function htmlEscape(str) {
return String(str)
.replace(/&/g, '&')
.replace(/"/g, '"')
.replace(/'/g, ''')
.replace(/</g, '<')
.replace(/>/g, '>');
}