2009-11-16 26 views
10

¿Es posible crear un bloque de código dentro del CKEditor que no será tocado por el editor y se mantendrá en su estado previsto hasta que el usuario lo modifique explícitamente? He intentado ingresar variables de JavaScript (vinculadas en etiquetas de script) y una película flash siguiente, pero CKEditor continúa reescribiendo mi código/marcado pegado, y al hacerlo, rompiendo mi código.Preservar etiquetas SCRIPT (y más) en CKEditor

estoy trabajando con la siguiente configuración:

<script type="text/javascript"> 
    var editor = CKEDITOR.replace("content", { 
    height : "500px", 
    width : "680px", 
    resize_maxWidth : "680px", 
    resize_minWidth : "680px", 
    toolbar : 
    [ 
     ['Source','-','Save','Preview'], 
     ['Cut','Copy','Paste','PasteText','PasteFromWord','-','Print', 'SpellChecker', 'Scayt'], 
     ['Undo','Redo','-','Find','Replace','-','SelectAll','RemoveFormat'], 
     ['Bold','Italic','Underline','Strike','-','Subscript','Superscript'], 
     ['NumberedList','BulletedList','-','Outdent','Indent','Blockquote'], 
     ['JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock'], 
     ['Link','Unlink','Anchor'], 
     ['Image','Table','HorizontalRule','SpecialChar'] 
    ] 
    }); 
    CKFinder.SetupCKEditor(editor, "<?php print url::base(); ?>assets/ckfinder"); 
</script> 

supongo que la solución más ideal sería conservar el contenido de cualquier etiqueta que contiene class="preserve" que permite mucho más que las exclusivas limitadas.

actualización: Estoy pensando en la solución a este problema está en CKEDITOR.config.protectedSource(), pero mi experiencia de expresiones regulares está demostrando ser demasiado juvenil para manejar este problema. ¿Cómo voy a eximir a CKEditor de que todas las etiquetas que contengan la clase "preservada" sean tocadas?

+1

no está seguro de lo que está creando ... pero si este editor acepta etiquetas de script y las emite en la salida de nuevo a la página, está exponiendo totalmente su sitio a los ataques XSS (Cross Site Scripting). – scunliffe

+0

scunliffe, eso es exactamente lo que es. Pero esto tiene lugar dentro de una parte de administración del sitio. Los usuarios no accederán a esta página. No estoy preocupado por el problema de seguridad. Solo un administrador tendrá acceso. – Sampson

Respuesta

5

La cuestión no es con el CKEditor. En cambio, el problema era con MVC-Engine ejecutando el sitio en sí. Kohana tiene un global_xss_filtering dentro de su configuración que está habilitada de forma predeterminada. Esto evita el envío de etiquetas de script, para evitar ataques de scripting en su sitio. Cambiar este valor a false permitirá la presentación de etiquetas <script> en formularios, pero también abre el sitio a posibles problemas de seguridad que pueden ser muy graves. Es aconsejable que no desactive global_xss_filtering.

/* /(system|application)/config/config.php - line 66 */ 
/** 
* Enable or disable global XSS filtering of GET, POST, and SERVER data. This 
* option also accepts a string to specify a specific XSS filtering tool. 
*/ 
$config['global_xss_filtering'] = FALSE; 
+2

tch ... ¿por qué no agregaste la etiqueta 'kohana'? Soy un usuario de kohana después de todo, así que debería haber podido ayudar si hubiera sabido que era un problema de kohana. bueno, lástima que no obtuve la recompensa: P .. al menos aprendí algo nuevo sin embargo – Lukman

+0

Lo siento, Lukman :) Estaba seguro de que * debe * ser un problema de CKEditor. No fue hasta que decidí comenzar a hacer eco de '$ _POST [" element "]' en lugar de '$ this-> input-> post (" element ")' que me di cuenta de que mi problema estaba en otra parte :) Casi de inmediato pensé de XSS, y fue directo a la configuración :) – Sampson

10

Sugerencia 1: Crear área de texto simple separada para que el administrador ingrese los scripts/código HTML.

Sugerencia 2: introducir un BBCode, como [script][/script] o [html][/html] que los administradores pueden utilizar para poner el/código HTML guiones y tener su lado del servidor que se traducen en <script></script> y el código HTML. Asegúrese de que al mostrar un contenido guardado en el CKEditor, necesita que su servidor los traduzca primero al código bb (o CKEditor los eliminará). O la manera menos complicada es almacenar el contenido enviado en la base de datos tal como se ingresa y solo hacer la traducción cuando se muestra la página.

Sugerencia 3: Puesto que usted desea utilizar class="preserve" para marcar las etiquetas que no desea CKEditor retirar de él, a continuación, añadir las siguientes líneas de JavaScript al inicializar el editor:

// protect <anytag class="preserve"></anytag> 
CKEDITOR.config.protectedSource.push(/<([\S]+)[^>]*class="preserve"[^>]*>.*<\/\1>/g); 
// protect <anytag class="preserve" />< 
CKEDITOR.config.protectedSource.push(/<[^>]+class="preserve"[^>\/]*\/>/g); 
+0

Los scripts van con elementos flash de vez en cuando, por lo que se publicarán en el editor con los elementos flash.Ambos están siendo reescritos por CKEditor. El código se almacenará en la base de datos, pero se escribe a través de mi página de administración, usando el CKEditor. Estoy pensando que la solución está en 'CKEDITOR.config.protectedSource()' pero mi experiencia regex es un poco seca. – Sampson

+0

Editado con 'CKEDITOR.config.protectedSource()' regexes :) – Lukman

+0

Gracias, Lukman. Voy a darles un giro cuando llegue a casa esta noche. – Sampson

8

En carpeta CKeditor que tienen una config.js archivo. Abrirlo y pegar el código:

CKEDITOR.editorConfig = function(config) { 
    config.allowedContent = { 
     script: true, 
     $1: { 
      // This will set the default set of elements 
      elements: CKEDITOR.dtd, 
      attributes: true, 
      styles: true, 
      classes: true 
     } 
    }; 
}; 

Permitirá <script>...</script> etiquetas en el modo Fuente.

+0

gracias resuelto mi problema con esto. – Dave

Cuestiones relacionadas