如何只允许Web应用程序访问Web服务?

问题描述:

我有一个web应用程序,它使JavaScript调用Web服务。我不想让任何像SOAP ui/curl这样的程序访问我的web服务。 在响应头我做过滤以只我的网页:如何只允许Web应用程序访问Web服务?

Access-Control-Allow-Origin:http://myurl.com 

当我的要求去做,从我的本地机器的服务器不允许这样做:

XMLHttpRequest无法加载http://myurl.com/service/rest/user/addAccess-Control-Allow-Origin标题的值为http://myurl.com不等于提供的来源。原因http:// localhost:9000因此不允许访问。

这很好,我很开心,但显然我可以使用Soap ui/curl进行上述调用,并且该服务允许它。此通话的标题:

=== MimeHeaders === 
accept-encoding = gzip,deflate 
content-type = application/json 
content-length = 39 
host = localhost:8080 
connection = Keep-Alive 
user-agent = Apache-HttpClient/4.1.1 (java 1.5) 

如何仅允许我的网络应用程序来源调用服务?

+0

真的没有可靠的方法来执行这种限制。你为什么想要? – Pointy

+0

CORS仅在与远程域上的资源联系时由(支持)客户端浏览器强制执行。因此,当远程服务器或任何其他类型的远程软件向您的服务器发送HTTP请求时,CORS不适用。限制访问服务取决于您的设置和服务器类型的其他因素。请分享这些。 – Boaz

+0

浏览器使用Access-Control-Allow-Origin和类似的头文件,由于curl不在浏览器中运行,所以这些头文件将被忽略。你可以尝试检查Referrer或代理字符串,使用生成的令牌等,但是你不能100%阻止任何不是你的应用程序的东西。 –

CORS只适用于浏览器沙箱。如果您想阻止访问,请输入一些验证字,例如basic auth或使用一些自定义标题将通话列入白名单。

您在这里定义的只是客户端保护,以防止浏览器客户端对服务器执行恶意请求,只要浏览器未以不安全模式运行即可。

如果您需要后端的安全性,请考虑使用某种防火墙来限制网络访问,或使用基本身份验证等身份验证机制来保护您的后端。

快速回答:您无法确定100%,您的网页中的Javascript发出请求。根据定义,这是您的用户提出请求。

其他回答:你可以使用多种东西来保护自己。

  1. 生成有限生命周期的cookie。
  2. 制作一个油门,以便您可以按时间单位限制请求的数量。
  3. ....

还有更多其他的解决方案,只需搜索它在网络上,你会发现很多。