【问题标题】:Cross Origin Resource Sharing with Credentials使用凭证进行跨域资源共享
【发布时间】:2011-12-25 20:33:19
【问题描述】:

我有一个跨多个子域(example.com、blog.example.com 和 app.example.com)的通用身份验证表单。登录表单必须将此数据提交到 example.com,无论它显示在哪里,所以我想到了使用 CORS,但是这样:

header("Access-Control-Allow-Origin: http://example.com http://blog.example.com http://app.example.com")

does not work

所以我想做下一件事,在服务器端手动检查 Origin 标头,并允许Access-Control-Allow-Origin: * 以便可以发出请求,但不幸的是,这突然出现了in the MDN

重要提示:在响应凭据请求时,服务器必须指定域,并且不能使用通配符。

有什么方法可以让我的请求跨多个域工作,并且仍然使用 CORS 发送凭据?

【问题讨论】:

  • 我相信你也可以在域名之间加上逗号。 (也就是说,是的,你可以让它跨多个域工作。)
  • 我不这么认为。从规范中: >在实践中,origin-list-or-null 生产受到更多限制。它不允许使用空格分隔的来源列表,而是单个来源或字符串“null”。 source

标签: http cors


【解决方案1】:
// cross domain
header("Access-Control-Allow-Origin: ".$_SERVER['HTTP_ORIGIN']);
header('Access-Control-Allow-Credentials: true');

【讨论】:

  • 在没有严格验证 Origin 标头的情况下不要这样做,否则会打开安全漏洞
  • 这个答案说明了为什么不可能拥有万无一失的安全性——甚至是彩色的! >.
  • OK 看来这“本质上”与执行“*”相同,可能会打开微妙的安全漏洞,因此不鼓励,请参阅stackoverflow.com/questions/12001269/…
  • 为什么不这样做:blog.portswigger.net/2016/10/…
【解决方案2】:

两个想法:

1) 您是否还包括“Access-Control-Allow-Credentials: true”标头?这是传递 cookie 凭据所必需的(并且相应的 XHR 客户端必须设置 .withCredentials = true)

2) 您是否尝试过链接中的建议,并且仅包含当前请求的来源。例如,如果请求带有标头“Origin:http://blog.example.com”,您将响应“Access-Control-Allow-Origin:http://blog.example.com”,而不是来源列表。这需要在您的服务器端实现上做更多的工作。

3) 另一种想法是,您提到您有一个必须由各个域共享的登录表单。好吧,如果它是一个标准的 HTML 表单,您可以跨域进行常规的表单发布。您不需要使用 CORS。只需将表单的“action”属性设置为您希望发布到的 url。例如:

<form name="login" action="http://login.example.com/doLogin">

【讨论】:

  • 我最终使用了 (2)。不知何故,我忽略了单一来源方法。
猜你喜欢
  • 2011-03-25
  • 2013-11-24
  • 2016-03-08
  • 2011-05-07
  • 2012-07-12
  • 2011-03-27
  • 2017-10-06
  • 2017-03-06
相关资源
最近更新 更多