5

コントローラーにデータを渡そうとしていますが、500エラーが発生します。調査の結果、CSRFトークンが送信されなかったことが原因であることがわかりました。

これをデータと一緒に含める必要があるようです。<?php echo $this->security->get_csrf_token_name(); ?>:"<?php echo $this->security->get_csrf_hash(); ?>"

私のJSはかなり弱いので、これを変更して上記を含める方法について少し混乱しています。

<script type="text/javascript"> 
$(document).ready(function() {
    $("#order").sortable({
        update : function (event, ui) {
            order = $('#order').sortable('serialize');
            $.ajax({
                url: "<?=base_url().'admin/category/update_order'?>",
                type: "POST",
                data: order,
                success: function(response){
                    console.log(response);
                }
            });
        }
    });
}
);
</script>
4

6 に答える 6

4

dataトークンは、の引数で渡す必要があり$.ajaxます。

これは機能するはずですが、以下の私のメモを参照してください。

order['<?php echo $this->security->get_csrf_token_name(); ?>'] = '<?php echo $this->security->get_csrf_hash(); ?>';

ただし、ここで行われているいくつかの悪い習慣があります。主に、JavaScriptでPHPを使用しないでください。これにより、JavaScriptに個別のファイルとしてアクセスできなくなります(これは、ブラウザーがJavaScriptをキャッシュしてページの読み込みを高速化し、帯域幅の消費を抑えるためです)。

<form>このように注文htmlにトークンを保存することをお勧めします。

<input type="hidden" name="<?php echo $this->security->get_csrf_token_name(); ?>" value="<?php echo $this->security->get_csrf_hash(); ?>" />

次に、残りのフォームデータとともにシリアル化されます。

フォームのaction属性にURLを保存することもできます。これにより、スクリプトが適切に機能しなくなり、URLが2つではなく1か所に保持されます。

<form id="order" method="post" action="<?=base_url()?>admin/category/update_order">

呼び出しでは、#orderが実際のフォームIDであると想定して、次の$.ajaxようなものを使用します。url: $('#order').attr('action'),

于 2012-06-29T22:06:34.083 に答える
2

CIはcsrfをCookieに保存し、そこから取得できます。

var csrf = $.cookie('csrf_cookie_name');

このメソッドの欠点は、jQueryがネイティブにCookieアクセスを提供しないことです。したがって、 jqueryプラグインが必要になります。

于 2012-06-30T23:53:22.730 に答える
1

正解です。投稿データにCSRFトークンを追加するだけです。jQueryの$.extend関数を使用して、次のように、作成済みの注文オブジェクトをCSRFトークンデータとマージできます。

$.extend(alerts, {
'<?php echo $this->security->get_csrf_token_name(); ?>' :
'<?php echo $this->security->get_csrf_hash(); ?>' });
于 2012-06-29T22:03:31.373 に答える
1

これは別のアプローチです。CSSrfトークン名とハッシュをJSON形式で返すAuth.phpの単純な関数。次に、JavaScriptで2つのajax呼び出しを行います。1つ目はcsrf credsを取得して非表示のフォームフィールドに挿入し、2つ目は実際のフォーム送信を処理します。

//Auth.phpコントローラーに関数を配置します

public function get_csrf()
{
    $csrf['csrf_name'] = $this->security->get_csrf_token_name();
    $csrf['csrf_token'] = $this->security->get_csrf_hash();

    echo json_encode($csrf);
}

// myFunction()

<script type="text/javascript">
function myFunction() {

    // first ajax call to grab the csrf name and token
    // from our get_csrf() function in Auth.php
    $.ajax({
        type: "GET",
        dataType: 'json',
        url: "https://<your_domain>.com/auth/get_csrf", //replace with your domain
        success: function (data) {

            // assign csrf name and token to variables
            csrf_name = data.csrf_name;
            csrf_token = data.csrf_token;

            // assign field1 and field2 field values to variables
            var form_field1 = document.getElementById('field1').value;
            var form_field2 = document.getElementById('field2').value;

            // insert csrf creds into form
            $('#csrftoken').attr('name', csrf_name);
            $('#csrftoken').val(csrf_token);

            // second ajax call -- this is our form handler
            $.ajax({
                type: "POST",
                url: "https://<your_domain>.com/<your_controller>/<your_function>", //replace with your domain/controller/function
                data: {
                    // ES6 computed property keys are great...
                    [csrf_name] : csrf_token,
                    "field1" : form_field1,
                    "field2" : form_field2
                      },
                success: function(data) {

                    // handle the return from your form submit
                    if (data == "ok") {
                        console.log("Success!");
                        $("#infoMessage").html("<p>Success</p>").fadeIn(300);

                    } else {

                        console.log("Oops!");
                        $("#infoMessage").html("<p>Oops!</p>");

                    }

                }
            });

        }
    });

}
</script>

// html

<div id="infoMessage"></div>

<form method="post" accept-charset="utf-8">

    <input type="hidden" id="csrftoken" name="" value="" />

    <label for="field1">Field 1:</label> <br />
    <input type="text" name="field1" id="field1"  />

    <label for="field2">Field 2:</label> <br />
    <input type="text" name="field2" id="field2"  />

    <input type="button" name="submit" value="SUBMIT" onclick="myFunction()" />

</form>
于 2017-04-16T04:38:20.067 に答える
0

私はcsrfトークンを自分のフォーム生成コードに提供するように拡張form_helperします-あなたは同様のものを使うことができます:MY_form_helper.php

    function secure_form() {
        $CI =& get_instance();
        return '<input type="hidden" name='.$CI->security->get_csrf_token_name().' value='.$CI->security->get_csrf_hash().'>';
    }
于 2012-06-30T22:53:11.560 に答える
0

別の解決策は、.serialize()を使用することです。

$.post("user/save", $('#frmUser').serialize(),function(html){
        $("#results").html(html);
});

これにより、CSRFデータを格納する非表示フィールドが見つかります。

于 2012-07-02T18:54:13.610 に答える