2011-01-13 37 views
0

J2EEアプリケーションで作成された一連のJSONP Webサービスが、別のドメインのWebサイトで使用されています。 Webサービスは、Jerseyフレームワークを使用して作成されています。Ajaxリクエストの発信元ドメインを取得する

私が知りたいのは、Webサービスコードで要求がどのドメインから来たのかわかりますか?私が望むのは、この値を持つHttpHeaderに値があることです。

また、Ajax呼び出しを行っているユーザー、この値を偽装したり、呼び出しを送信する前に別の値を設定したりすることは可能でしょうか?

私がこれを使用したいのは、私のWebサービスを呼び出すことができるドメインを制限することです。私はJSONPを使用する必要がありますが、自分のJavaScriptコードをリバースエンジニアリングする人には私のWebサービスを利用できないようにしたいのです。

また、誰かがこれを行う別の方法を知っていますか?

+1

HTTPリファラーはこの情報を持っていませんか? –

+0

はい、それは私が探しているかもしれません。その価値は偽造できますか?あなたがAjaxリクエストを送ってその値を私のドメインの名前で上書きすることができるのですか? – user574040

答えて

0

これを達成する方法の1つは、要求を送信するはずの遠いドメインのユーザーを認証することです。たとえば、離れたドメインのサーバーは、認証されたユーザーに暗号化された値を送信できます。次に、JSONPリクエストを送信するときに、このトークンをWebサービスに送信し、それを復号化します。この考え方は、両方のサーバーがこのトークンを暗号化/復号化するための共通の秘密を共有する必要があるということです。これにより、要求が他のサーバーから送信されたことを確認できます。

+0

これは、リバースエンジニアリングを難しくしますが、不可能ではないでしょうか?他の誰かができるすべてのJavaScriptコードを取得した場合、そのサイトにすべてのJavaScriptコードを組み込んで認証された値を含めることができます。 – user574040

+0

@ user574040、はい、トークンの値はサーバーによって生成されます。サーバーは、このサイトの認証済みのユーザーにのみこのトークンを送信します。サーバーがなければjavascriptは役に立たない。 –

+0

しかし、トークンを送信する前に、どのように使用を認証しますか? – user574040

0

あなたのRESTfulサービスはWebサーバー上でホストされており、RESTではHTTPの一部として提供される標準的なものに限定されています。たとえば、リクエストを送信したホストIPを取得できますが、これがなりすましになる可能性があることに注意してください。

あなたには、ウェブサービスリクエストにデジタル署名を要求するオプションがあります。これは基本的に、呼び出し元がMessage Authentication Codeを作成して要求に追加することを意味します。 MACは、あなたのサービスの承認されたユーザだけが知っている秘密鍵を使用して生成されます。 Webサービス要求にユーザーIDを追加することもできます(また、必要があります)。これにより、各ユーザーに独自の秘密鍵を与えることができます。

サービスがJavaScript(AJAXなど)を使用して呼び出されている場合、呼び出しはクライアントコンピュータから行われることに注意してください。つまり、リバースエンジニアリングのために完全にオープンです。リクエストにデジタル署名するためにjavascriptを使用する場合、javascriptは秘密鍵を知る必要があるため、攻撃者に公開する必要があります。すでに

いくつかのコード例を述べたように

+0

HTTPの一部として提供される値を使用すると、正しいソースから来ていることがわかります。しかし、人々はこれらの値をなりすましたり、偽装することはできますが、要求を行う前に手動で設定することができます。私はちょうどこのチェックをしていた場合、コードをリバースエンジニアリングした人々は、私がサーバー上で何をしているのか把握できないかもしれません。私は、MACのようなものを使うことには気をつけています。なぜなら、私がこれを公開するときに起こる最初のことは、リバースエンジニアリングされるということです。 – user574040

0

あなたはHTTP_REFERERを使用することができます。 talker.php

<html> 
    <head> 
    <title>HTTP Referer example</title> 
    <script language="javascript" type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> 
    </head> 
    <body> 
    <div class="result"></div> 
    <script type="text/javascript"> 
     $(document).ready(function() { 
      $.ajax({ 
       url: 'observer.php', 
       success: function(data) { 
        $('.result').html(data); 
       } 
      }); 
     }); 
    </script> 
    </body> 
</html> 

observer.php

<?php 
    echo $_SERVER['HTTP_REFERER']; 
?> 

が、結果は以下のようになります。

http://localhost/talker.php 
+0

JavaではPHPが要求されていません – celwell

関連する問題