4

以下は、Facebook の認証ページから抜粋した例です。セッションにデータを追加し、JavaScript を使用して URL にリダイレクトするという考え方は何ですか? また、なぜuniqidのmd5ハッシュを行うのですか?

<?php 

   $app_id = "YOUR_APP_ID";
   $app_secret = "YOUR_APP_SECRET";
   $my_url = "YOUR_URL";

   session_start();
   $code = $_REQUEST["code"];

   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']) {
     $token_url = "https://graph.facebook.com/oauth/access_token?"
       . "client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url)
       . "&client_secret=" . $app_secret . "&code=" . $code;

     $response = file_get_contents($token_url);
     $params = null;
     parse_str($response, $params);

     $graph_url = "https://graph.facebook.com/me?access_token=" 
       . $params['access_token'];

     $user = json_decode(file_get_contents($graph_url));
     echo("Hello " . $user->name);
   }
   else {
     echo("The state does not match. You may be a victim of CSRF.");
   }

 ?>
4

3 に答える 3

3

これはウィキペディアのリンクであるため、おそらく予定されていることはわかっていますが、csrf の完全な説明はhttp://en.wikipedia.org/wiki/Cross-site_request_forgeryで見つけることができます。ユーザーごとに一意のトークンを持つことで、それをどのように保護できるか。防止セクションでは、防止方法としてユーザーごとのトークンを使用する方法を示します。

于 2011-07-11T20:42:48.693 に答える
1

サイトによって開始されたアクションに応答してのみ、ここにリダイレクトされるようにします。CSRF についてはhttps://www.owasp.org/index.php/Cross-Site_Request_Forgery_%28CSRF%29を参照してください。

于 2011-07-11T20:43:39.427 に答える
1

推測が困難な (不可能な) 値を生成し、それをセッションに保存し、リクエストと共に送信することにより、このスクリプトは、それが他の場所ではなく、それ自体によって呼び出されたかどうかを確認できます。他の場所では、推測しにくい値は不明であり、提供できません。

于 2011-07-11T20:43:44.860 に答える