2011-01-13 92 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