2010-11-30 7 views
3

ユーザーがFB.login()で表示されるポップアップを使用してFacebookにログインすると、JS SDKはoauth access_tokenを含むCookieをプレーンテキストで自分のドメインに作成します。その後、このCookieはすべての後続のリクエストとともに私のサーバーに送信されます。そして、すべてのリクエストがhttpsを使用しているわけではないことは明らかです。JS SDK:プレーンテキストとセキュリティでのaccess_token

これはセキュリティ上の問題ではありませんか?もしそうなら、それをどのように解決するのですか?

答えて

2

ネットワークトラフィックを盗聴することができ、攻撃者、(例えば無線lan)は、クッキーを読むことができます。そしてそれが作成された人物であるふりをする。

facebookページ自体に同じ攻撃が働くので、これは実際問題ではありません。ユーザー名/パスワードのみがhttpsで認証されます。次のすべてのページでは、cookieを含む暗号化されていないhttpが使用されます。あまりにも、stackoverflow.com脆弱である:http://codebutler.com/firesheep

PSは:あなたは、ネットワークトラフィックを盗聴することができれば

は、クッキーのsteelingことができます簡単に使用できるFirefoxの拡張機能があります。

+0

ありがとうございます。私は他のクッキーもハイジャックされることを見落としてしまったFBクッキーを心配していたので、私の心配は無用になりました。 –

3

クッキーの信頼性を確認できるので問題はありません。 Facebookには、各Cookieにsigという値が含まれています。私は完全な詳細については説明しませんが、基本的には、APIシークレットをクッキーに追加し、sig値を削除し、クッキー値をハッシュし、ハッシュがsigと一致することを確認します。あなたとFacebookはAPIシークレットの価値を知っている唯一のものだから、クッキーが改ざんされていないことを確かめることができます。

クッキーの内容を見ているユーザーのどちらかが問題ではありません。クッキーには、そのユーザーに関連付けられているアクセストークンのみが含まれています。ユーザーがクッキーを改ざんしようとすると、クッキーが無効になります。とにかく彼らのアクセストークンは彼ら自身のアカウントにアクセスするだけです。

最も重要なことは、クッキーが本物であることを確認することです。多くの人々はこれをやりませんし、巨大なセキュリティ問題を引き起こします。たとえば、CookieにはFacebookのユーザーIDが含まれています。そのユーザーIDを取得してから、ユーザーにクレジットカードを要求してください。そのユーザーIDでそのクレジットカードを保管しても、そのクッキーを検証しないと、誰もが入ってきてそのクッキー内のユーザーID値を変更してプライベートデータにアクセスできます。ただし、APIの秘密でCookieを確認すると、そのCookieが改ざんされたかどうかがわかります。ここで

は、私たちが私のFacebookのC#SDK(http://facebooksdk.codeplex.com)でクッキーを検証する方法である:

 /// <summary> 
     /// Validates a session_version=3 style session object. 
     /// </summary> 
     /// <param name="session">The session to validate.</param> 
     protected override void ValidateSessionObject(FacebookSession session) 
     { 
      if (session == null) 
      { 
       return; 
      } 

      var signature = this.GenerateSignature(session); 
      if (session.Signature == signature.ToString()) 
      { 
       return; 
      } 

      session = null; 
     } 

     /// <summary> 
     /// Generates a MD5 signature for the facebook session. 
     /// </summary> 
     /// <param name="session">The session to generate a signature.</param> 
     /// <returns>An MD5 signature.</returns> 
     /// <exception cref="System.ArgumentNullException">If the session is null.</exception> 
     /// <exception cref="System.InvalidOperationException">If there is a problem generating the hash.</exception> 
     protected override string GenerateSignature(FacebookSession session) 
     { 
      var args = session.Dictionary; 
      StringBuilder payload = new StringBuilder(); 
      var parts = (from a in args 
         orderby a.Key 
         where a.Key != "sig" 
         select string.Format(CultureInfo.InvariantCulture, "{0}={1}", a.Key, a.Value)).ToList(); 
      parts.ForEach((s) => { payload.Append(s); }); 
      payload.Append(this.ApiSecret); 
      byte[] hash = null; 
      using (var md5 = System.Security.Cryptography.MD5CryptoServiceProvider.Create()) 
      { 
       if (md5 != null) 
       { 
        hash = md5.ComputeHash(Encoding.UTF8.GetBytes(payload.ToString())); 
       } 
      } 

      if (hash == null) 
      { 
       throw new InvalidOperationException("Hash is not valid."); 
      } 

      StringBuilder signature = new StringBuilder(); 
      for (int i = 0; i < hash.Length; i++) 
      { 
       signature.Append(hash[i].ToString("x2", CultureInfo.InvariantCulture)); 
      } 

      return signature.ToString(); 
     } 
+0

攻撃は、他人のクッキーをコピーして、犠牲者であるふりをすることです。したがって、それを検証することで、それが有効であることが確認されます。 –

+0

私は 'nhnb'が書いたことを意味しましたが、私もあなたの答えに感謝します。 –

関連する問題