2011-01-13 4 views
0
kommt

Ich habe eine Reihe von JSONP-Web-Service auf meiner J2EE-Anwendung erstellt, die von einer Website unter einer anderen Domäne verwendet werden. Die Web-Services wurden mit dem Jersey-Framework erstellt.Holen Sie sich die Domain, die eine Ajax-Anfrage von

Was ich wissen möchte ist, gibt es eine Möglichkeit, die ich in meinem Web-Service-Code feststellen kann, aus welcher Domäne die Anfrage stammt? Was ich hoffe ist, dass es einen Wert im HttpHeader gibt, der diesen Wert hätte.

Ist es auch möglich, dass der Benutzer den Ajax-Anruf tätigt, diesen Wert vortäuscht oder einen anderen Wert eingibt, bevor er den Anruf sendet?

Was ich hoffe, um dies zu verwenden, ist die Beschränkung der Domänen, die meinen Web-Service aufrufen können. Ich muss JSONP verwenden, aber ich möchte nicht, dass mein Web-Service für jeden verfügbar ist, der meinen JavaScript-Code rückentwickelt.

Oder weiß jemand einen anderen Weg, dies zu tun?

+1

Hätte der HTTP-Referer diese Informationen nicht? –

+0

Ja, das könnte das sein, wonach ich suche. Könnte dieser Wert gefälscht sein? Wie in könnte Sie eine Ajax Anfrage senden und diesen Wert mit dem Namen meiner Domain überschreiben – user574040

Antwort

0

Eine Möglichkeit, dies zu erreichen, wäre die Authentifizierung der Benutzer in der entfernten Domäne, die die Anforderung senden soll. So könnte beispielsweise der Server in der entfernten Domäne einen verschlüsselten Wert für authentifizierte Benutzer ausgeben. Wenn Sie dann die JSONP-Anfrage senden, senden Sie dieses Token an den Web-Service, der es entschlüsseln würde. Die Idee ist, dass beide Server ein gemeinsames Geheimnis zum Verschlüsseln/Entschlüsseln dieses Tokens teilen sollten. Auf diese Weise können Sie sicherstellen, dass die Anfrage vom anderen Server kam.

+0

Sicher würde das nur den Reverse Engineering erschweren, aber nicht unmöglich? Wenn jemand anders den gesamten JavaScript-Code genommen hat, was er tun kann, könnte er all dies auf seiner Site einschließen und dann die authentifizierten Werte enthalten. – user574040

+0

@ user574040, ja, aber der Wert des Tokens wird vom Server generiert.Und der Server würde dieses Token nur an authentifizierte Benutzer auf dieser Site ausgeben. Also ohne den Server ist das Javascript nutzlos. –

+0

Aber wie würden Sie die Anwendungen authentifizieren, bevor Sie ihnen das Token senden? – user574040

0

Ihre RESTful-Dienste werden auf einem Webserver gehostet, und mit REST sind Sie auf die Standardfunktionen beschränkt, die als Teil von HTTP bereitgestellt werden. Beispielsweise könnten Sie die Host-IP abrufen, die die Anfrage gesendet hat, aber beachten Sie, dass dies gefälscht werden kann.

Eine Option, die Ihnen offen steht, wäre, die Webdienstanforderungen digital signieren zu lassen. Dies bedeutet im Wesentlichen, dass der Anrufer eine Anfrage erstellt und eine Message Authentication Code zur Anfrage hinzufügt. Der MAC wird mit einem geheimen Schlüssel generiert, den nur ein autorisierter Benutzer Ihres Dienstes kennt. Sie können (und sollten) auch eine Benutzer-ID zur Web-Service-Anfrage hinzufügen, damit Sie jedem Benutzer seinen eigenen geheimen Schlüssel geben können.

Denken Sie daran, dass, wenn Ihre Dienste per Javascript aufgerufen werden (zB mit AJAX), die Anrufe vom Client-Computer kommen. Dies bedeutet, dass sie vollständig für Reverse Engineering offen sind. Wenn Sie sich auf Javascript verlassen, um die Anfrage digital zu unterschreiben, dann müsste das Javascript den geheimen Schlüssel kennen und ihn daher jedem Angreifer offen legen.

+0

Also, wenn ich Werte verwende, die als Teil von HTTP kommen, könnte ich sagen, dass sie von der richtigen Quelle kommen. Aber die Leute können diese Werte spoofen oder vortäuschen, aber sie manuell einstellen, bevor sie eine Anfrage stellen. Wenn ich nur diese Kontrolle hatte, könnten Leute, die den Code rückentwickeln, nicht in der Lage sein, herauszufinden, welche Prüfung ich auf dem Server mache. Ich bin vorsichtig bei der Verwendung von etwas wie MAC, weil ich ziemlich sicher bin, dass das erste, was passieren wird, wenn ich dies aussetze, ist, dass es reverse engineered wird. – user574040

0

Sie können HTTP_REFERER verwenden, wie bereits erwähnt

Einige Codebeispiel: 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']; 
?> 

Das Ergebnis sieht wie folgt aus:

http://localhost/talker.php 
+0

Java wurde gefragt, nicht PHP – celwell