2010-09-11 60 views
18

Estoy haciendo un pequeño editor de páginas HTML. El editor carga un archivo en un iframe. A partir de ahí, podría agregar, modificar o eliminar los elementos en la página con nuevos atributos, estilos, etc. El problema con esto es que JavaScript (y/u otros lenguajes de programación) puede modificar completamente la página cuando se carga, antes empiezas a editar los elementos. Por lo tanto, cuando guarde, no guardará el marcado original, sino la página modificada + sus cambios.Deshabilitar JavaScript en iframe/div

Por lo tanto, necesito alguna forma de desactivar el JavaScript en el iframe, o de alguna manera eliminar todo el JavaScript antes de que el JavaScript comience a modificar la página. (Creo que tendré que terminar analizando el archivo para PHP, pero no debería ser demasiado difícil) Consideré escribir un script para recorrer todos los elementos, eliminando cualquier etiqueta, onclick, onfocus, onmouseover, etc. eso sería un verdadero dolor

¿Alguien sabe de una forma más fácil de deshacerse de JavaScript que se ejecuta dentro de un iframe?

ACTUALIZACIÓN: a menos que me haya perdido algo, creo que no hay forma de 'desactivar JavaScript'. Por favor corrígeme si estoy equivocado. Pero, supongo que la única forma de hacerlo sería analizar las etiquetas de script y los eventos de JavaScript (clic, mouseover, etc.) de una cadena de página solicitada.

+0

Esto habla de atravesar la página con JavaScript y la eliminación de cada ocurrencia de uno en uno: http://www.manticmoo.com/articles/jeff/programming/javascript/removing -javascript-with-javascript.php – Dan

+0

Ese artículo habla sobre la eliminación de nodos de script, que no creo que "anulará la ejecución de js" que se ejecutó cuando se cargó el script. Realmente no entiendo la pregunta. ¿Cuál es el archivo cargado en el iframe? ¿Estás permitiendo que el usuario escriba cualquier html en el iframe? ¿De dónde viene todo este javascript en tu página? Parece que tienes control sobre el contenido del archivo –

+0

La URL "manticmoo" no parece funcionar, pero todavía está disponible a través de Wayback Machine (archive.org): http://web.archive.org/web/ 20070128100901/http: //www.manticmoo.com/articles/jeff/programming/javascript/removing-javascript-with-javascript.php – calvinf

Respuesta

1

Usted puede tratar de la misma solución adoptada por CKEditor, de los cuales posee una demostración here.
Al pasar del modo RTE al modo fuente, puede ingresar algo de JavaScript y ver el resultado, que es un reemplazo del nodo JS en una cadena codificada de forma segura.
Si se encuentra en vista modo de fuente, mediante la introducción de una cierta línea JS como:

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

verá que vuelve de esta manera cuando se va de nuevo a editor de texto enriquecido modo:

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

Creo que es una de las maneras más fáciles y efectivas, ya que el RegExp para analizar los nodos JS no es complejo.
Un ejemplo:

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

(Por supuesto, para sustituir el nodo de secuencia de comandos se debe utilizar el método replace().)

Atentamente.

+0

Respondiendo a su actualización: sí, la tarea de validación del lado del servidor es obligatoria, pero el problema Es posible que desee resolver en un entorno del lado del cliente el comportamiento incorrecto de iframes en el que los usuarios pueden inyectar JavaScript simple para hacer algo permitido. Mi experiencia práctica con este tema fue con un usuario que ingresó dentro del iframe editable un script simple para importar un formulario dentro de otro iframe de otro dominio, lo que condujo a un redireccionamiento de la página del editor a una página en blanco. Aunque el iframe importado funcionó perfectamente en la vista previa, no se pudo acceder al editor después de la inserción del código. –

4

Sí, su actualización es correcta. Usted debe suponga que cualquier entrada que reciba del usuario puede contener elementos maliciosos. Por lo tanto, usted debe validar en el servidor antes de aceptar su entrada :-)

19

HTML5 introduce el atributo "sandbox" en el iframe que (si está vacío) deshabilita la carga y ejecución de javascript.

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

+0

Si bien esta es la solución que estaba buscando, tenga en cuenta que hace mucho más que desactivar el javascript como lo está pidiendo el OP. [Vea aquí para más detalles (w3schools)] (http://www.w3schools.com/tags/att_iframe_sandbox.asp) – MikeThomson

+1

[un enlace mejor] (https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe # attr-sandbox) [mozilla.org] – Damien

1

Puede establecer contenido Política de Seguridad como script src 'auto' en la cabecera. CSP bloqueará cualquier script que no sea nuestro propio sitio web. De esta forma, podemos evitar que cualquier script de iframe cambie los elementos en nuestra página.

Puede obtener más información de aquí http://www.html5rocks.com/en/tutorials/security/content-security-policy/

Cuestiones relacionadas