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

问题描述:

我创建了一个页面,其中有两个输入textareas,并将CKeditor(版本4)添加到它们两个中。CKeditor在提交某些html标记时返回403

第一个编辑器工作正常,我已在config.js中设置config.allowedContent = true;来停止剥离标签,如<script>,并且所有内容都按预期工作。
我有另一个编辑器正下方,相同的设置,相同的设置,我只是改变了textarea字段的ID。它在我提交正常文本时起作用,但是一旦我添加了<script>标记,例如,按下编辑器所在窗体的提交按钮似乎重新加载页面,不提交任何数据和萤火虫告诉我服务器返回403.

我试着隔离编辑器,添加个人配置。没有。第一个textarea就像一个魅力,第二个返回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> 

的形式有哪些是相同的,以变更后的ID和其他属性,以及一个复选框,没有什么相关的其他HTML编辑器的另一部分。

而且在我的控制器

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"); 

} 

安全,或unsafeness得到这个,确切的说,我的代码是不相关的

编辑 添加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'; 
}; 

我难倒和stupified,我做什么了没有想法。这似乎是一个输入已被诅咒。

任何帮助表示感谢,谢谢。

+0

你能发布所有相关的控制器和视图代码吗?你是否在textareas中使用'ckeditor_en'? – stormdrain

+0

身份证是唯一的,我不认为它甚至可以重复使用。我会在一秒钟后发布代码。 – Pankucins

+0

所以要清楚:第一个编辑器可以正确使用不允许的文本(例如'

据我所知,你试图添加一些东西到你的第二个textarea。 CKEditor删除一些“不安全”的标签。我不会很安全,但是这可以帮助您:

config.extraAllowedContent = '*{*}'; 

您将添加到您的config.js中。这段代码可以让你添加任何你想要的东西。 CKEditor不会删除“不安全”的标签。

Documenation for this method

这将是你的mod_security规则的结果。根据它们的严格程度,它们可以帮助更好地保护脚本免于通过漏洞攻击,通常是通过POST进行攻击的漏洞。