web / android / ios之间的CORS问题

时间:2017-10-18 04:40:41

标签: angularjs cors

当尝试$ .ajax从我网站上的其他网站获取某些内容时,我收到了错误。

无法加载https://www.pinterest.com/:否'访问控制 - 允许 - 来源'标头出现在请求的资源上。起源' http://localhost:8100'因此不允许访问。

我知道如果目标网站不允许localhost:8100获取数据,我无法在网络上的客户端获取它。

然而,我发现移动应用程序(不是移动浏览器,但android / ios应用程序)没有问题,他们可以通过默认的移动内置HTTP获取功能简单地获取网站内容。

我是否想问为什么手机不会遇到CORS问题(手机只能通过内置的http get功能获取网页内容)?

感谢。

2 个答案:

答案 0 :(得分:1)

浏览器强制执行CORS以满足他们必须满足的安全标准。它不会影响以任何语言编程方式发出的请求,例如对bash的curl调用。

这是CORS的工作方式,基于Wikipedia

  1. 浏览器使用Origin HTTP标头发送OPTIONS请求。此标头的值是为父页面提供服务的域。当http://www.example.com中的某个网页尝试访问service.example.com中的用户数据时,以下请求标头将发​​送到service.example.com:Origin: http://www.example.com

  2. service.example.com上的服务器可能会回复:

    • 其响应中的Access-Control-Allow-Origin(ACAO)标头指示允许哪些源站点。例如:Access-Control-Allow-Origin:http://www.example.com
    • 如果服务器不允许跨源请求,则为错误页面
    • 一个Access-Control-Allow-Origin(ACAO)标头,带有允许所有域的通配符:Access-Control-Allow-Origin:*
  3. CORS的工作方式意味着它是可选的。浏览器强制执行它以防止Javascript AJAX调用执行恶意调用。但是手工构建的其他类型的消费者不需要强制执行CORS。

    在这个例子中思考:

    • 您是somesite.com的所有者
    • 用户使用传统的Cookie方法对您的网站进行身份验证
    • 用户登录anothersite.com,由攻击者构建。该站点具有以下代码:

      <script>fetch('http://somesite.com/posts/1', { method: 'DELETE' });</script>
      

      ...有效地向您的网站执行请求并做坏事。

    • Hapilly,浏览器会在看到跨域请求时执行预检请求,如果您的网站没有回复说来自anothersite.com的请求是正常的,默认情况下您将受到潜在攻击< / LI>

    这就是为什么CORS只在浏览器的上下文中有意义。 您发送到浏览器的Javascript无法(至少很容易)绕过CORS,因为浏览器中的the only API that allows you to perform requests是用石头写的。此外,浏览器之外没有本地存储或cookie。

    Corolarium :执行CORS是请求者或任何向您发出请求的人而非发件人的故意行为。浏览器中的Javascript API强制执行它。其他语言不需要解释原因。

答案 1 :(得分:1)

在设备上运行时,您的文件通过file://协议提供,而不是http://,因此您的origin将不存在。这就是本机设备的请求不会触发CORS的原因。