为什么 HTML DOM 和/或 Javascript 的创建者决定禁止跨域请求?
我可以看到禁止它的一些非常小的安全性好处,但从长远来看,它似乎是试图使 Javascript 注入攻击的力量更小。无论如何,这对于 JSONP 来说都是没有意义的,它只是意味着 javascript 代码有点难以制作,并且您必须进行服务器端合作(尽管它可能是您自己的服务器)
为什么 HTML DOM 和/或 Javascript 的创建者决定禁止跨域请求?
我可以看到禁止它的一些非常小的安全性好处,但从长远来看,它似乎是试图使 Javascript 注入攻击的力量更小。无论如何,这对于 JSONP 来说都是没有意义的,它只是意味着 javascript 代码有点难以制作,并且您必须进行服务器端合作(尽管它可能是您自己的服务器)
实际的跨域问题是巨大的。假设 SuperBank.com 内部发送请求将http://www.superbank.com/transfer?amount=100&to=123456
10,000 美元转移到帐号 123456。如果我可以让您访问我的网站,并且您已登录 SuperBank,我所要做的就是向 SuperBank.com 发送 AJAX 请求以移动几千美元从你的账户到我的。
JSON-P 可以接受的原因是它几乎不可能被滥用。使用 JSON-P 的网站几乎将数据声明为公共信息,因为这种格式太不方便,无法以其他方式使用。但是如果不清楚数据是否是公共信息,浏览器必须假定它不是。
当允许跨域脚本(或被聪明的 Javascripter 破解)时,一个网页可以访问另一个网页的数据。示例:当您打开 mail.google.com 时,joeblow.com 可以访问您的 Gmail。joeblow.com 可以读取您的电子邮件、向您的联系人发送垃圾邮件、欺骗您的邮件、删除您的邮件或任何数量的坏事。
将问题中的一些想法澄清到特定的用例中。
跨域策略通常不是为了保护您自己。它是为了保护您网站的用户免受您网站的其他用户的侵害(XSS)。
想象一下,您有一个网站,允许人们输入他们想要的任何文本,包括 javascript。一些恶意用户决定在“关于你自己”字段中添加一些 javascript。您网站的用户将浏览他的个人资料并在他们的浏览器上执行此脚本。这个脚本,因为它是代表您的网站执行的,所以可以从您的网站访问 cookie 等。
如果浏览器允许跨域通信,则此脚本理论上可以收集您的信息,然后将其上传到恶意用户拥有的服务器。
这是给你的一个区别:跨域 AJAX 允许恶意站点让你的浏览器代表它做事,而 JSON-P 允许恶意服务器篡改单个域的页面(并使浏览器对那个域做事代表您)但(至关重要的一点)仅当所服务的页面不顾一切地加载恶意有效负载时。
所以是的,JSON-P 有一些安全隐患,但它们在使用它们的网站上是严格选择加入的。允许一般的跨域 AJAX 会打开一个更大的蠕虫罐。