2010-09-11 5 views
18

Je crée un petit éditeur de page HTML. L'éditeur charge un fichier dans un iframe. De là, il pourrait ajouter, modifier, ou supprimer les éléments sur la page avec de nouveaux attributs, styles, etc. Le problème avec ceci, est que JavaScript (et/ou d'autres langages de programmation) peut complètement modifier la page quand il se charge, avant vous commencez à éditer les éléments. Ainsi, lorsque vous enregistrez, il ne sauvegarde pas le balisage d'origine, mais la page modifiée + vos modifications.Désactiver JavaScript dans iframe/div

Donc, j'ai besoin d'un moyen de désactiver le JavaScript sur l'iframe, ou en quelque sorte supprimer tout le JavaScript avant que le JavaScript commence à modifier la page. (Je suppose que je devrais finir par analyser le fichier pour PHP, mais cela ne devrait pas être trop dur) J'ai pensé écrire un script pour faire une boucle sur tous les éléments, en supprimant tous les tags, onclick, onfocus, onmouseover, etc. ce serait une vraie douleur.

Est-ce que quelqu'un connaît un moyen plus facile de se débarrasser de JavaScript de courir dans un iframe? MISE À JOUR: à moins d'avoir manqué quelque chose, je crois qu'il n'y a pas moyen de simplement «désactiver JavaScript». Corrigez-moi si j'ai tort, s'il-vous plait. Mais, je suppose que la seule façon de le faire serait d'analyser toutes les balises de script et les événements JavaScript (clic, mouseover, etc) à partir d'une chaîne de page demandée.

+0

Ce parle de traverser la avec javascript et retirer chaque occurance un par un: http://www.manticmoo.com/articles/jeff/programming/javascript/removing -javascript-with-javascript.php – Dan

+0

Cet article parle de la suppression des noeuds de script, ce qui, je ne crois pas, va "désexécuter le js" qui a été exécuté quand le script a été chargé. Je ne comprends vraiment pas la question. Quel est le fichier chargé dans l'iframe? Autorisez-vous l'utilisateur à taper n'importe quel code HTML dans l'iframe? D'où vient tout ce javascript sur votre page? On dirait que vous avez le contrôle sur le contenu du fichier –

+0

L'URL "manticmoo" ne semble pas fonctionner, mais elle est toujours disponible via Wayback Machine (archive.org): http://web.archive.org/web/ 20070128100901/http: //www.manticmoo.com/articles/jeff/programming/javascript/removing-javascript-with-javascript.php – calvinf

Répondre

1

Vous pouvez essayer la même solution adoptée par CKEditor, dont vous avez une démo here.
En passant du mode RTE au mode source, vous pouvez entrer du code JavaScript et voir le résultat, qui remplace le noeud JS dans une chaîne codée en toute sécurité.
Si vous êtes en mode voir la source, en entrant une ligne JS comme:

<script type="text/javascript"> 
// comment 
alert('Ciao'); 
</script> 

vous le verrez rendu de cette façon quand retourner à éditeur de texte enrichi en mode:

<!--{cke_protected}%3Cscript%20type%3D%22text%2Fjavascript%22%3E%0D%0A%2F%2F%20comment%0D%0Aalert('Ciao')%3B%0D%0A%3C%2Fscript%3E--> 

Je pense que c'est l'un des moyens les plus simples et efficaces, puisque RegExp pour analyser les nœuds JS n'est pas complexe.
Un exemple:

var pattern = /<script(\s+(\w+\s*=\s*("|').*?\3)\s*)*\s*(\/>|>.*?<\/script\s*>)/; 
var match = HTMLString.match(pattern); // array containing the occurrences found 

(Bien sûr, pour remplacer le nœud de script, vous devez utiliser la méthode replace()).

Cordialement.

+0

En réponse à votre mise à jour: oui, la tâche de validation côté serveur est obligatoire, mais le problème peut vouloir résoudre dans un environnement côté client est le comportement incorrect des iframes que les utilisateurs pourraient injecter du JavaScript simple pour faire quelque chose de autorisé. Mon expérience pratique de ce problème était avec un utilisateur qui entrait dans l'iframe éditable un simple script pour importer un formulaire dans un autre iframe d'un autre domaine, ce qui conduisait à une redirection de la page de l'éditeur vers une page vierge. Bien que l'iframe importé a parfaitement fonctionné dans l'aperçu, l'éditeur était inaccessible après l'insertion du code. –

4

Oui, votre mise à jour est correcte. Vous devez supposer que toute entrée que vous recevez de l'utilisateur peut contenir des éléments malveillants. Ainsi, vous devez valider sur le serveur avant d'accepter leur entrée :-)

19

HTML5 introduit l'attribut "sandbox" sur l'iframe qui (s'il est vide) désactive le chargement et l'exécution de javascript.

https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe#attr-sandbox

+0

Bien que ce soit la solution que je cherchais, notez que cela fait beaucoup plus que simplement désactiver le javascript comme le demande l'OP. [Voir ici pour plus de détails (w3schools)] (http://www.w3schools.com/tags/att_iframe_sandbox.asp) – MikeThomson

+1

[un meilleur lien] (https://developer.mozilla.org/en-US/docs/Web/HTML/Elément/iframe # attr-sandbox) [mozilla.org] – Damien

1

Vous pouvez définir contenu politique de sécurité en tant que script-src 'auto' en-tête. CSP bloquera tous les scripts autres que de notre propre site Web. De cette façon, nous pouvons empêcher les scripts de iframe de changer les éléments de notre page.

Vous pouvez obtenir plus d'informations ici http://www.html5rocks.com/en/tutorials/security/content-security-policy/

Questions connexes