2009-11-16 2 views
10

È possibile creare un blocco di codice all'interno di CKEditor che non verrà toccato dall'editor stesso e verrà mantenuto nello stato previsto fino a quando non viene modificato esplicitamente dall'utente? Ho tentato di inserire variabili javascript (associate a tag di script) e un filmato flash in seguito, ma CKEditor continua a riscrivere il mio codice/markup incollato, e così facendo ho infranto il mio codice.Conservazione dei tag SCRIPT (e altro) in CKEditor

sto lavorando con la seguente configurazione:

<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> 

Suppongo che la soluzione più ideale sarebbe conservare il contenuto di qualsiasi tag che contiene class="preserve" permettendo molto più dei esclusive limitate.

Aggiornamento: Sto pensando la soluzione a questo problema è in CKEDITOR.config.protectedSource(), ma la mia esperienza espressioni regolari si sta rivelando troppo giovanile per gestire questo problema. Come faccio ad esonerare tutti i tag che contengono la classe "preservata" dall'essere toccati da CKEditor?

+1

non si sa cosa si sta creando ... ma se questo editor accetta tag script e li emette nell'output alla pagina, si espone totalmente il sito agli attacchi XSS (Cross Site Scripting). – scunliffe

+0

scunliffe, è esattamente quello che è. Ma questo sta avvenendo all'interno di una porzione amministrativa del sito. Gli utenti non accederanno a questa pagina. Non sono preoccupato per il problema di sicurezza. Solo un amministratore avrà accesso. – Sampson

risposta

5

Il problema non è con CKEditor. Invece, il problema era con il motore MVC che eseguiva il sito stesso. Kohana ha un global_xss_filtering all'interno della sua configurazione che è abilitata di default. Ciò impedisce l'invio di tag script, per impedire attacchi di scripting sul tuo sito. La modifica di questo valore in false consentirà l'invio di tag <script> nei moduli, ma apre anche il sito a potenziali problemi di sicurezza che possono essere molto gravi. Si consiglia di non disabilitare 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 ... perché non hai aggiunto il tag 'kohana'? Dopo tutto, sono un utente kohana, quindi avrei dovuto essere in grado di aiutarti se avessi saputo che era un problema di kohana. beh, peccato per me non ho ottenuto la taglia: P .. almeno ho imparato qualcosa di nuovo, tuttavia – Lukman

+0

Scusa, Lukman :) Ero certo che * deve * essere un problema di CKEditor. Non è stato fino a quando ho deciso di iniziare a echo '$ _POST [" elemento "]' invece di '$ this-> input-> post (" elemento ")' che ho capito che il mio problema era altrove :) Quasi immediatamente ho pensato di XSS, e sono andato dritto alla configurazione :) – Sampson

10

Suggerimento 1: Creare un'area di testo in chiaro per consentire all'amministratore di immettere gli script/codice HTML.

Suggerimento 2: Introdurre un bbcode, come [script][/script] o [html][/html] che gli amministratori possono utilizzare per mettere il/codice HTML script e avere il vostro lato server tradurli in <script></script> e il codice HTML. Assicurati che quando mostri un contenuto salvato in CKEditor, devi prima tradurre il tuo server nel codice bbcode (altrimenti CKEditor lo eliminerà). Oppure il modo meno complicato è quello di archiviare il contenuto inviato nel database non appena inserito e di eseguire la traduzione solo durante la visualizzazione della pagina.

Suggerimento 3: Dal momento che si desidera utilizzare class="preserve" per contrassegnare i tag che non si desidera CKEditor per togliere, quindi aggiungere le seguenti righe di JavaScript quando si inizializza l'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

Gli script vengono forniti di volta in volta con elementi flash, quindi verranno pubblicati nell'editor con gli elementi flash.Entrambi sono stati riscritti da CKEditor. Il codice verrà memorizzato nel database, ma verrà scritto attraverso la mia pagina di amministrazione, utilizzando CKEditor. Sto pensando che la soluzione sia con 'CKEDITOR.config.protectedSource()', ma la mia esperienza regex è un po 'secca. – Sampson

+0

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

+0

Grazie, Lukman. Darò a questi un vortice quando torno a casa questa sera. – Sampson

8

In cartella CKEditor Avete un file diconfig.js. Apritelo e incolla il codice:

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 
     } 
    }; 
}; 

Permetterà <script>...</script> tag in modalità Source.

+0

grazie risolto il mio problema con questo. – Dave