代码之家  ›  专栏  ›  技术社区  ›  J. Doe

跨域是怎么回事?

  •  -1
  • J. Doe  · 技术社区  · 8 年前

    我无法理解我想问的某些事情。

    场景1:我创建了一个HTML/JavaScript网站,在其中我使用AJAX获取Google的HTML。com,我遇到了臭名昭著的跨域问题( No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access. )

    场景2:我进入www.google。com,我选择 Source Code 在我的上下文菜单中,我得到输入代码。

    以下是问题:

    1. 这个信息(及其含义)有什么目的?当我可以通过浏览器请求相同的网站时,如何保护谷歌免受我的邪恶脚本的攻击?请求是否相同?

    2. 当来源是浏览器、笔记本电脑、路由器、ISP、互联网,然后是谷歌时,场景1和场景2之间的来源有何区别。

    3. 为什么,是谁发明了这种方法来歧视本地脚本和浏览器本身,它有什么用途?如果请求是恶意的,则在两种场景中都是同样恶意的。

    4. 相同的精确原点 .

    2 回复  |  直到 8 年前
        1
  •  3
  •   Bailey Parker    8 年前

    Origin与您的浏览器、笔记本电脑、路由器、ISP等无关。Origin与发出请求的域有关。所以如果一个脚本 https://evil.com/devious.js 正在向发出XHR请求 http://google.com ,请求的来源是 evil.com Access-Control-Allow-Origin 并验证是否允许该脚本发出该请求。

    所有这些都是为了防止恶意脚本(用户不知道)代表他们向Google发出请求。考虑一下银行的情况。您不希望任何其他网站的脚本能够向银行发出请求(从 你的 浏览器打开 你的 代表)。银行可以通过禁用跨域请求来防止这种情况。

    和to(1):当您在google上打开控制台时。com页面,您提出的任何请求都来自谷歌。com,这就是为什么您能够发出这些请求。这与我刚才提到的情况不同,因为用户必须有意识地复制一些恶意javascript,访问他们银行的网站,打开控制台,粘贴并运行它(许多用户都会对此产生怀疑)。

        2
  •  3
  •   Paul    8 年前

    网站通常不是无状态的,它们通常在您的计算机上存储信息,例如识别您登录的帐户的会话cookie。如果您的浏览器没有阻止未明确允许的跨源请求,您可以登录gMail,然后访问randomguysblog。org和randomguysblog上的脚本。org可以使用您的浏览器向gMail发出POST请求。既然你已经登录,他可以代表你发送电子邮件。也许你也登录了你的银行,randomguy决定将你所有的钱转到他的账户,或者只是四处看看你有多少钱。

    要单独回答您的问题:

    这个信息(及其含义)有什么目的?当我可以通过浏览器请求相同的网站时,如何保护谷歌免受我的邪恶脚本的攻击?请求是否相同?

    受保护的不是谷歌,而是你网站的用户也登录了谷歌。请求是相同的,但假设服务器支持飞行前请求,用户浏览器甚至不会发送请求。如果服务器不支持飞行前请求,则会发送请求,但不允许启动请求的脚本查看响应。还有其他不使用Ajax的发送请求而不查看响应的方法,例如通过提交隐藏表单,这就是为什么还需要CSRF令牌。CSRF令牌使一个操作需要两个请求,而第一个请求的响应中需要一个令牌才能发出第二个请求。

    当来源是浏览器、笔记本电脑、路由器、ISP、互联网,然后是谷歌时,场景1和场景2之间的来源有何区别。

    在场景2中,用户自己发出两个请求,因此他们必须同时发出这两个请求。在场景1中,用户仅尝试访问您的网站,而您的网站正在使用其浏览器向Google发出请求,而他们可能不希望您的网站这样做。

    为什么,是谁发明了这种方法来歧视本地脚本和浏览器本身,它有什么用途?如果请求是恶意的,则在两种场景中都是同样恶意的。

    其目的是保护浏览器用户免受恶意脚本的攻击。在场景1中,恶意脚本无法访问来自Google的响应。用户可以,但这并不是为了保护用户免受攻击。

    谷歌如何知道它的来源,以及它与我通过地址栏请求他们的网站有什么不同?同样的精确原点。

    谷歌可以查看推荐人的标题,但他们实际上不需要知道请求来自哪里。谷歌只需告诉浏览器允许请求来自何处,用户的浏览器就可以决定是否将请求发送给谷歌。