2011-10-18 13 views
0

私は現在、Facebookの認証を使用してウェブサイトを構築しています。私はローカルで稼働しており、CSRFエラーを継続しています。私は彼らのCSRF保護メカニズムを理解しようとしています:Facebookの認証とCSRFのメカニズム

$code = $_REQUEST["code"]; 

$_SESSION['state']= $_REQUEST['state'];//GETS SITE WORKING BUT UNSAFE!!!/// 

if(empty($code)) { 
$_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection 

$dialog_url = "http://www.facebook.com/dialog/oauth?client_id=" 
    . $app_id . "&redirect_uri=" . urlencode($my_url) . "&state=" 
    . $_SESSION['state']; 

echo("<script> top.location.href='" . $dialog_url . "'</script>"); 
} 

if($_REQUEST['state'] == $_SESSION['state']) { 

は何が起こることは、それが設定されている私の$ _REQUEST [「状態を」]ようだが、私の$ _SESSION [「状態は」]はないということです。したがって、それを働かせるために私は両方を等しく設定する線を持っています。私の$ code変数は決して空ではないようですので、新しい$ _SESSION ['state'変数は設定されません。

まず、$ _REQUEST ['code']の役割は何ですか?/ thisは/ /この変数は/ setから来ていますか?

私の安全でないコード行でこの問題を解決する方法はありますか?

p.s私はFB sdkを使うべきだと知っていますが、Webデザイン/セキュリティを学んでいますので、これはどのように動作するかを学ぶのには良い練習です!

多くのおかげで興味を持っている誰にもサム


は、私はそれがどのように動作するか出てきましたが、それでも私の問題を修正していない...とにかく

CSFR保護システムがで働きます$ _SESSION ['state']のサーバ側にState IDを保存すると、$ _REQUEST ['state']の内部にも同じIDが保存されます。したがって、CSRF攻撃が発生した場合、CSRF攻撃(クライアント側)の状態値は$ _SESSION ['state']の状態値と一致せず、コードは進行せず、攻撃は阻止されます。

私が間違っている場合は、私を修正してください!

答えて

0

説明は本質的に正しいです。あなたのサイトにリダイレクトされたときのURLの状態値($ _REQUEST ['state'])は、最初にFacebookにリダイレクトされたときに割り当てられた状態値と一致する必要があります_SESSION ['状態'])。一致しない場合、「操作」が発生したため、処理を続行しないでください。

しかし、$ codeは空ではないので、$ _SESSION ['state']は設定されていないとも言いました。その場合、Facebookへのリダイレクトはどのように発生していますか?

セッション値が一般的に保持されない可能性が高いようです。これはあなたのサイトでセッションを使用する唯一の場所ですか?

問題がある場合は、セッションを使用する必要はありません。データベースをセットアップしている場合は、簡単に使用できます。または、受け取った状態値が意図したシーケンスの一部として実際にコードによって作成されたことを合理的に確かめる方法を考えている限り、ローカルストレージを完全に避けることができます。たとえば、状態値を、タイムスタンプのmd5にシークレット文字列を加えて連結した現在のタイムスタンプに設定することができます。状態値が戻ったら、最初にタイムスタンプ部分をチェックして、最後の1〜2分以内に作成されたことを確認してから、md5が他の誰かによって作成されていないことを確認します。そうすれば、CSRF防止のための2つの基本的な要件である、事前に推測することはできず、再利用することもできない単純なトークンが得られます。

+0

はい、私の$ _SESSIONsが正常に動作していないことがわかりました。私の他のユーザーページを統合しました。クッキーが正常に動作していないようですが、これを修正しても問題は解決しません。私はちょうどローカルサーバ上でそれを実行するの厄介さにこれを置いている! –

+0

セッションがそれ以外のところでは動作しているが、ここで問題を起こしている場合、この1つの目的のために時間を過ごすのは時間がかかりすぎるかもしれません。私はあなたが考えるかもしれないいくつかの他のオプションで私の答えを少し編集しました。 –