如果我构建了一个 SSL 的 API,它使用 cookie 中保存的会话 ID 进行身份验证,添加一个随机数作为查询参数,并始终以 JSON“对象”响应进行响应(而不是带有回调的 JSONP 样式响应) ,一般来说它是否安全,特别是针对 XSRF?
使用此类 API 的目的是使其仅可用于我自己域中的页面,并且可以通过此 API 自由公开私人数据(例如用户名和电子邮件)(但不能被其他域使用)——并保留为团队中的开发人员提供合理的简单性。
让我至少分享一下我对这种方法的理解,以及为什么我认为它是安全的。如有错误请指教!:
- 放置在我们网站的第 3 方域上的
<script>
标签会发送我的 cookie,但无法解析 JSON 对象响应(并且响应总是故意是顶层的 JSON 对象)。此外,我需要确保影响服务器上状态的 API 调用都受到非 GET 方法访问的保护,因为<script>
标签必须使用 GET,因此不能通过尝试调用改变状态的调用而导致破坏(换句话说,就 HTTP 方法而言,API 将遵循 REST)。另外,我故意不支持 JSONP,因为它会是一个安全漏洞。 - 用于劫持 cookie(会话)的中间人不是问题,因为我使用的是带有有效证书的 SSL。
- 重放攻击是一个暂时受限的问题,因为使用 nonce 将限制一个 HTTPS 请求的重放可以发送多长时间,因为服务器将确保 API 调用仅在一小段时间内有效。典型的随机数验证方式。
- XMLHttpRequest 不能进行跨域调用,所以它不能从我的站点请求任何东西。
- CORS(跨域资源共享)并不重要,因为我没有 crossdomain.xml 文件或任何其他与 HTML 5 相关的跨域支持广告。
- 3rd-party 站点中的 iframe 无关紧要,因为即使它可以以图形方式加载我的页面,主机站点也无法访问该 iframe 中的任何数据,并且因为我没有尝试支持跨域 iframe 通信(所以他们可以尝试像人们一样在 iframe URL 上设置 # 以启用跨域 iframe 之间的通信,但我的页面不会响应它)。
编辑:<script>
正如 russau 所说
,nonce 甚至可以防止跨域 GET 请求(即标签)。在具体考虑这一点时,我喜欢在“POST”API 调用中请求一个本身不受 nonce 保护的 nonce 的想法;应该是只有同一域上的 XmlHTTPRequest 才能生成一个随机数开始。这似乎是一种使 nonce 的生成对开发人员友好的简单方法。(即,对于网站/javascript 开发人员来说,没有任何服务器端 - 只需从您用于开发的同一 API 中请求您的 nonce,并使用该 nonce 发出请求,直到您收到“bad nonce”响应 - 然后询问换一个新的,然后重复。