【问题标题】:CORS - How can the server know if Jquery ajax's "withCredentials : true" was used?CORS - 服务器如何知道是否使用了 Jquery ajax 的“withCredentials:true”?
【发布时间】:2016-08-27 19:03:43
【问题描述】:

我正在一个框架中实现 CORS(跨域资源共享)。

我知道,当使用 Jquery 的 ajax(...) 发出 XMLHttpRequest 请求并且 withCredentials 属性为 true 时,服务器必须响应这两件事:

  • Access-Control-Allow-Credentials: true
  • Access-Control-Allow-Origin:[THE_DOMAIN]

服务器不能使用通配符响应Access-Control-Allow-Origin:*doesn't work

我的问题:我怎么知道在服务器上withCredentials: true 已被使用,所以我不使用通配符?

我比较了使用withCredentials: falsewithCredentials: true 时发送的标头,它们是相同的!

所以,如果我确实想在客户端请求时允许凭据,这是否意味着我不能,永远,使用Access-Control-Allow-Origin:*

【问题讨论】:

  • 如果 withCredentials 设置为 true,您还应该收到在源域上设置的任何 cookie,我不确定这对于初始请求是否为 true,或者仅在服务器响应之后Access-Control-Allow-Credentials: true(我可以想象这两种情况都是正确的,尽管我认为后者是最合理的)。至于通配符,我倾向于始终指定允许的域(来自原始标头)。 this answer might help.
  • @RogierSpieker 当使用withCredentials: true 进行查询但没有任何cookie 时,使用通配符也会失败。我不认为在客户端使用withCredentials: true 时强制客户端发送cookie 是可取的……你不知道他的代码逻辑。所以你不能真的依赖cookie的存在,我认为。感谢您的帮助!
  • 我并不是在暗示应该强制设置 cookie,只是如果设置了withCredentials: true 就会发生这种情况。在这种情况下,cookie 的存在将表明 withCredentialstrue

标签: javascript jquery ajax cors


【解决方案1】:

所以,如果我确实想在客户端请求时允许凭据,这是否意味着我永远不能使用 Access-Control-Allow-Origin:*?

是的。

Access-Control-Allow-Origin:* 的意义在于,它可以让您毫不费力地授予对每个网站的访问权限。它可以让您说“这些数据是公开的,任何人都可以访问它”。

如果您需要凭据才能访问资源,那么说“此数据是公开的,任何人都可以访问它”是没有意义的。

如果您要授予对每个网站的访问权限,那么登录到您网站的人访问的每个网站都可以从中读取数据(有效地将其公开)。

因此,您需要有一个允许访问数据的受信任站点的白名单,然后在明确授予访问权限之前检查 Origin 标头。

【讨论】:

  • 我猜你是对的!但是我仍然不确定为什么有人会想要使用通配符版本!我的意思是,您只需将请求的Origin 标头复制到响应的Access-Control-Allow-Origin 标头,这也“授予非常网站”并且您还允许这样做的凭据...通配符版本还有其他内容吗允许在使用“标题副本”技巧时丢失?
  • 您可以在服务器配置中将带有静态值的标头与一行代码粘贴在一起。动态回显 Origin 标头更费力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-21
  • 1970-01-01
  • 1970-01-01
  • 2020-02-12
  • 1970-01-01
  • 1970-01-01
  • 2018-01-31
相关资源
最近更新 更多