2009-10-10 1 views
79

In WebKit ottengo il seguente errore sul mio JavaScript:Rifiutato di eseguire uno script JavaScript. Il codice sorgente dello script trovato entro richiesta

Rifiutato di eseguire uno script JavaScript. Codice sorgente dello script trovato all'interno della richiesta.

Il codice è per una filatura di JavaScript, vedere ASCII Art.

Il codice utilizzato per funzionare correttamente e funziona ancora correttamente in Camino e Firefox. L'errore sembra essere generato solo quando la pagina viene salvata tramite un POST e quindi recuperata tramite GET. Succede sia in Chrome/Mac che in Safari/Mac.

Qualcuno sa cosa significa e come risolvere il problema?

+0

Hmm, probabilmente il mio WebKit è stato aggiornato. La pagina funziona di nuovo. Anche tutte le vecchie revisioni della pagina (vedi pulsante Revisioni precedenti nella parte inferiore della pagina). – doekman

+0

questo errore si verifica nell'editor tryit di w3schools http://www.w3schools.com/js/tryit.asp?filename=tryjs_events lo script viene eseguito la prima volta, ma è bloccato dal momento in cui si fa clic su "modifica e fai clic sul pulsante ". –

+1

Se si preme il pulsante "modifica e clicca", il contenuto dell'area di testo (con javascript) viene inviato al server tramite un POST. Chrome rileva che javascript è pubblicato sul server e potrebbe essere dannoso. Il blocco è la misura contro gli attacchi XSS. – doekman

risposta

65

È una misura di sicurezza per prevenire gli attacchi XSS (cross-site scripting).

Ciò accade quando un codice JavaScript viene inviato al server tramite una richiesta POST HTTP e lo stesso codice viene restituito tramite la risposta HTTP. Se Chrome rileva questa situazione, lo script viene rifiutato di essere eseguito e viene visualizzato il messaggio di errore Refused to execute a JavaScript script. Source code of script found within request.

Vedere anche questo post di blog su Security in Depth: New Security Features.

+5

Sarebbe bello per vedere qualche tipo di riferimento. – kangax

+0

ma questo gona causa problemi? significato è ok se ignoriamo questo messaggio? – samach

+0

@Greg Quale algoritmo viene utilizzato dai browser per "rilevare la situazione"? Non può essere solo cercando la stringa "

129

Questa "funzione" può essere disabilitata inviando l'intestazione HTTP non standard X-XSS-Protection nella pagina interessata.

X-XSS-Protection: 0 
+8

Grazie! Questo merita molti più upvotes. –

+0

Questo non ha funzionato per me. –

+2

Assicurati che la pagina che sta attivando questo errore sia inviata con questa intestazione, non inviando la pagina. –

14

Risposta breve: aggiornare la pagina dopo aver effettuato la presentazione iniziale del javascript, o colpire l'URL che visualizzerà la pagina che si sta modificando.

Risposta lunga: perché il testo hai riempito nella forma include javascript, e il browser non necessariamente sapere che siete la fonte del javascript, è più sicuro per il browser di ritenere che non si è fonte di questo JS e non eseguirlo.

Un esempio: Supponiamo di aver fornito un collegamento tramite email o facebook con alcuni javascript. E immagina che il javascript possa inviare a tutti i tuoi amici il mio fantastico link. Quindi, il gioco per ottenere che il collegamento sia invocato diventa semplicemente, trova un posto dove inviare il javascript in modo che sia incluso nella pagina.

Chrome e altri browser WebKit cercano di mitigare questo rischio non eseguendo alcun javascript presente nella risposta, se era presente nella richiesta. Il mio nefasto attacco sarebbe sventato perché il tuo browser non avrebbe mai eseguito quel JS.

Nel tuo caso, lo stai inviando in un campo modulo. Il post del campo modulo causerà un rendering della pagina che visualizzerà il Javascript, causando la preoccupazione del browser. Se il tuo javascript è veramente salvato, tuttavia, il fatto di premere la stessa pagina senza inviare il modulo gli consentirà di eseguirlo.

0

Ho usato questo hacky trick PHP subito dopo mi impegno a base di dati, ma prima che lo script è reso dal mio _GET richiesta .:

if(!empty($_POST['contains_script'])) { 
    echo "<script>document.location='template.php';</script>"; 
} 

Questa è stata la soluzione più economica per me.

1

Come altri hanno già detto, questo accade quando una risposta HTTP contiene una stringa JavaScript e/o HTML che era presente anche nella richiesta. Questo di solito è causato dall'immissione di JS o HTML in un campo modulo, ma può anche essere attivato in altri modi, come ad esempio la modifica manuale dei parametri dell'URL.

Il problema con questo è che qualcuno con cattive intenzioni potrebbe inserire qualsiasi valore JS come valore, collegarsi a quell'URL con il valore JS dannoso e causare problemi agli utenti.

In quasi ogni caso, questo può essere risolto da HTML encoding the response, anche se ci sono eccezioni. Ad esempio, questo non sarà sicuro per i contenuti all'interno di un tag <script>. Altri casi specifici possono essere gestiti in modo diverso: ad esempio, l'iniezione di input in un URL è meglio servita dalla codifica dell'URL.

Come Kendall Hopkins detto, ci possono essere alcuni casi quando effettivamente desidera JavaScript da input di form da eseguire, come la creazione di un programma come JSFiddle. In questi casi, ti consiglio di scrostare almeno l'input nel tuo codice back-end prima di scriverlo alla cieca. Successivamente, puoi utilizzare il metodo che ha menzionato per prevenire il blocco XSS (almeno in Chrome), ma tieni presente che ti sta aprendo agli aggressori.