12

是否可以在 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"远远超过有限的独家内容。

更新:我认为这个问题的解决方案是 in CKEDITOR.config.protectedSource(),但我的正则表达式经验被证明太幼稚,无法处理这个问题。我将如何避免所有包含“保留”类的标签被 CKEditor 触及?

4

3 回答 3

14

在 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>源模式下的标签。

于 2014-07-04T13:44:38.717 回答
10

建议 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 );
于 2009-11-18T05:08:21.637 回答
6

问题不在于 CKEditor。相反,问题在于运行站点本身的 MVC 引擎。Kohanaglobal_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;
于 2009-11-21T01:43:22.660 回答