何时启用CORS是安全的?

Jer*_*oen 68 security ajax web-services cross-domain cors

我正在开发一个JSON/REST Web API,我特别希望第三方网站能够通过AJAX调用我的服务.因此,我的服务是发送着名的CORS标题:

Access-Control-Allow-Origin: *
Run Code Online (Sandbox Code Playgroud)

这允许第三方站点通过AJAX调用我的服务.到目前为止都很好.

但是,我的web api的一个子部分是非公开的,需要身份验证(OAuth和access_token cookie非常标准).在我的网站的这一部分启用CORS是否安全?

一方面,如果第三方网站可以拥有也与我的这部分服务进行交互的ajax客户端,那将会很酷.但是,首先存在相同原产地政策的原因是这可能存在风险.您不希望之后访问的任何网站能够访问您的私人内容.

我担心的情况是用户登录我的网络API,无论是在网站上还是通过他信任的网站,他忘记退出.这会允许他之后使用现有会话访问其私人内容吗?

所以我的问题:

  • 在非公开内容上启用CORS是否安全?
  • 如果启用CORS的服务器通过cookie设置session_token,该cookie是否会保存在CORS服务器或主网页服务器的域下?

mon*_*sur 44

在回答第二个问题时(如果启用CORS的服务器通过cookie设置session_token ......?),cookie将保存在CORS服务器的域下.主网页的JS代码无法访问cookie,即使是通过document.cookie.仅在设置.withCredentials属性时才将cookie发送到服务器,即使这样,只有在服务器设置Access-Control-Allow-Credentials标头时才接受cookie .

你的第一个问题是更开放的问题.这是相当安全的,但有办法绕过事情.例如,攻击者可以使用DNS中毒技术导致预检请求到达实际服务器,但是将实际的CORS请求发送到流氓服务器.以下是有关CORS安全性的更多资源:

最后,您关注的是让任何网站都能访问您的CORS数据.为了防止这种情况,您不应使用Access-Control-Allow-Origin: *标题.相反,您应该回显用户的Origin值.例如:

Access-Control-Allow-Origin: http://www.example.com
Run Code Online (Sandbox Code Playgroud)

此标头仅允许http://www.example.com访问响应数据.

  • 是的,保持可接受来源的白名单是一种解决方案.另一种方法是将用户会话ID绑定到特定的源.这样,如果不同的来源以某种方式用用户的凭证重放请求,它将失败. (5认同)
  • 你能澄清一下回应'origin'标题如何增加安全性吗?我认为任何恶意网站/脚本都可以轻松设置此标题?或者你的意思是保持某种白名单? (3认同)
  • 如果GET包含非简单请求标头,则可以预检. (3认同)

Gum*_*mbo 23

CORS的目的是允许对XHR请求的跨源请求,同时赋予服务器指定哪个源可以访问哪个资源的权限.特别是,CORS引入了Origin头字段,允许服务器区分常规和可能的XHR请求.用户不能设置或更改此标头字段,但是浏览器会为XHR请求设置此标头字段.

因此,如果您有一个仅供XHR使用的API,您可以(并且应该)要求请求符合CORS.特别是如果请求也可以修改服务器上的状态,否则您将容易受到CSRF的攻击.

请注意,无论CORS使用其他方法伪造GET和POST请求,都可以进行CSRF攻击.如果服务器允许,CORS仅允许使用JavaScript访问服务器对XHR请求的响应.