4

入力テキストエリアが 2 つあるページを作成し、両方に CKeditor (ver. 4) を追加しました。

最初のエディターは正常に動作config.allowedContent = true;します。config.js でタグの削除を停止するように設定したところ<script>、すべてが期待どおりに動作しました。
そのすぐ下に別のエディターがあり、同じ設定、同じセットアップで、テキストエリア フィールドの ID を変更しただけです。通常のテキストを送信すると機能しますが、<script>たとえばタグを追加し、編集者がいるフォームの送信ボタンを押すとすぐに、ページがリロードされるように見えますが、データは送信されず、firebug は通知しますサーバーが403を返すことを私に伝えます。

エディターを分離して、個人用の構成を追加してみました。何もない。最初のテキストエリアは魔法のように機能し、2 番目のテキストエリアは、テキストに安全でないタグが含まれている場合に 403 を返します。

私のセットアップは次のとおりです。このckeditor ヘルパーを使用して、必要な場所にエディターを挿入しています。ご想像のとおり、ページは 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 やその他の属性が変更されており、チェックボックスは関係ありません。

そして、これをコントローラーに入れました

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

}

正確には、コードの安全性または危険性は関係ありません

editconfig.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';
};

私は困惑し、ばかげています。どうしたらよいかわかりません。ワンインプットが呪われているようです。

どんな助けでも感謝します、ありがとう。

4

2 に答える 2

1

これは mod_security ルールの結果です。それらの厳格さに応じて、脆弱性 (一般的には POST 経由で悪用される脆弱性) によるハッキングからスクリプトをより適切に保護するのに役立ちます。

于 2015-01-29T07:46:28.463 に答える
0

私が理解しているように、あなたは2番目のテキストエリアに何かを追加しようとしています。そして、いくつかの「安全でない」タグを削除する CKEditor。私はあまり安全ではありませんが、これはあなたを助けることができます:

config.extraAllowedContent = '*{*}';

これを config.js に追加します。このコードを使用すると、必要なものを何でも追加できます。また、CKEditor は「安全でない」タグを削除しません。

このメソッドのドキュメント

于 2013-06-07T08:59:36.963 に答える