Сохранение тегов SCRIPT (и более) в CKEditor - PullRequest
10 голосов
/ 16 ноября 2009

Возможно ли создать блок кода в CKEditor, который не будет затронут самим редактором и будет поддерживаться в его предполагаемом состоянии до тех пор, пока пользователь не изменит его явно? Я пытался ввести переменные javascript (связанные в тегах сценария) и следующий флэш-фильм, но CKEditor продолжает переписывать мой вставленный код / ​​разметку, и при этом нарушает мой код.

Я работаю со следующей настройкой:

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

Полагаю, что наиболее идеальным решением было бы сохранить содержимое любого тега, содержащего class="preserve", что позволяет гораздо больше, чем ограниченные эксклюзивы.

Обновление : я думаю, что решение этой проблемы находится в CKEDITOR.config.protectedSource(), но мой опыт регулярных выражений оказывается слишком юным, чтобы справиться с этой проблемой. Как бы я освободил все теги, которые содержат «сохраненный» класс, от прикосновения CKEditor?

Ответы [ 3 ]

10 голосов
/ 18 ноября 2009

Предложение 1: Создайте отдельную текстовую область для администратора, чтобы вводить сценарии / HTML-код.

Предложение 2: Введите bbcode, например [script][/script] или [html][/html], который администраторы могут использовать для размещения сценариев / HTML-кода, и чтобы ваша серверная сторона переводила их в <script></script> и HTML код. Убедитесь, что при отображении сохраненного контента в CKEditor, вам нужно, чтобы ваша серверная сторона сначала перевела их в bbcode (или CKEditor будет их вырезать). Или менее трудным способом является сохранение представленного содержимого в базе данных по мере его ввода и перевод только при отображении страницы.

Предложение 3 : поскольку вы хотите использовать class="preserve" для пометки тегов, которые вы не хотите, чтобы CKEditor удалял, добавьте следующие строки JavaScript при инициализации редактора:

// 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 );
9 голосов
/ 04 июля 2014

В папке CKEDITOR у вас есть файл config.js . Откройте его и вставьте код:

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

Это позволит <script>...</script> теги в режиме источника.

6 голосов
/ 21 ноября 2009

Проблема не с CKEditor. Вместо этого проблема заключалась в том, что MVC-Engine работал на самом сайте. Kohana имеет global_xss_filtering в своей конфигурации, которая включена по умолчанию. Это предотвращает отправку скриптовых тегов, предотвращает скриптинговые атаки на ваш сайт. Изменение этого значения на false позволит отправлять теги <script> в формах, но также открывает сайт для потенциальных проблем безопасности, которые могут быть очень серьезными. Желательно не отключать 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;
...