Lo script in questione era simile a questo:
[pa]script type="text/javascript"[pc]
var uri = '....' /* <- qui c'è una stringa che viene parzialmente creata a run-time */
document.write('[pa]sc' + 'ript type="'text/javascript" src="' + uri + '" charset="ISO-8859-1"[pc][pa]/sc'+'ript');
[pa]/script[pc]
Qui, per lo stesso odioso problema, ho sostituito il simbolo di minore con [pa] ed il simbolo di maggiore con [pc].
Qui il problema è che l'interprete, invece di memorizzare l'argomento del metodo write() così come è stato scritto, lo riadatta secondo regole proprie traducendone alcuni caratteri e valutandola a tutti gli effetti come se fosse un tag di HTML vero e proprio, rendendo quindi di fatto inutile l'uso del metodo document.write(). Perciò, detto questo, come si risolve il problema (o almeno, come l'ho temporaneamente risolto io)? Beh, diciamo non in modo molto estetico, ma chi ha detto che le migliori soluzioni siano sempre anche le più belle :-) ?
La mia soluzione al problema è stata questa:
[pa]script type="text/javascript"[pc]
var uri = '...'; /* <- stringa generata a runtime */ var s1 = 'script type="';
var s2 = 'text/javascript';
var s3 = '" src="';
var s4 = '" charset="ISO-8859-1"';
var s5 = 'script';
document.write('<'+s1+s2+s3+uri+s4+'>'+'<'+'/'+s5+'>');
[pa]/script[pc]
Prima di tutto, ho suddiviso la stringa passata al metodo write() in più tronconi, ognuno assegnato ad una variabile distinta, escludendo dalla stringa assegnata alle variabili ogni possibile carattere che potesse far pensare all'interprete che quello era un tag HTML (in questo caso ogni carattere di minore e maggiore).
Infine, ho passato come argomento del metodo write() un'espressione dove andavo a concatenare le singole variabili fino a comporre lo stringa originale, stando però attento a separare ogni minore, maggiore ed i vari caratteri di slash, in modo da "ingannare" l'interprete e far sì che esso non cercasse in nessun modo di interpretare il valore dell'espressione, se non nel momento dell'esecuzione vera e propria.
Spero di essere stato chiaro ed esauriente, e di aver contribuito a risolvere qualche grana a qualcun altro che si è trovato con il mio stesso problema.
Resto in attesa di commenti o soluzioni migliori al problema (sono sicuro che ce ne sono!).
Ciao.
Nessun commento:
Posta un commento
Credo nelle libertà collettive ed individuali, tutti dovremmo avere il diritto di dire/scrivere ciò che pensiamo, ma dato che questo è un servizio per la collettività (più che personale), prego chiunque intenda lasciare un commento, di utilizzare un linguaggio civile e non offensivo nei confronti di tutti. Questo blog è moderato dall'autore. Ogni commento offensivo nei confronti di persone, animali, cose, religioni, idee, e quant'altro, non sarà accettato. Ringrazio tutti coloro che contribuiscono a questo blog con i loro commenti. Grazie.