Javascript 为什么跨域AJAX请求被标记为;安全风险“;?

Javascript 为什么跨域AJAX请求被标记为;安全风险“;?,javascript,ajax,json,cross-domain,xss,Javascript,Ajax,Json,Cross Domain,Xss,默认情况下,浏览器不允许跨站点AJAX请求 我知道,一个设想不周的跨域请求可能会带来安全风险。如果我使用外部站点的html或javascript并将其“呈现”到我的网站中,那就是一个问题。这些外部代码可能被用于很多不好的事情,比如访问当前用户的会话数据 但是如果我只请求JSON或XML数据,并且使用适当的库来解析JSON(而不仅仅是使用eval),我无法想象这会有多大的安全风险。更糟糕的是,来自该站点的内容无法正确呈现 我遗漏了什么吗?仅仅通过发送某种恶意数据就可以破坏读取json/xml的页面

默认情况下,浏览器不允许跨站点AJAX请求

我知道,一个设想不周的跨域请求可能会带来安全风险。如果我使用外部站点的html或javascript并将其“呈现”到我的网站中,那就是一个问题。这些外部代码可能被用于很多不好的事情,比如访问当前用户的会话数据

但是如果我只请求JSON或XML数据,并且使用适当的库来解析JSON(而不仅仅是使用eval),我无法想象这会有多大的安全风险。更糟糕的是,来自该站点的内容无法正确呈现


我遗漏了什么吗?仅仅通过发送某种恶意数据就可以破坏读取json/xml的页面吗?

风险不在于发出请求的站点

例如:

  • 艾丽斯访问她的银行并登录
  • 然后她访问邪恶的网站
  • 邪恶网站使用JavaScript使Alice的浏览器向她的银行发出请求
  • 她的银行会回复Alice的账户详细信息,并将其传递给JavaScript
  • JavaScript然后将它们传递给邪恶站点的控制器
  • 简言之,它可以防止攻击者从Alice拥有凭据的任何站点(以及防火墙后面的站点,例如Alice的企业内部网)读取私有数据


    请注意,这不会阻止不依赖于能够从站点读取数据的攻击(),但如果没有同源策略,那么针对CSRF的标准防御将很容易被击败。

    关于JSON/XML的第二点,您完全正确。当采取适当的预防措施时,从另一个域接收JSON是没有风险的。即使服务器决定返回一些讨厌的脚本,您也可以通过正确的数据解析有效地管理风险。事实上,这正是JSONP黑客如此流行的原因(参见twitter的搜索api示例)


    我们已经看到支持HTML5的浏览器为跨域通信引入了新的对象和标准(postMessage-和跨源资源共享-)。

    默认情况下,浏览器不允许跨站点请求。
    这句话需要润色一下。你是说XHR吗?你是说饼干吗?因为在一般情况下,浏览器允许跨域请求:只需使用指向远程域的锚或表单就足够了,当用户单击此链接时,跨域请求将毫无问题地执行。和@DarinDimitrov的可能重复项您是对的。我改了短语。@Gumbo是的,我的问题似乎重复了。在询问之前,我搜索了一会儿,但没有找到。但是“正确的json和xml解析”部分是不同的,你错了。这不受同源策略的保护。@Gumbo-我在示例中发现了该漏洞,并在您发表评论时进行了编辑。嗯。如果我理解正确,您的意思是用户会话在浏览器中共享?我的印象是,服务器能够区分不同打开的窗口/选项卡。“嘿,这个请求来自另一个窗口,返回未经授权的响应代码”——诸如此类。不是这样吗?@kikito-不是这样的。如果你打开了一个新的标签,你就没有注销,如果仅仅因为你想在一个站点上有两个标签就不得不再次登录,那将是一件烦人的事情。即使不是这样,你也可能在访问银行后访问邪恶网站,并使用相同的选项卡。好的。我想我现在明白了。谢谢你的澄清。我现在更尊重网络安全人员了。这很难。我更希望这类事情的处理方式与浏览器请求访问麦克风、地理位置数据或网络摄像头的方式相同。只需在浏览器窗口顶部显示一个栏,请求获得example.com页面访问data.example.com或mybank.com数据的权限。如果使用CORS或JSONP,则不会显示该条。如果您没有,那么您将获得权限栏。