【问题标题】:Get the Domain that an Ajax Request is coming from获取 Ajax 请求来自的域
【发布时间】:2011-06-08 09:51:21
【问题描述】:

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

我想知道的是,有没有办法在我的 Web 服务代码中判断请求来自哪个域?我希望 HttpHeader 中有一个值,它会有这个值。

进行 Ajax 调用的用户是否有可能伪造这个值,或者在他们发送调用之前输入另一个值?

我希望使用它来限制可以调用我的网络服务的域。我需要使用 JSONP,但我不希望任何对我的 JavaScript 代码进行逆向工程的人都可以使用我的 Web 服务。

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

【问题讨论】:

  • HTTP referer 会不会没有这个信息?
  • 是的,这可能就是我要找的。这个值会被伪造吗?就像你可以发送一个 Ajax 请求并用我的域名覆盖那个值吗

标签: java ajax jakarta-ee jsonp jersey


【解决方案1】:

如前所述,您可以使用 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

【讨论】:

  • 要求的是 Java,而不是 PHP
【解决方案2】:

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

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

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

【讨论】:

  • 因此,如果我使用作为 HTTP 一部分的值,我可以判断它们来自正确的来源。但是人们可以欺骗或伪造这些值,但在他们发出请求之前手动设置它们。但是,如果我只是进行了此检查,则对代码进行逆向工程的人可能无法弄清楚我在服务器上进行了哪些检查。我对使用 MAC 之类的东西持谨慎态度,因为我相当确定当我公开它时会发生的第一件事就是它会被逆向工程。
【解决方案3】:

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

【讨论】:

  • 这肯定会使逆向工程变得更加困难,但并非不可能?如果其他人拿走了他们可以做的所有 JavaScript 代码,他们可以将其全部包含在他们的网站上,然后包含经过身份验证的值。
  • @user574040,是的,但是令牌的值将由服务器生成。服务器只会将此令牌发送给该站点上经过身份验证的用户。因此,如果没有服务器,javascript 将毫无用处。
  • 但是在向他们发送令牌之前,您将如何验证用户身份?
  • @user574040,向他们询问用户名/密码。
  • 向使用该站点的用户询问用户名/密码不是一种选择,我希望对用户隐藏 Ajax 的使用。
猜你喜欢
  • 1970-01-01
  • 2017-07-24
  • 2010-09-24
  • 1970-01-01
  • 2016-09-12
  • 1970-01-01
  • 2014-09-27
  • 2015-10-26
相关资源
最近更新 更多