【问题标题】:golang http allow certain domain name both with www and withoutgolang http 允许带有 www 和不带 www 的某些域名
【发布时间】:2018-04-28 03:23:09
【问题描述】:

我正在编写一个 golang api。我对 cors 使用以下函数

func ResponseWithJSON(w http.ResponseWriter, json []byte, code int) {
    w.Header().Set("Content-Type", "application/json; charset=utf-8")
    w.Header().Set("Access-Control-Allow-Origin", "*")
    w.WriteHeader(code)
    w.Write(json)
}

这使任何人都可以访问我的 api。我想将其限制为我的域名。因为这听起来更安全。让我们称之为 www.example.com

我可以改成

 w.Header().Set("Access-Control-Allow-Origin", "http://www.example.com")

这将允许我在 url 是 www.example.com 而不是 example.com 时拨打电话

然后我可以将其更改为

w.Header().Set("Access-Control-Allow-Origin", "http://example.com")

现在我可以从 example.com 访问我的 api,但不能从 www.example.com 访问

两者都添加不起作用 也不这样

w.Header().Set("Access-Control-Allow-Origin", "http://www.example.com,http://example.com")

也不这样

w.Header().Set("Access-Control-Allow-Origin", "http://www.example.com")
w.Header().Set("Access-Control-Allow-Origin", "http://example.com")

那么,有没有办法让我获得请求的来源?所以我可以动态地允许域?我还有其他方法可以解决这个问题吗?

【问题讨论】:

  • 检查请求host标头并提供相应的响应。
  • 我该怎么做?你有例子吗?
  • FWIW,多次设置相同的标头不适用于Header.Set(),因为它会替换任何以前设置的值。而是使用Header.Add()
  • 显然“逗号分隔和空格分隔的域都不起作用。匹配域列表并将单个主机放在标头中仍然具有更好的安全性并且可以正常工作。所以回到@zerkms cmets。见here

标签: http go cors


【解决方案1】:

我发现 Origin 信息在 http.Request 对象中。您可以使用

获取原点
origin := r.Header.Get("Origin");

假设你有一个类似的对象

r *http.Request

如果对象来自 example.com,它将返回 example.com,同样返回 www.example.com。然后,您可以测试它是否是这两个值之一作为身份验证的方式。

【讨论】:

    【解决方案2】:

    Access-Control-Allow-Origin 标头仅支持单个值,因此您必须检查 Host 请求标头,然后根据该标头做出决定:

    package main
    
    import "net/http"
    
    func myHandler(w http.ResponseWriter, r *http.Request) {
        switch host := r.Header.Get("Host"); host {
        case "www.example.com", "example.com":
                w.Header().Set("Access-Control-Allow-Origin", "http://"+host)
        }
    }
    

    并不是说 Host 标头有时会被代理服务器更改。然后,他们通常会添加 X-Forwarded-Host 标头或类似标头。但是,仅在您信任代理的情况下进行检查(以及如何建立这种信任是另一个问题)。

    【讨论】:

    • 这是 r.Header.Get("Origin") 不是主机
    • 这些标题有不同的用途。有关 Host 标头的说明,请参阅 RFC7230
    • 我刚刚测试了一下,Host返回一个空字符串,origin返回我要求的,origin...
    • Host 是请求被发送到的域,所以我认为不应该在Access-Control-Allow-Origin 中设置它。 “Origin”是正确的,我们也可以省略http://
    猜你喜欢
    • 2020-06-27
    • 2013-07-19
    • 2021-07-27
    • 2011-04-08
    • 1970-01-01
    • 2018-04-24
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    相关资源
    最近更新 更多