生成されたCSRF保護トークンが保存されず、提案されたhereのようにSESSION経由で使用されるのはなぜですか?現在CI2で、(Securityクラス内)CSRFの保護メカニズムは、次のとおりです。なぜcodeigniter2はセッションのようにより安全な方法でcsrf_hashを保存しないのですか?
1.generate _csrf_set_hashでCSRFトークン()関数のためのユニークな値:隠されたフォームにトークン
$this->csrf_hash = md5(uniqid(rand(), TRUE));
2.Insertフィールド(form_openヘルパーを使用)
3.ユーザーがフォームを送信し、サーバーがPOSTによってトークンを取得します。セキュリティクラスの
$this->security->csrf_verify();
4。機能「csrf_verify」だけチェックPOST [「トークン」]に設定し、POSTである[「トークン」である:CIは、入力クラスの関数が「)_sanitize_globals(」トークン検証を行います] COOKIE ['token']と等しい。
public function csrf_verify(){
// If no POST data exists we will set the CSRF cookie
if (count($_POST) == 0)
{
return $this->csrf_set_cookie();
}
// Do the tokens exist in both the _POST and _COOKIE arrays?
if (! isset($_POST[$this->_csrf_token_name]) OR
! isset($_COOKIE[$this->_csrf_cookie_name]))
{
$this->csrf_show_error();
}
// Do the tokens match?
if ($_POST[$this->_csrf_token_name] != $_COOKIE[$this->_csrf_cookie_name])
{
$this->csrf_show_error();
}
// We kill this since we're done and we don't want to
// polute the _POST array
unset($_POST[$this->_csrf_token_name]);
// Nothing should last forever
unset($_COOKIE[$this->_csrf_cookie_name]);
$this->_csrf_set_hash();
$this->csrf_set_cookie();
log_message('debug', "CSRF token verified ");
return $this;
}
なぜセッションにトークンを格納しないのですか? IMHOはPOST ['token']が空ではなく、COOKIEと等しい['token']は悪いサイトから送信される可能性があるため、十分ではありません。
悪いサイトでは、「良い」サイトのCookie値を設定できないと考えられます。他のドメインのCookieを読み取ったり書き込んだりすることはできません。または私は何かを逃していますか? – Narcissus
あなたが正しいかもしれませんが、それは単にセッションの使用のもう一つのアプローチかもしれません。ちょうどそれが同じ安全であることだけが興味がある。 – Centurion
私の質問に改訂しました。それを確認してください。ありがとう! – tpae