html - CKeditor 在提交某些 html 标签时返回 403

标签 html codeigniter ckeditor wysiwyg http-status-code-403

我创建了一个页面,其中有两个输入文本区域,并且我将 CKeditor(版本 4)添加到它们中。

第一个编辑器工作正常,我设置了config.allowedContent = true;在 config.js 中停止剥离像 <script> 这样的标签一切都按预期进行。
我在它的正下方有另一个编辑器,相同的设置,相同的设置,我只是更改了 textarea 字段的 ID。它在我提交普通文本时有效,但只要我添加 <script>例如,标记并按下编辑器所在表单的提交按钮,它似乎重新加载了页面,没有提交任何数据, Firebug 告诉我服务器返回 403。

我尝试隔离编辑器,添加个人配置。没有什么。第一个文本区域就像一个魅力,如果文本中包含 不安全 标签,第二个文本区域将返回 403。

我的设置如下,我正在使用这个 ckeditor helper在我需要的地方插入编辑器。如您所料,页面是使用 CodeIgniter 创建的。
我在 ckeditor 文件夹中得到了一个 config.js 文件。
我使用的是常规表格,没什么特别的。看起来像这样

<form action="http://domain.com/admin/articles/edit/47" method="post">
    <div id="cke_ckeditor_en_container">
        <textarea cols="75" rows="7" id="ckeditor_en" name="text_en" class="input-text is-col-text"><?php echo set_value('text_en', isset($text_en) ? htmlspecialchars_decode($text_en) : ''); ?></textarea>
        <?php echo display_ckeditor($ckeditor_en); ?>
    </div>
    <input type="submit" value="submit" />
</form>

该表单有另一个编辑器的另一部分 html,它是相同的,只是更改了 id 和其他属性,还有一个复选框,没有任何相关。

在我的 Controller 中得到这个

public function edit(){
    $this->load->helper('ckeditor');
    $id = (int)$this->uri->segment(4);

    if (empty($id)){
        $this->session->set_flashdata('error', 'Empty ID!');
        redirect('admin/articles');
    }

    $data = $this->articles_model->fetch_article($id);

    $data['page_title'] = "Edit `" . $data['title'] . "`";
    $data['form_url'] = "admin/articles/edit/" . $id;

    $data['ckeditor'] = array(
        'id'    =>  'ckeditor',
        'path'  =>  'js/ckeditor');
    $data['ckeditor_en'] = array(
        'id'    =>  'ckeditor_en',
        'path'  =>  'js/ckeditor');

    $data['edit'] = true;   

    if($this->input->post('submit')){
        $this->save_article("update",$id);
    }


    $this->load->view("admin/articles",$data);
}

private function save_article($type='insert', $id=0){
    $this->load->library('form_validation');

    $this->form_validation->set_rules('title','Title','trim|xss_clean|max_length[150]|min_length[1]');          
    $this->form_validation->set_rules('text','Text','trim');

    $this->form_validation->set_rules('title_en','Title EN','trim|xss_clean|max_length[150]|min_length[1]');            
    $this->form_validation->set_rules('text_en','Text EN','trim');

    $this->form_validation->set_rules('top_menu','Show in top menu','trim|xss_clean|max_length[1]');            


    if ($this->form_validation->run() === FALSE)
    {
        return FALSE;
    }

    // make sure we only pass in the fields we want

    $data = array();
    $data['title']       = $this->input->post('title');
    $data['text']        = htmlspecialchars($this->input->post('text'));

    $data['title_en']       = $this->input->post('title_en');
    $data['text_en']        = htmlspecialchars($this->input->post('text_en'));

    $data['url']               = $this->toAscii($this->input->post('title'));
    $data['url_en']            = $this->toAscii($this->input->post('title_en'));

    $data['top_menu']        = $this->input->post('top_menu');

    if($type == "insert"){
        $data['time']           = date("YmdHis");
    }


    if ($type == 'insert'){
        if($this->articles_model->insert($data)){
            $this->session->set_flashdata('success', 'Article added successfully!');
        }else{
            $this->session->set_flashdata('error', 'An error occured!');
        }
    }else if ($type == 'update'){
        if($this->articles_model->update($id, $data)){
            $this->session->set_flashdata('success', 'Article `' . $data['title'] . '` edited successfully!');
        }else{
            $this->session->set_flashdata('error', 'An error ecc!');
        }
    }
    redirect("admin/articles");

}

我的代码的安全性或不安全性不相关

编辑 添加config.js对于 ckeditor。

CKEDITOR.editorConfig = function( config ) {

    config.filebrowserBrowseUrl = '/js/kcfinder/browse.php?type=files';
    config.filebrowserImageBrowseUrl = '/js/kcfinder/browse.php?type=images';
    config.filebrowserFlashBrowseUrl = '/js/kcfinder/browse.php?type=flash';
    config.filebrowserUploadUrl = '/js/kcfinder/upload.php?type=files';
    config.filebrowserImageUploadUrl = '/js/kcfinder/upload.php?type=images';
    config.filebrowserFlashUploadUrl = '/js/kcfinder/upload.php?type=flash';

    config.removeButtons = 'Underline,Subscript,Superscript';
    config.allowedContent = true;
    // Se the most common block elements.
    config.format_tags = 'p;h1;h2;h3;pre';

    // Make dialogs simpler.
    config.removeDialogTabs = 'image:advanced;link:advanced';
};

我被难住了,目瞪口呆,我没有该做什么的想法。好像one input被诅咒了。

感谢任何帮助,谢谢。

最佳答案

这将是您的 mod_security 规则的结果。根据它们的严格程度,它们有助于更好地保护脚本免遭漏洞攻击,通常是那些通过 POST 被利用的漏洞。

关于html - CKeditor 在提交某些 html 标签时返回 403,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16689695/

相关文章:

html - 使用 Svg 和 Transform 的小间隙(边距):Translate on some resolution

php - codeigniter 使用 Ignited-Datatables 类卡住连接

javascript - 在 CkEditor 中使用 HTML5 兼容的表格

javascript - CKeditor 在粘贴事件时删除除 div、span 之外的所有 html 标签

php - CKEditor 中的 Jquery 拖放

javascript - d3js 文本未显示在节点图上

javascript - <li><p>text</p></li> 上点击事件中的未定义文本

php - CakePHP 到 CodeIgniter 的转换

html - viewport 元标记在 html 中究竟做了什么?

javascript - 如何从 JavaScript 获取数据到 Controller 并将其存储在数据库中