La risposta di Anders spiega già perché il tuo codice va bene. Mi piacerebbe concentrarmi sulla seguente affermazione:
the if(hashVal === link.attr('href') could be exploited with something like #1 || true){}; //some malicious code...; //.
Sembra che tu stia partendo dal presupposto che #1 || true){}; // some malicous code ; //
possa portare a quanto segue:
if(#1 || true){}; //some malicious code...; // === link.attr('href') {
// do something with link
}
(che non avrebbe molto senso comunque perché il # 1 non è javascript legale, per quanto ne so). Tuttavia, non è così che Javascript (o qualsiasi linguaggio di programmazione che conosco) valuta le espressioni.
Per me, il tuo esempio sembra che tu stia cercando di utilizzare un attacco SQL injection su Javascript. L'iniezione SQL ha esito positivo perché le persone incollano le richieste in questo modo (invece di utilizzare le query parametrizzate):
query = 'SELECT * FROM users WHERE loginname = "' + name + '"'
Questo è un errore orribile perché il nome potrebbe contenere qualcosa come 1"; drop table users; #
.
Incollare insieme una stringa di query come quella consente a un utente malintenzionato di sfuggire dalla protezione della stringa citata in SQL raw.
Ma non siamo nella stessa posizione quando scriviamo il codice Javascript. Per rendere il tipo di exploit che temevi fosse possibile in Javascript, dovresti incollare il codice insieme come le persone incollano le query sql insieme, forse in questo modo:
var jscode = 'if (' + hash + ' === link.attr("href") { ... }'
Quindi se hash
contiene qualcosa come true) { malicious_code() }
,
e se come ha detto Anders, metti il contenuto di jscode
nel DOM o fai eval(jscode)
, il codice dannoso verrebbe eseguito.
Altrimenti, è ben isolato in una stringa innocua.