7

この関数$this->security->get_csrf_hash();の値を使用して、 csrf_cookie_nameという名前の Cookie を設定したいと考えています。しかし、それは機能していません。

コントローラーにこれがあります:

   $csrf_cookie_value = $this->security->get_csrf_hash();
   $this->input->set_cookie('csrf_cookie_name', $csrf_cookie_value);
   echo $this->input->cookie('csrf_cookie_name'); 
   die();

しかし、それは機能しておらず、何もエコーされません。

これだけを試してみると:

 $csrf_cookie_value =  $this->security->get_csrf_hash();
 echo $csrf_cookie_value;

私は動作し、生成された文字列がエコーアウトされます。

したがって、これらの次の 2 行内の何かが間違っていると思います。

$this->input->set_cookie('csrf_cookie_name', $csrf_cookie_value);
echo $this->input->cookie('csrf_cookie_name'); 

アドバイスありがとうございます。

4

3 に答える 3

20

Cookie の有効期間を指定する必要があります。0はセッション Cookie になり、その他はすべて に追加されtime()ます。

ライフタイムを指定しない場合、CI はCookieを削除したいと解釈します。そして、それはまさにそれがすることです:)

$this->input->set_cookie('name', 'value', 0);    //expires when the browser window closes
$this->input->set_cookie('name', 'value', 3600); //expires in one hour
$this->input->set_cookie('name', 'value');       //will delete the cookie (if the cookie does not exist, you will not notice anything happening)
于 2012-09-21T09:26:59.993 に答える
7

Cookie がエコーされない理由は、関数がグローバル配列$this->input->cookie()から直接読み取り、サーバー上で配列をすぐに設定しないためです。代わりに、Cookie をキューに入れ、ブラウザに送り返して保存します。ユーザーの次の HTTP リクエストでのみ、この Cookie を再観察できます。$_COOKIE$this->input->set_cookie()$_COOKIE$this->input->set_cookie()

第二に、おそらくもっと重要なことは、csrf Cookie を不適切に使用していると思われることです。クロス サイト リクエスト フォージェリから保護するには、それを有効にして でプロパティを設定するだけですconfig/config.php。それだ。コントローラーで読み書きする必要はまったくありません。

于 2012-09-16T18:10:26.537 に答える
3

クッキーはすでにそこにあります。Javascript 経由で相談できます:

$.cookie("<?php echo $this->config->item("csrf_cookie_name"); ?>");

役立つことを願っています。

于 2012-09-22T12:16:36.507 に答える