web-dev-qa-db-fra.com

Refusé d'exécuter un script JavaScript. Code source du script trouvé dans la requête

Dans WebKit, j'obtiens l'erreur suivante sur mon JavaScript:

Refusé d'exécuter un script JavaScript. Le code source du script trouvé dans la requête.

Le code est pour un spinner JavaScript, voir Art ASCII .

Le code fonctionnait bien et fonctionne toujours correctement dans Camino et Firefox. L'erreur ne semble être générée que lorsque la page est enregistrée via un POST puis récupérée via un GET. Cela se produit à la fois dans Chrome/Mac et Safari/Mac.

Quelqu'un sait-il ce que cela signifie et comment y remédier?

81
doekman

C'est une mesure de sécurité pour empêcher les attaques XSS (cross-site scripting) .

Cela se produit lorsqu'un code JavaScript est envoyé au serveur via une requête HTTP POST, et que le même code revient via la réponse HTTP. Si Chrome le détecte) , le script est refusé et vous obtenez le message d'erreur Refused to execute a JavaScript script. Source code of script found within request.

Consultez également cet article de blog sur Sécurité en profondeur: nouvelles fonctionnalités de sécurité .

67
Greg

Cette "fonctionnalité" peut être désactivée en envoyant l'en-tête HTTP non standard X-XSS-Protection sur la page concernée.

X-XSS-Protection: 0
131
Kendall Hopkins

Réponse courte: actualisez la page après avoir effectué votre soumission initiale du javascript, ou appuyez sur l'URL qui affichera la page que vous modifiez.

Réponse longue: parce que le texte que vous avez rempli dans le formulaire comprend du javascript et que le navigateur ne sait pas nécessairement que vous êtes la source du javascript, il est plus sûr pour le navigateur de supposer que vous n'êtes pas la source de ce JS, et ne pas l'exécuter.

n exemple: Supposons que je vous ai donné un lien votre email ou facebook avec du javascript dedans. Et imaginez que le javascript enverrait à tous vos amis un lien sympa. Donc, le jeu pour obtenir ce lien à invoquer devient simplement, trouvez un endroit pour envoyer le javascript de telle sorte qu'il sera inclus dans la page.

Chrome et les autres navigateurs WebKit essaient d'atténuer ce risque en n'exécutant aucun javascript qui se trouve dans la réponse, s'il était présent dans la demande. Mon infâme attaque serait contrecarrée car votre navigateur n'exécuterait jamais ce JS.

Dans votre cas, vous le soumettez dans un champ de formulaire. Le champ Post du formulaire provoquera un rendu de la page qui affichera le Javascript, ce qui inquiète le navigateur. Si votre javascript est vraiment enregistré, cependant, frapper cette même page sans soumettre le formulaire lui permettra de s'exécuter.

15
Koos Kleven

Comme d'autres l'ont dit, cela se produit lorsqu'une réponse HTTP contient une chaîne JavaScript et/ou HTML qui figurait également dans la demande. Cela est généralement dû à la saisie de JS ou HTML dans un champ de formulaire, mais peut également être déclenché par d'autres moyens, tels que le réglage manuel des paramètres de l'URL.

Le problème avec cela est que quelqu'un avec de mauvaises intentions pourrait mettre le JS qu'il veut comme valeur, créer un lien vers cette URL avec la valeur JS malveillante et causer des problèmes à vos utilisateurs.

Dans presque chaque cas, cela peut être corrigé par HTML codant la réponse , bien qu'il y ait des exceptions. Par exemple, cela ne sera pas sûr pour le contenu à l'intérieur d'un <script> tag. D'autres cas spécifiques peuvent être traités différemment - par exemple, l'injection d'entrée dans une URL est mieux servie par le codage d'URL.

Comme l'a mentionné Kendall Hopkins, il peut y avoir quelques cas où vous voulez réellement JavaScript à partir des entrées de formulaire à exécuter, comme la création d'une application comme JSFiddle . Dans ces cas, je vous recommande de parcourir au moins l'entrée de votre code principal avant de le réécrire aveuglément. Après cela, vous pouvez utiliser la méthode qu'il a mentionnée pour empêcher le blocage XSS (au moins dans Chrome), mais sachez que cela vous ouvre aux attaquants.

1
sfarbota

J'ai utilisé ce hacky PHP juste après m'être engagé dans la base de données, mais avant que le script ne soit rendu à partir de mon _GET demande.:

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

C'était la solution la moins chère pour moi.

0
gabrielcrowe