2009-11-16 11 views
10

Ist es möglich, innerhalb des CKEditors einen Codeblock zu erstellen, der nicht vom Editor selbst berührt wird und in seinem beabsichtigten Zustand bleibt, bis er vom Benutzer explizit geändert wird? Ich habe versucht, JavaScript-Variablen (gebunden in Skript-Tags) und einen Flash-Film folgen, aber CKEditor setzt fort, meinen eingefügten Code/Markup neu zu schreiben, und dabei meinen Code zu brechen.Erhalten von SCRIPT-Tags (und mehr) in CKEditor

ich mit dem folgenden Setup gerade arbeite:

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

nehme ich die ideale Lösung, um die Inhalte von jedem Tag zu erhalten wäre, die class="preserve" ermöglicht viel mehr als die begrenzte exclusives enthält.

aktualisieren: Ich bin die Lösung für dieses Problem zu denken ist in CKEDITOR.config.protectedSource(), aber meine reguläre Ausdrücke Erfahrung erweist sich auch juvenile, um dieses Problem zu behandeln. Wie gehe ich vor, wenn alle Tags, die die 'conserved' Klasse enthalten, von CKEditor nicht berührt werden?

+1

nicht sicher, was Sie bauen ... aber wenn dieser Editor Skript-Tags akzeptiert und sie in der Ausgabe zurück auf die Seite emittiert, setzen Sie Ihre Website vollständig XSS (Cross Site Scripting) -Angriffen aus. – scunliffe

+0

scunliffe, Genau das ist es. Dies geschieht jedoch innerhalb eines Administrationsbereichs der Site. Benutzer werden nicht auf diese Seite zugreifen. Ich mache mir keine Sorgen um das Sicherheitsproblem. Nur ein Administrator hat Zugriff. – Sampson

Antwort

5

Das Problem nicht mit dem CKEditor. Das Problem war stattdessen, dass die MVC-Engine die Site selbst ausgeführt hat. Kohana hat eine global_xss_filtering innerhalb seiner Konfiguration, die standardmäßig aktiviert ist. Dies verhindert die Eingabe von Skript-Tags, um Scripting-Angriffe auf Ihrer Site zu verhindern. Wenn Sie diesen Wert in "false" ändern, wird die Eingabe von <script> Tags in Formularen ermöglicht, die Website wird jedoch auch für potenzielle Sicherheitsprobleme geöffnet, die sehr ernst sein können. Es ist ratsam, dass Sie global_xss_filtering nicht deaktivieren.

/* /(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 ... warum hast du 'kohana' tag nicht hinzugefügt? Ich bin schließlich ein kohana-Benutzer, also hätte ich helfen können, wenn ich gewusst hätte, dass es ein kohana-Problem war. naja, schade für mich hab ich das bounty nicht bekommen: P .. zumindest habe ich doch etwas neues gelernt – Lukman

+0

Sorry, Lukman :) ich war mir sicher es muss * ein CKEditor-Problem sein. Erst als ich mich entschied "$ _POST [" element "]' statt $ this-> input-> post ("element") auszusprechen, merkte ich, dass mein Problem woanders war :) Fast sofort dachte ich von XSS, und ging direkt auf die Config :) – Sampson

10

Vorschlag 1: Erstellen Sie ein separates Textfeld für den Administrator, um den Skript-/HTML-Code einzugeben.

Vorschlag 2: eine bbcode einführen, wie [script][/script] oder [html][/html], dass die Admins den scripts/HTML-Code zu setzen und Ihre Server-Seite übersetzen haben sie in <script></script> und HTML-Code verwenden können. Stellen Sie sicher, dass bei der Anzeige eines gespeicherten Inhalts im CKEditor die Server-Seite zuerst in den BBCode übersetzt wird (oder der CKEditor sie ausblendet). Oder der weniger problematische Weg besteht darin, den übermittelten Inhalt in der Datenbank zu speichern, während er eingegeben wird, und nur die Übersetzung durchzuführen, wenn die Seite angezeigt wird.

Vorschlag 3: Da Sie class="preserve" verwenden möchten Tags markieren Sie CKEditor nicht wollen, um auszuziehen, dann die folgenden JavaScript Zeilen hinzufügen, wenn der Editor initialisiert: ist

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

Die Skripte sind von Zeit zu Zeit mit Flash-Elementen ausgestattet, so dass sie mit den Flash-Elementen im Editor angezeigt werden.Beide werden von CKEditor neu geschrieben. Der Code wird in der Datenbank gespeichert, aber er wird mit dem CKEditor über meine Admin-Seite geschrieben. Ich denke, die Lösung ist mit 'CKEDITOR.config.protectedSource()', aber meine Regex-Erfahrung ist ein bisschen trocken. – Sampson

+0

Bearbeitet mit 'CKEDITOR.config.protectedSource()' regexes :) – Lukman

+0

Danke, Lukman. Ich werde ihnen einen Wirbel geben, wenn ich heute Abend nach Hause komme. – Sampson

8

In CKEditor Ordner haben Sie eine config.js Datei. Öffnen Sie es und fügen Sie den Code:

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

Es wird <script>...</script> Tags im Quellmodus ermöglichen.

+0

Danke, mein Problem damit gelöst. – Dave