Da MDN :
encodeURIComponent
escapes all characters except the following: alphabetic, decimal digits,
- _ . ! ~ * ' ( )
Normalmente si richiede un carattere di spazio per aggiungere un altro attributo (come onclick
), sfortunatamente questo sarà codificato come parte dell'URI.
Tuttavia, da foglio cheat di prevenzione XS (Cross Site Scripting) OWASP :
Unquoted attributes can be broken out of with many characters, including
[space] % * + , - / ; < = > ^ and |
Quindi potresti provare i caratteri -
o *
per provare a creare un nuovo attributo.
es. imposta somevar
su http://www.example.com-onclick=alert('xss')
o http://www.example.com*onclick=alert('xss')
Il tuo chilometraggio può variare tra i browser e sfortunatamente =
sarà ancora codificato come URL, quindi avrai anche quell'ostacolo da superare. Quindi, anche se il valore non è quotato né codificato correttamente, potrebbe non essere possibile trasformare questo difetto di codifica in un exploit XSS.
Il tuo secondo esempio è più sicuro, anche se il valore dovrebbe essere veramente codificato in HTML:
$("<td><a href=somefile.php?url=\""+htmlEscape(encodeURIComponent(somevar))+"\">Download Here</a></td>");
dove htmlEscape
è: -
function htmlEscape(str) {
return String(str)
.replace(/&/g, '&')
.replace(/"/g, '"')
.replace(/'/g, ''')
.replace(/</g, '<')
.replace(/>/g, '>');
}