2009-11-16 10 views
10

Czy jest możliwe utworzenie bloku kodu w CKEditorze, który nie zostanie dotknięty przez samego edytora, i będzie utrzymywany w zamierzonym stanie, dopóki nie zostanie jawnie zmieniony przez użytkownika? Próbowałem wprowadzić zmienne javascript (związane tagami skryptu) i film flash, ale CKEditor kontynuuje przepisywanie wklejonego kodu/znaczników, a przy tym łamie mój kod.Zachowywanie znaczników SCRIPT (i innych) w CKEditor

Pracuję z następującej konfiguracji:

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

Przypuszczam najbardziej idealnym rozwiązaniem byłoby, aby zachować zawartość dowolnego znacznika, który zawiera class="preserve" umożliwiając znacznie więcej niż ograniczonych wyłączność.

Aktualizacja: myślę, że rozwiązanie tego problemu jest w CKEDITOR.config.protectedSource(), ale moje doświadczenie wyrażeń regularnych okazuje się być zbyt młodzieńcze się obsługiwać ten problem. W jaki sposób chciałbym zwolnić wszystkie znaczniki zawierające "zachowane" klasy od dotknięcia przez CKEditor?

+1

nie wiesz, co budujesz ... ale jeśli ten edytor akceptuje tagi skryptów i emituje je w wynikach z powrotem do strony, całkowicie narażasz swoją witrynę na ataki XSS (Cross Site Scripting). – scunliffe

+0

scunliffe, Dokładnie to jest. Ale dzieje się to w ramach części administracyjnej strony. Użytkownicy nie będą uzyskiwać dostępu do tej strony. Nie martwię się o problem bezpieczeństwa. Tylko administrator będzie miał dostęp. – Sampson

Odpowiedz

5

problem nie zostanie z CKEditorem. Zamiast tego problem dotyczył MVC-Engine, na którym działa sama Witryna. Kohana ma global_xss_filtering w swojej konfiguracji, która jest domyślnie włączona. Zapobiega to przesyłaniu znaczników skryptów, aby zapobiec atakom skryptów w Twojej witrynie. Zmiana tej wartości na false pozwoli na przesłanie znaczników <script> w formularzach, ale otworzy także witrynę na potencjalne problemy z bezpieczeństwem, które mogą być bardzo poważne. Wskazane jest, aby nie wyłączać 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 ... dlaczego nie dodałeś tagu "kohana"? w końcu jestem użytkownikiem kohana, więc powinienem był pomóc, gdybym wiedział, że to problem z kohaną. Cóż, szkoda mi, nie dostałem nagrody: P. przynajmniej nauczyłem się czegoś nowego mimo wszystko. – Lukman

+0

Przepraszam, Lukman :) Byłem pewien, że to * musi * być problemem CKEditor. Dopiero gdy zdecydowałem się uruchomić echo '$ _POST [" element "]' zamiast '$ this-> input-> post (" element ")' zdałem sobie sprawę, że mój problem był gdzie indziej :) Niemal natychmiast pomyślałem XSS, i poszedł prosto do konfiguracji :) – Sampson

10

Propozycja 1: Utwórz oddzielne zwykłe pole tekstowe dla administratora, aby wprowadzić skrypty/kod HTML.

Propozycja 2: Wprowadzenie bbcode, jak [script][/script] lub [html][/html] że administratorzy mogą wykorzystać do wprowadzenia scripts/kod HTML i mieć swój server-side przełożyć je na <script></script> i kodu HTML. Upewnij się, że przy wyświetlaniu zapisanej zawartości w CKEdycierze musisz najpierw przetłumaczyć je na serwer po stronie bbcode (lub CKEditor je usunie). Lub mniej kłopotliwym sposobem jest przechowywanie przesłanych treści w bazie danych podczas ich wprowadzania i tłumaczenie tylko podczas wyświetlania strony.

Sugestia 3: Ponieważ chcesz używać class="preserve" oznaczyć tagi nie chcesz CKEditor rozebrać się, a następnie dodaj następujące linie JavaScript podczas inicjalizacji edytora:

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

Skrypty są uruchamiane z elementami flash od czasu do czasu, więc zostaną one umieszczone w edytorze z elementami flash.Oba są ponownie napisane przez CKEditor. Kod zostanie zapisany w bazie danych, ale zostanie zapisany na stronie administratora przy użyciu CKEditor. Myślę, że rozwiązanie jest z 'CKEDITOR.config.protectedSource()' ale moje doświadczenie regex jest nieco suche. – Sampson

+0

Edytowane za pomocą 'CKEDITOR.config.protectedSource()' regexes :) – Lukman

+0

Dziękuję, Lukman. Dam ci taki wir, kiedy wieczorem wrócę do domu. – Sampson

8

W folderze CKEditor masz config.js pliku. Otwórz go i wklej kod:

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

To pozwoli <script>...</script> tagi w trybie Source.

+0

dziękuję rozwiązany mój problem z tym. – Dave

Powiązane problemy