使用CKEditor时图像标记出现问题

时间:2013-05-30 09:30:15

标签: ckeditor uploadcare

我正在使用Uploadcare上传和存储图片,这是有效的。

然而,看来CKEditor 4.1.1对这些图像感到窒息。

通过CKEditor添加图片。

图像的初始放置符合预期。但是,在保存数据时,CKEditor在提交数据之前显然做了一些奇怪的事情。

在几个测试中,在格式化和重新排列HTML期间,CKEditor正在剥离“样式”图像属性和第一个打开双引号,我可以在数据库本身的文本数据中看到。

此行为完全可以重现。

通过CKEditor编辑图像。

最初,图像看起来很好。但是当我查看源代码时,图像的HTML将被清理为呈现为文本,而不是呈现为图像对象。

禁用第三方插件。

如前所述,我使用的是Uploadcare,除了Word Count& Char Count。我禁用了两个插件,但这并没有改变任何东西。

思考。

在保存过程中,我只是通过CodeIgniter中的$ this-&gt; db-&gt; escape()函数清理数据,这些函数无法绕过,或者数据不会提交,我收到错误。< / p>

为了清楚起见,在测试过程中,任何类型的图像对象都会出现错误;手动添加,或通过Uploadcare添加。

在我的视图页面中,我有:

<script type="text/javascript">
    CKEDITOR.replace('note', {
        allowedContent: true
    });
</script>

其中 - according to the documentation - “将禁用过滤器(数据不会被过滤,所有功能都会被激活)。”

然而,它不起作用,它与以前完全一样;按名称剥离样式属性并将HTML转换为常规文本等效项。

如果我选择专门定义一些内容,几乎可以解决所有问题,包括插件,以及 - 奇怪的是 - 我为此编写了一条规则:

<script type="text/javascript">
    CKEDITOR.replace('note', {
        allowedContent: {
            'img': {
                styles: 'height, width'
            }
        }
    });
</script>

所以我不知道发生了什么。

我也尝试过a thread on their forums where someone is experiencing exactly the same problem中的建议,但两种方法都不起作用,这让我相信这是CKEditor本身特有的问题,而不是数据本身的处理。

如果有人对我如何哄骗CKEditor处理图片有任何建议,我会很乐意接受任何建议。

2 个答案:

答案 0 :(得分:2)

  1. allowedContent: true设置为99.9%会阻止CKEditor剥离图像如果您正确执行
  2. 您的allowedContent设置(第二个代码示例)不正确。它不允许srcalt属性。没有src的图像将被CKEditor剥离为无效。所以你应该至少拥有:

    allowedContent: {
        img: {
           attributes: '!src, alt', // src is required
           styles: 'height, width'
        }
    }
    
  3. 所以点1.或2.应该工作 - 我做了很多次,所以我很确定。因此,我认为您的服务器存在第二个问题。

答案 1 :(得分:0)

这里的问题(在需要allowedContent:true或正确设置规则之上)是CodeIgniter的XSS过滤。在我们访问$ _POST(或$ _GET / $ _ REQUEST)之前,CI已经对此数据进行了过滤,在这种情况下会破坏它。此设置无法在每个控制器的基础上覆盖,因为它已在加载控制器之前运行。

所以你可以在 /application/config/config.php 中完全禁用它(不推荐)

$config['global_xss_filtering'] = FALSE;

或者在某些页面上手动禁用它(但是仍然不理想)(即我的示例在/ admin / help下的所有页面上将其关闭)。也在 /application/config/config.php

$config['global_xss_filtering'] = TRUE;

# Override the XSS filtering on /admin/help
if (preg_match("/^\/admin\/help/", $_SERVER["QUERY_STRING"])) {
    $config['global_xss_filtering'] = FALSE;
}

我遇到了你遇到的确切问题,这解决了我的问题。