2011-09-07 17 views
5

私はいくつかの検索を行いましたが、私の問題に関連するものは見つかりませんでした。Facebookのログインで問題がCSRFの状態トークンと一致しません

私は現在自分のウェブサイトへのFacebookログインを実装しようとしていますが、htaccess mod書き換えURLのためにログイン認証に問題がありますか?

コードは完璧に動作し、私は私のようなモッズ書き換えルールなしでそれを使用する場合に記録されます:できるだけ早く私はモッズ書き換えURL

domain.com/webhosting-name/ 

に越えるよう

domain.com/view_webhosting.php?webhosting=name 

しかし、それから、うまく動作せず、「CSRF状態トークンが提供されたトークンと一致しません」というエラーがスローされます。

のhtaccessファイルには、誰もがこのような問題の解決策を持っているこの

RewriteRule ^webhosting-([a-z_0-9-]+)/$ /view_webhosting.php?webhosting=$1 [L] 

のように見えますか?私はFacebook SDK v3.1.1を使用しています

答えて

7

PHP SDKは、「状態」フィールドは$ _REQUESTであることを期待(私はと信じていますあなたがアクセストークンの 'コード'を交換する前にリダイレクトの後に、からbase_facebook.php:

protected function getCode() { 
    if (isset($_REQUEST['code'])) { 
    if ($this->state !== null && 
     isset($_REQUEST['state']) && 
     $this->state === $_REQUEST['state']) { 

     // CSRF state has done its job, so clear it 
     $this->state = null; 
     $this->clearPersistentData('state'); 
     return $_REQUEST['code']; 
    } else { 
     self::errorLog('CSRF state token does not match one provided.'); 
     return false; 
    } 
    } 

    return false; 
} 

あなたのRewriteRuleがそのパラメータでストンプするかもしれません。

2

あなたはPHP SDKを意味すると思いますか?

'state'リクエスト変数をPHPスクリプトに渡していないように思えます。 https://developers.facebook.com/docs/authentication/(具体的にはビットとCSRFから自分自身を守る?)を読んだことがありますか?

はまた、私は、これはあなたの質問のタイプミスですが、あなたの書き換えルールはすべきではないと仮定します。

RewriteRule ^webhosting-([a-z_0-9-]+)/$ /view_webhosting.php?**webhosting**=$1 [L] 
+0

に、無効な結果として二回これと呼ばれていますこんにちはmrtomええ、ごめんなさい、私はそれが英語に翻訳されたときに読むのがより簡単だろうと思っています:)使用している例はhttps://github.com/facebook/php-sdk/blob/master/examples/ですexample.phpとCSRFの保護について何もない?このフェイスブックのAPIは変わっています。 mod rewrite urlを使用していないときは正常に動作します。 – John

1

RewriteRule ^webhosting-([a-z_0-9-]+)/$ /view_webhosting.php?webhosting=$1 [L,QSA] 

QSA =クエリ文字列追加するあなたのRewriteRuleを変更してみてください。これにより、GETパラメータを失うことはありません。

7

ありがとうbismark。

あなたは正しいです。それはGETパラメータを取得できませんでした、その溶液は、このでした:[QSA]

•'qsappend|QSA' (query string append) 
This flag forces the rewrite engine to append a query string part of the substitution string 
to the existing string, instead of replacing it. Use this when you want to add more data 
to the query string via a rewrite rule. 

みんなありがとうを追加

から

RewriteRule ^webhosting-([a-z_0-9-]+)/$ /view_webhosting.php?webhosting=$1 [L] 

RewriteRule ^webhosting-([a-z_0-9-]+)/$ /view_webhosting.php?webhosting=$1 [QSA,L] 

へのクエリ文字列、正しい軌道に乗せて!

+1

bismarkが正しい場合は、答えを受け入れるか、少なくとも投票でうまくいきます。私はあなたに少しの担当者を連れて行くためにあなたの質問に投票しました。 – Fionnuala

+0

こんにちはRemouさん、まあまあまあ私はちょっと私は投票や回答を受け入れることが知っていなかったので、このWebページにちょっと新しい: – John

0

.htaccessファイルの後でこのエラーが引き続き発生する場合は、PHPファイルのredirect_uriパラメータとFacebookアプリケーション設定のサイトURLを変更することをお勧めします。

私がパーミッションにアプリケーションからスコープ/権限を一致させるために(忘れる)ことによって、これを固定

http:domain.com/folder

から

http:domain.com/folder/index.php

-1

を変更するこのエラーを解決ページ...(つまり、アプリの設定、権限に移動します)。

+1

あなたは少し具体的になりたいかもしれません。 –

0

Facebook SDKコードには、同じハンドラでトークンを2回確認するとバグがあります。

私はこのようなfacebook.phpのにgetCode機能を編集した:より明確にすると、二回呼び出された場合、無効なトークンを述べていない

protected function getCode() { 
    if (!isset($_REQUEST['code']) || !isset($_REQUEST['state']) || $this->state === null) { 
     return false; 
    } 
    if ($this->state === $_REQUEST['state']) { 
     // CSRF state has done its job, so clear it 
     $this->state = null; 
     $this->clearPersistentData('state'); 
     return $_REQUEST['code']; 
    } 
    self::errorLog('CSRF state token does not match one provided.'); 

    return false; 
} 

。例えば場合

機能明確にするには、同じURLハンドラに二回呼び出すことができます。

$facebook->getUser();、その後、同じハンドラ$facebook->getLogoutUrl()で、その後getCode()は、エラーメッセージ

関連する問題