浏览器是否允许“发送”跨域请求?

时间:2016-10-25 11:14:00

标签: ajax security post csrf same-origin-policy

我是网站安全的新手,目前正在尝试深入了解Same-Origin-Policy。 虽然在stackoverflow和其他地方有关于SOP概念的非常好的帖子,但我找不到关于Chrome和其他浏览器是否允许跨域XHR帖子请求“已发送<更新的信息/ strong>'从第一位开始。

来自this 5年前的帖子,看来chrome允许请求传递到请求的服务器,但不允许请求者读取响应。

我在我的网站上测试过,尝试从不同的域更改我的服务器上的用户信息。详情如下:

  1. 我的域名:“www.mysite.com”
  2. 攻击者域名:“www.attacker.mysite.com” 根据同源政策,这两者被认为是不同的起源。
  3. 用户(登录www.mysite.com时)打开www.attacker.mysite.com并按下一个按钮,向“www.mysite.com”服务器发出POST请求...提交的隐藏表单(在这种情况下没有令牌)具有在'www.mysite.com'服务器上更改用户信息的所有必需信息 - &gt;结果:CSRF成功攻击:用户信息确实发生了变化。

  4. 现在做同样的事情但是javascript通过JQuery .post提交表单而不是提交表单 - &gt;结果:除了铬提供正常响应:

  5.   

    请求时没有'Access-Control-Allow-Origin'标头   资源

    ,我发现在服务器端没有进行任何更改......似乎请求甚至没有从浏览器传递。用户信息根本不会改变!虽然这听起来不错,但我还是期待相反的事情。

    根据我的理解和上面链接的帖子,对于跨域请求,浏览器只应阻止服务器响应,而不是从一开始就向服务器发送post请求。 另外,我没有任何CORS配置集;没有发送Access-Control-Allow-Origin headers。但即使我有这个设置,这应该只适用于“读取”服务器响应而不是实际发送请求......对吗?

    我想到了预检,其中发送请求以检查服务器是否允许它,从而在发送其实际数据以更改用户信息之前阻止请求。但是,根据Access_Control_CORS,这些预检仅在特定情况下发送,这些情况不适用于我的简单AJAX发布请求(其中包含默认情况下带有enctype的简单表单application/x-www-form-urlencoded并且不会发送自定义标头)

    因此,chrome已经更改了其安全规范,以防止从第一个位置发送到跨域的请求? 或者我在对同源政策的理解中遗漏了什么?

    无论哪种方式,了解在不同的Web浏览器中是否存在更新的安全措施的来源将会很有帮助。

2 个答案:

答案 0 :(得分:2)

XMLHttpRequest对象行为已经随着时间重新审视。

第一个AJAX请求不受约束 引入SOP时,XMLHttpRequest已更新,以限制每个跨源请求

  
      
  1. 如果url的来源与XMLHttpRequest源不同,则用户代理应引发SECURITY_ERR异常并终止这些步骤。
  2.   

来自XMLHttpRequest Level 1open方法

这个想法是,一个无法读取响应的AJAX请求是无用的,可能是恶意的,所以它们是被禁止的。
因此,一般来说,跨源AJAX调用永远不会进入服务器。 此API现在称为 XMLHttpRequest Level 1

事实证明,在开发CORS之前,SOP通常过于严格,微软开始提供(并试图标准化)一个新的XMLHttpRequest2 API,它只允许一些特定的请求,被任何cookie和大多数标题。

标准化失败,并在CORS出现后合并回XMLHttpRequest API。 Microsoft API的行为大多保留,但在服务器的特定限额(通过使用飞行前)允许更复杂(读取:潜在危险)请求。

non simple headers or Content-Type POST 请求被认为很复杂,因此需要预先安排。

使用 OPTIONS 方法完成预飞行,并且不包含任何表单信息,因此服务器上没有更新。
当飞行前失败时,用户代理(浏览器)终止AJAX请求,保留XMLHttpRequest Level 1行为。

简而言之:对于XMLHttpRequest,尽管SOP原则规定了目标,SOP仍然更强,否认任何跨行动。这是可能的,因为当时并没有破坏任何东西 CORS放宽了允许“无害”的政策。默认情况下请求并允许其他人协商。

答案 1 :(得分:1)

好的......我明白了......它既不是新的政策,也不是缺少SOP的东西...... &#34; www.mysite.com&#34;的会话cookie被设定为&#34; HttpOnly&#34;这意味着,正如here所述,他们不会与AJAX请求一起发送,因此服务器不会在第(4)点更改用户的详细信息。

在我的帖子请求中添加了xhrFields: { withCredentials:true }后,我就能够按照预期更改跨域XHR POST调用中的用户信息。

虽然这证明了已知的事实,即浏览器实际上将跨域发布请求发送到服务器并且仅阻止服务器响应,但对于那些试图加深对SOP的理解和/或玩游戏的人来说,它可能仍然有用。 CORS。