我在J2EE应用程序上创建了一组JSONP Web服务,该服务将由不同域下的网站使用。 Web服务已使用Jersey框架创建。
我想知道的是,有什么方法可以告诉我的Web服务代码,请求来自哪个域?我希望HttpHeader中有一个具有此值的值。
也可以让用户进行Ajax调用,伪造此值,或者在发送呼叫之前输入其他值吗?
我希望将其用于限制可以调用我的Web服务的域。我需要使用JSONP,但我不希望我的Web服务可供任何逆向工程我的JavaScript代码的人使用。
或者有人知道另一种方法吗?
答案 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