当尝试$ .ajax从我网站上的其他网站获取某些内容时,我收到了错误。
无法加载https://www.pinterest.com/:否'访问控制 - 允许 - 来源'标头出现在请求的资源上。起源' http://localhost:8100'因此不允许访问。
我知道如果目标网站不允许localhost:8100获取数据,我无法在网络上的客户端获取它。
然而,我发现移动应用程序(不是移动浏览器,但android / ios应用程序)没有问题,他们可以通过默认的移动内置HTTP获取功能简单地获取网站内容。
我是否想问为什么手机不会遇到CORS问题(手机只能通过内置的http get功能获取网页内容)?
感谢。
答案 0 :(得分:1)
浏览器强制执行CORS以满足他们必须满足的安全标准。它不会影响以任何语言编程方式发出的请求,例如对bash的curl
调用。
这是CORS的工作方式,基于Wikipedia:
浏览器使用Origin HTTP标头发送OPTIONS请求。此标头的值是为父页面提供服务的域。当http://www.example.com中的某个网页尝试访问service.example.com中的用户数据时,以下请求标头将发送到service.example.com:Origin: http://www.example.com
。
service.example.com上的服务器可能会回复:
CORS的工作方式意味着它是可选的。浏览器强制执行它以防止Javascript AJAX调用执行恶意调用。但是手工构建的其他类型的消费者不需要强制执行CORS。
在这个例子中思考:
用户登录anothersite.com,由攻击者构建。该站点具有以下代码:
<script>fetch('http://somesite.com/posts/1', { method: 'DELETE' });</script>
...有效地向您的网站执行请求并做坏事。
这就是为什么CORS只在浏览器的上下文中有意义。 您发送到浏览器的Javascript无法(至少很容易)绕过CORS,因为浏览器中的the only API that allows you to perform requests是用石头写的。此外,浏览器之外没有本地存储或cookie。
Corolarium :执行CORS是请求者或任何向您发出请求的人而非发件人的故意行为。浏览器中的Javascript API强制执行它。其他语言不需要解释原因。
答案 1 :(得分:1)
在设备上运行时,您的文件通过file://
协议提供,而不是http://
,因此您的origin
将不存在。这就是本机设备的请求不会触发CORS的原因。