我在我的J2EE应用程序上创建了一组JSONP Web Service,它将由不同域下的网站使用。web服务是使用Jersey框架创建的。
我想知道的是,有没有一种方法可以在我的Web服务代码中告诉我,请求来自哪个域?我希望在HttpHeader中有一个值,这个值就是这个值。
另外,发出Ajax调用的用户是否可以伪造此值,或者在发送调用之前输入另一个值?
我希望使用它的目的是限制可以调用我的web服务的域。我需要使用JSONP,但我不希望我的web服务对任何对我的JavaScript代码进行反向工程的人可用。
或者,有没有人知道另一种方法?
发布于 2012-05-04 11:38:16
如前所述,您可以使用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
发布于 2011-01-13 10:19:24
实现这一点的一种方法是对应该发送请求的远程域上的用户进行身份验证。因此,例如,远程域上的服务器可以向经过身份验证的用户发出某种加密值。然后,在发送JSONP请求时,您可以将此令牌发送到web服务,后者将对其进行解密。这个想法是两个服务器应该共享一些共同的秘密来加密/解密这个令牌。这样,您可以确保请求来自另一台服务器。
发布于 2011-01-13 10:39:37
您的RESTful服务托管在web服务器上,而使用REST时,您只能使用作为HTTP一部分的标准内容。例如,您可以获取发送请求的主机IP,但请注意这可能是欺骗的。
您可以选择要求对web服务请求进行数字签名。这基本上意味着调用者创建一个Message Authentication Code并将其添加到请求中。MAC是使用只有您的服务的授权用户知道的密钥生成的。您还可以(也应该)将用户ID添加到web服务请求中,从而允许您为每个用户提供自己的密钥。
请记住,如果您的服务是由javascript (例如使用AJAX)调用的,那么调用将来自客户端计算机。这意味着它们对逆向工程是完全开放的。如果您依赖javascript对请求进行数字签名,则javascript需要知道密钥,从而将其暴露给任何攻击者。
https://stackoverflow.com/questions/4678877
复制