8

据我了解,CORS 无法以您可以真正确定来电者是谁的方式准确地保护您。因为调用者可以发送他想要的任何 ORIGIN 标头。实际上,我在某处读到您无法通过 javascript 设置原始标头,因为它是受限制的标头 - 但我不太确定。无论如何..如果您要实现自己的 HttpClient ,您可以轻松伪造您的原始标头,从而使用您不应该使用的服务。

其次,如果没有指定 Origin 标头,则请求也可以正常工作。例如,我使用 Google Chrome 的 Postman Extension,它不发送任何原始标头。事实上,如果您尝试手动添加一个,它不会通过网络发送。

所以...

  • ...问题 1是:我的应用程序是否应该拒绝没有任何 Origin 标头的请求?和...
  • ...问题 2:究竟如何使 CORS 我的 REST 服务更安全?

  • 4

    2 回答 2

    5

    有支持 CORS 和不支持 CORS 的浏览器。(我们处于 CORS 的早期阶段,CORS 规范跨浏览器的实现并不一致)。

    • 不支持 CORS 意味着当浏览器检测到跨域请求时,请求被阻塞,不会发送到服务器。
    • 支持 CORS 意味着浏览器应用 CORS 策略:在向服务器发送请求之前附加 Origin 标头,在收到响应后,浏览器检查 Access-Control-Allow-Origin 决定是否丢弃响应。

    同源策略旨在降低 XSS 攻击的风险,这种攻击主要发生在浏览器上,不太可能发生在 HttpClient 中。CORS 政策旨在放宽同源政策,以便如果您是两个站点的所有者,则可以利用此政策来允许您的 2 个站点之间进行通信。

     提示 支持CORS意味着浏览器在联系到服务器并获得响应头后必须应用跨域安全策略,这意味着即使响应因缺少或指定所需的头而被丢弃,也会发出请求不同的域。这是一种与没有实现 CORS 的浏览器非常不同的方法,浏览器只是阻止请求,从不联系服务器。

    摘自本书

    于 2013-02-16T11:36:49.690 回答
    4

    CORS 的目的是防止(或允许)在不同域上运行的 Javascript 向您的 API 发送 AJAX 请求并使用用户经过身份验证的会话 cookie。

    CORS不能代替正确的身份验证;所做的一切就是防止浏览器充当对您现有身份验证方案的混淆代理。

    于 2013-02-15T16:23:33.010 回答