了解CORS

Kra*_*ken 11 web-services cors

我一直在网上看CORS,我想确认一下我做的是什么,实际上是什么.

下面提到的是一个完全虚构的场景.

我将以一个普通网站为例.假设我的html页面有一个带有文本字段名称的表单.在提交时,它将表单数据发送到myPage.php.现在,内部发生的是,服务器将请求www.mydomain.com/mydirectory/myPage.php与文本字段一起发送.现在,服务器看到请求是从同一域/端口/协议触发的

(问题1.服务器如何了解所有这些细节.它从哪里提取所有这些细节?)

尽管如此,由于请求来自同一个域,因此它会为php脚本提供服务并返回所需的任何内容.

现在,为了争论,让我们说我不想在文本字段中手动填充数据,而是我想以编程方式进行.我所做的是,我使用javascript创建一个html页面并触发POST请求以及参数(即textField的值).现在,由于我的请求不是来自任何域,服务器忽略了我的请求服务.我得到跨域错误?

同样,我也可以编写一个Java程序,它使用HTTPClient/Post请求并执行相同的操作.

问题2:这是问题所在吗?

现在,CORS为我们提供的是,服务器会说'任何人都可以访问myPage.php'.从启用cors.org,它说

对于简单的CORS请求,服务器只需要在其响应中添加以下标头:Access-Control-Allow-Origin:*

现在,客户端究竟对这个标题做了什么.如同,客户端无论如何想要调用服务器上的资源吧?应该是服务器来配置自己是否要接受,并采取相应的行动.

问题3:将标头发送回客户端(已经向服务器发出请求)有什么用?

最后,我没有得到的是,我说我正在为我的Android应用程序构建一些RESTful服务.现在,说我有一个POST服务www.mydomain.com/rest/services/myPost.我有我的Tomcat服务器在我的本地机器上托管这些服务.

在我的Android应用程序中,我只是调用此服务,并返回结果(如果有的话).在这种情况下,我到底在哪里使用CORS.这属于不同类别的服务器调用吗?如果是,那究竟是多少.

此外,我检查了Tomcat的Enable Cors,它说我可以在我的动态Web项目的web.xml中添加一个过滤器,然后它就会开始接受它.

问题4:是什么启用从我的Android设备到我的webservices的调用?

谢谢

sam*_*ris 12

  1. 首先,跨域检查由浏览器而不是服务器执行.当JavaScript XmlHttpRequest生成服务器而不是其来源时,如果浏览器支持CORS,它将初始化CORS进程.否则,请求将导致错误(除非用户故意降低浏览器安全性)

  2. 当服务器遇到OriginHTTP标头时,服务器将决定它是否在允许的域列表中.如果它不在列表中,则请求将失败(即服务器将发送错误响应).

对于3号和4号,我认为你应该提出不同的问题.否则这个问题会变得太宽泛.而且我认为如果你不删除它会迅速接近.

有关CORS的解释,请参阅程序员的回答:https://softwareengineering.stackexchange.com/a/253043/139479

注意:CORS更像是一种惯例.它不保证安全.您可以编写一个忽略相同域策略的恶意浏览器.它将执行从任何站点获取的JavaScript.您还可以使用任意Origin标头创建HTTP标头,并从实现CORS的任何第三方服务器获取信息.CORS仅在您信任浏览器时才有效.