获取Ajax请求来自的域

时间:2011-01-13 10:13:25

标签: java ajax java-ee jsonp jersey

我在J2EE应用程序上创建了一组JSONP Web服务,该服务将由不同域下的网站使用。 Web服务已使用Jersey框架创建。

我想知道的是,有什么方法可以告诉我的Web服务代码,请求来自哪个域?我希望HttpHeader中有一个具有此值的值。

也可以让用户进行Ajax调用,伪造此值,或者在发送呼叫之前输入其他值吗?

我希望将其用于限制可以调用我的Web服务的域。我需要使用JSONP,但我不希望我的Web服务可供任何逆向工程我的JavaScript代码的人使用。

或者有人知道另一种方法吗?

3 个答案:

答案 0 :(得分:0)

实现此目的的一种方法是验证远程域上应该发送请求的用户。因此,例如远程域上的服务器可以向经过身份验证的用户发出一些加密值。然后,当发送JSONP请求时,您会将此令牌发送到将解密它的Web服务。这个想法是两个服务器应该共享一些共同的秘密来加密/解密这个令牌。这样您就可以确保请求来自其他服务器。

答案 1 :(得分:0)

您的RESTful服务托管在Web服务器上,使用REST时,您只能使用作为HTTP一部分的标准内容。例如,您可以获取发送请求的主机IP,但请注意,这可能是欺骗性的。

对您开放的一个选项是要求对Web服务请求进行数字签名。这基本上意味着调用者创建并向请求添加Message Authentication Code。 MAC是使用只有您服务的授权用户知道的密钥生成的。您可以(也应该)向Web服务请求添加用户ID,允许您为每个用户分配自己的密钥。

请记住,如果您的服务是通过javascript调用的(例如使用AJAX),则调用将来自客户端计算机。这意味着他们对逆向工程完全开放。如果您依靠javascript对请求进行数字签名,那么javascript将需要知道密钥,因此将其暴露给任何攻击者。

答案 2 :(得分: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