Сохранение тегов скриптов (и более) в CKEditor
можно ли создать блок кода в CKEditor, который не будет затрагиваться самим редактором и будет поддерживаться в предполагаемом состоянии до тех пор, пока явно не будет изменен пользователем? Я пытался ввести переменные javascript (привязанные к тегам скрипта) и flash-фильм, но 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 ответов
предложение 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"[^>]*>.*<\/>/g );
// protect <anytag class="preserve" /><
CKEDITOR.config.protectedSource.push( /<[^>]+class="preserve"[^>\/]*\/>/g );
в папке CKEDITOR у вас есть конфиг.js. Откройте его и вставьте код:
CKEDITOR.editorConfig = function( config ) {
config.allowedContent = {
script: true,
: {
// This will set the default set of elements
elements: CKEDITOR.dtd,
attributes: true,
styles: true,
classes: true
}
};
};
Это позволит <script>...</script>
теги в исходном режиме.
проблема не в CKEditor. Вместо этого проблема заключалась в том, что MVC-Engine запускал сам сайт. У Коханы есть global_xss_filtering
в своей конфигурации, которая включена по умолчанию. Это предотвращает подачу тегов скриптов, чтобы предотвратить скриптовые атаки на вашем сайте. Изменение этого значения!--2--> допускает представление <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;