我正在开发JSON / REST Web API,为此,我特别希望第三方网站能够通过AJAX调用我的服务。因此,我的服务正在发送著名的CORS标头:
Access-Control-Allow-Origin: *
允许第三方站点通过AJAX调用我的服务。到目前为止一切都很好。
但是,我的Web api的一个子部分是非公开的,需要身份验证(带有OAuth和access_token cookie的相当标准的东西)。在我网站的此部分也启用CORS是否安全?
一方面,如果第三方网站可以具有也与我的服务的这一部分进行交互的ajax客户端,那将很酷。但是,首先要有一个相同的原产地政策的原因是这样做可能有风险。您不希望以后访问的任何网站都能够访问您的私人内容。
我担心的情况是,用户通过网站或他信任的网站登录我的Web api,却忘记了注销。这是否将允许他随后访问的其他所有网站使用现有会话访问其私人内容?
所以我的问题是:
在回答第二个问题时(如果启用了CORS的服务器通过cookie设置了session_token …?),该cookie将保存在CORS服务器的域下。网页的JS代码即使通过也无法访问cookie document.cookie。cookie仅在.withCredentials设置了属性时才发送到服务器,即使那样,它也只有在服务器设置Access- Control-Allow-Credentials标头时才被接受。
document.cookie
.withCredentials
Access- Control-Allow-Credentials
您的第一个问题是更多开放的话题。它是相当安全的,但是有一些规避事物的方法。例如,攻击者可能使用DNS中毒技术,使预检请求命中实际服务器,但将实际CORS请求发送到恶意服务器。以下是有关CORS安全性的更多资源:
最后,您担心的是允许 任何 网站访问您的CORS数据。为了防止这种情况,您不应使用Access-Control-Allow-Origin: *标题。而是应回显用户的Origin值。例如:
Access-Control-Allow-Origin: http://www.example.com
此标头将仅允许http://www.example.com访问响应数据。
http://www.example.com