澄清“跨域Ajax”安全问题

时间:2014-02-16 01:06:33

标签: javascript ajax javascript-security

假设我们允许跨域Ajax请求。

代码看起来像这样:

  $.post('http://google.com/get/emails/all', function(emails){
          // I can see your emails
          readAllEmails(emails);
    });

此次通话存在哪些安全隐患,mail.google.com不会拒绝该请求,这将是它的结束?

修改 澄清上面的问题。

在上面的方案中,cookie被发送到mail.google.com。是您浏览器当前存储的所有cookie还是域cookie?如果它的所有cookie,那么我理解为什么跨域ajax调用是一个问题。但是,如果是这种情况,我不明白为什么浏览器会发送所有cookie,有什么好处?

2 个答案:

答案 0 :(得分:3)

由于浏览器中的同源策略,默认情况下拒绝跨域AJAX调用。这意味着从执行JavaScript的yourdomain.com加载的网页无法向mail.google.comyourdomain.com之外的其他域发出AJAX调用。

Modern browsers允许通过Cross Origin Resource Sharing(CORS)对其他域进行有限的AJAX调用。这允许像www.publicapi.com这样的其他网站通过为允许的域和方法指定Access-Control-标头来授权跨AJAX的跨域请求。这些CORS请求在受限访问上下文中运行,不会获取/设置www.pulicapi.com或HTTP授权的cookie。

某些浏览器允许通过Access-Control-Allow-Credentials标头启用Cookie /授权,但这对大多数应用程序都很危险。

特别是,如果yourdomain.com上的HTML尝试通过AJAX访问mail.google.com,则会失败。如果mail.google.com为某些API启用了CORS访问,则可以读取公共数据,但不能通过cookie或HTTP身份验证进行身份验证。如果mail.google.com设置Access-Control-Allow-Credentials标题,您的浏览器支持它,并且您在mail.google.com上有预先存在的会话,则可以将您的AJAX请求作为登录用户。

这对Google Mail来说是一个主要的安全风险,并且永远不会启用。但是,对于公共API或本质上公共数据,CORS可以跨域使用AJAX。

答案 1 :(得分:1)

  

是您浏览器当前存储或存在的所有Cookie   只是域名cookie?

只是域名。发送所有域名cookie将是一场灾难。

无论如何,我认为这是同一主题:

Why the cross-domain Ajax is a security concern?