2013-09-25 4 views
5

ページの読み込み時に暗号化されたCookieがあるかどうかをチェックしてユーザーの身元を判断するウェブページがあります。しかし、開発ボックスでローカルにページをテストしているときに、そのCookieにアクセスすることはできません。Request.IsLocalは安全ですか、それともなりすますことができますか?

以前は、開発モードかどうかをページに伝えるためにappsettingを使用しましたが、dev-modeのときは固定ユーザーIDを読み込みます。その後、私はRequest.IsLocal

を発見し、私は単純に次のように確認することができます。

if(Request.IsLocal){ 
    FormsAuthentication.SetAuthCookie("testUser", false); 
}else{ 
    FormsAuthentication.SetAuthCookie(/*EncryptedCookieValue*/, false); 
} 

は、この安全ですか?悪意のあるユーザーがIsLocalを偽装する可能性はありますか?

+0

'Request.IsLocal'は、要求発信元のIPアドレスが127.0.0.1であるか、[...]がサーバのIP" _と同じである場合に "true"を返します。したがって、IPアドレスが偽装される可能性があるため、偽装することができます。また、同じサーバー上で動作するプロキシサーバーや負荷分散サーバーがある場合は、完全に嘘をつきます。 – CodeCaster

+2

可能な重複:http://stackoverflow.com/questions/7148821/request-islocal – k3davis

答えて

6

あなたの実際の質問は、どのように開発機能のみを持っていると思いますか?

あなたは使用することができます:Environment.UserInteractive
http://msdn.microsoft.com/en-us/library/system.environment.userinteractive.aspx

ユーザーインターフェース、すなわちVisual Studioのときに、現像が彼らのときにIISまたはWindowsサービス、で真を実行しているときには、を返します。

これは、動作がより一貫しているため、DEBUGプリプロセッサ変数よりも優れていると思います。ビルド/リリースプロセスが非常に緊密でない限り、誤ってDLLのDEBUGバージョンを実環境にアップロードできます。

経験則として、クライアントから何かを信頼することはお勧めできません。
私はまた実用的でしょう。あなたは何を保護していますか、誰かがハックしようと努力していますか?

以下のSOポストは、あなたがそれを信用してはならない理由の一部に入る:
Can I fool HttpRequest.Current.Request.IsLocal?

リファレンス
あなたはhttp://referencesource.microsoft.com

public bool IsLocal { 
    get { 
     String remoteAddress = UserHostAddress; 

     // if unknown, assume not local 
     if (String.IsNullOrEmpty(remoteAddress)) 
     return false; 

     // check if localhost 
     if (remoteAddress == "127.0.0.1" || remoteAddress == "::1") 
     return true; 

     // compare with local address 
     if (remoteAddress == LocalAddress) 
     return true; 

     return false; 
    } 
+0

cloudflareのようなCDNでは動作しません – jjxtra

2

でソースを表示することができますIsLocalのコードは堅牢であるようです - あなたの目的のためにロジックの欠陥を見ることはできませんとなります。

ただし、アプリケーション(または同じサーバー上で実行されている他のアプリケーション)がエンドユーザーの影響を受けるHTTPリクエストを作成した場合、追加のセキュリティレイヤーを追加する必要があります秘密/期限切れの鍵やトークンを要求に追加するか、ローカルリソースを要求することができないようにHTTPリクエストを保護することができます。

あなたのウェブサイトがhttp://www.example.com/DeleteAllUsersのような終点を持ち、この要求を処理するコードでIsLocalをチェックして、ローカルの信頼できるリクエストである場合にのみユーザーを削除できることを確認してください。とユーザーがHTTPリクエストのでDeleteAllUsersを要求し、IsLocalセキュリティチェックを満足するようにアプリケーションを引き起こし、このテキストボックスにhttp://www.example.com/DeleteAllUsersに入る:

今度は、ヘッダーを表示するWebアドレスを入力し、あなたのウェブサイト上の機能を持っているとしましょうあなたのアプリから作られています。これはどのようにIsLocalが悪用されるかということであり、その点を証明するための人為的な例だと気付いていますが、表示するURLのプレビュー画像を取得するなど、多くのWebサイトで同様のことが行われます。ローカルHTTP要求を行うためにサーバー上に何もできない場合は、適切に行ってください。

1

リモートIPを特定するのは難しく、サーバーを正しく構成するかどうかによって異なります。

たとえば、誤って構成されたサーバーでは、X-Forwarded-Forを使用してIPを特定できますが、クライアントによって選択することができます。しかし、それを独自のIPに設定するリバースプロキシを使用する場合、これはIPを判別する正しい方法です。

ソケットからのIPを使用することも間違っている可能性があります。リバースプロキシをWebサーバーとしてマシンで実行していると考えてください。

=>可能使用している場合は別の認証メカニズム

1

あなたは他の回答で述べた理由から、本番サーバー上でこのコードを置くべきではありません。

しかし、あなたは、あなたの開発ボックスで

#if DEBUG 
    if (Request.IsLocal) 
    { 
     FormsAuthentication.SetAuthCookie("testUser", false); 
    } 
    else 
    { 
#endif 
     FormsAuthentication.SetAuthCookie(/*EncryptedCookieValue*/, false); 
#if DEBUG 
    } 
#endif 

を行うデバッグビルドを実行することができます。本番環境では、リリースビルドを展開します。

関連する問題