2

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

但是,CKEditor 4.1.1 似乎对这些图像感到窒息。

通过 CKEditor 添加图像。

图像的初始位置与预期一致。然而,当数据被保存时,CKEditor 在提交数据之前显然做了一些奇怪的事情。

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

这种行为是完全可重现的。

通过 CKEditor 编辑图像。

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

禁用第 3 方插件。

如前所述,除了字数和字符数之外,我还在使用 Uploadcare。我禁用了两个插件,但这并没有改变任何东西。

想法。

在保存过程中,我只是通过 CodeIgniter 中的 $this->db->e​​scape() 函数清理数据,无法规避,否则数据不会提交并收到错误消息。

需要明确的是,在测试期间,任何类型的图像对象都会出现错误;可以手动添加,也可以通过 Uploadcare 添加。

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

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

其中——根据文档——“将禁用过滤器(数据不会被过滤,所有功能都将被激活)。”

但是,它不起作用,并且与以前完全相同;按名称剥离样式属性并将 HTML 转换为它们的常规文本等价物。

如果我选择专门定义一些东西,那么几乎所有东西都会关闭,包括插件,而且——奇怪的是——我写的规则就是:

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

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

我还在他们论坛上的一个帖子中尝试了该建议,其中有人遇到与我完全相同的问题,但两种方法都不起作用,这让我相信这是 CKEditor 本身特有的问题,而不是数据处理在其本身。

如果有人对我如何诱使 CKEditor 处理图像有任何建议,我很乐意提供任何建议。

4

2 回答 2

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 点应该有效——我这样做了很多次,所以我很确定。因此,我认为您的服务器出现了第二个问题。
于 2013-05-30T10:43:45.203 回答
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;
}

我遇到了您遇到的确切问题,这已经为我解决了问题。

于 2014-11-23T22:09:36.380 回答