2011-01-13 107 views
0

我在我的J2EE應用程序上創建了一組JSONP Web服務,該服務將由不同域下的網站使用。 Web服務是使用Jersey框架創建的。獲取Ajax請求來自的域

我想知道的是,有沒有一種方法可以告訴我的Web服務代碼,請求來自哪個域?我所希望的是HttpHeader中有一個值會有這個值。

用戶在發送Ajax呼叫,僞造這個值或在發送呼叫之前放入另一個值也是可能的嗎?

我希望能用它來限制可以調用我的web服務的域。我需要使用JSONP,但我不希望我的Web服務可用於任何反向工程師JavaScript代碼的人。

還是有人知道這樣做的另一種方式?

+1

HTTP引用者是否沒有這些信息? – 2011-01-13 10:25:29

+0

是的,這可能是我正在尋找的。這個價值可能是假的嗎?就像你可以發送一個Ajax請求並用我的域名覆蓋那個值 – user574040 2011-01-13 10:46:27

回答

0

實現此目的的一種方法是驗證應該發送請求的遠程域上的用戶。因此,例如,遠程域上的服務器可能會向經過身份驗證的用戶發出一些加密值。然後,在發送JSONP請求時,您會將此令牌發送給將解密該令牌的Web服務。這個想法是兩臺服務器應該共享一些共同的祕密來加密/解密這個令牌。這樣可以確保請求來自其他服務器。

+0

這肯定會讓逆向工程變得更難,但不是不可能的嗎?如果其他人拿走了他們可以做的所有JavaScript代碼,他們可以將其全部包含在他們的網站上,然後包含認證值。 – user574040 2011-01-13 10:32:27

+0

@ user574040,是的,但令牌的值將由服務器生成。服務器只會將此令牌發送給本站點上的已驗證用戶。所以沒有服務器的JavaScript是沒用的。 – 2011-01-13 10:35:09

0

您的RESTful服務託管在Web服務器上,而REST僅限於作爲HTTP一部分提供的標準內容。例如,您可以獲取發送請求的主機IP,但請注意這可能是欺騙性的。

向您開放的一個選擇是要求Web服務請求進行數字簽名。這基本上意味着調用者創建並向請求添加Message Authentication Code。 MAC是使用只有您的服務的授權用戶知道的密鑰生成的。您可以(也應該)將用戶標識添加到Web服務請求中,從而允許您爲每個用戶分配自己的密鑰。

請記住,如果您的服務被javascript調用(例如使用AJAX),則調用將來自客戶端計算機。這意味着他們完全開放來逆向工程。如果您依賴於javascript對請求進行數字簽名,那麼JavaScript需要知道該密鑰,因此將其公開給任何攻擊者。

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