【问题标题】:Golang Reverse Proxy to avoid SOPGolang 反向代理避免 SOP
【发布时间】:2024-01-21 08:02:01
【问题描述】:

我目前正在开发一个 Web 应用程序(在 golang 中),它将用作其他内部应用程序(在 docker 容器中运行)的主要门户。这个 Web 应用程序应该简单地提供一个 HTML 页面,其中导航栏位于顶部,页面的其余部分将是一个 IFrame。在导航栏上,我们有多个链接,它们将更改 IFrame 的来源。重要的是要知道导航栏上的链接是动态创建的。

我很快就遇到了 Iframe 无法显示其他内部应用程序的问题,因为 Same-Origin-Policy 会阻止所有内容。为了解决这个问题,我认为在 golang 中实现我自己的反向代理可能是个好主意。

package main

import (
    "fmt"
    "net/http"
    "net/http/httputil"
    "net/url"
)

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, "<html><body><iframe src=\"/\" width=\"100%\" height=\"100%\"/></body></html>")
}

func proxyHandle(r *http.Request) {
    r.Host = "google.com"
    r.URL.Host = r.Host
    r.URL.Scheme = "http"
}

func main() {
    proxy := httputil.NewSingleHostReverseProxy(&url.URL{
        Scheme: "http",
        Host:   "google.com",
    })
    proxy.Director = proxyHandle

    http.Handle("/", proxy)
    http.HandleFunc("/index", handler)
    http.ListenAndServe(":8080", nil)
}

我仍然收到 SOP 错误消息。我现在基本上有两个问题:

  • 这是正确的方法吗?还是有更好的方法来做到这一点?
  • 我不明白这里发生了什么。在我看来,请求将被发送到我的应用程序,然后 HTML 将在响应中。浏览器注意到 iframe 并请求“/”。这个 GET 请求到达我的应用程序,然后应该转发到 google.com。响应应该返回到我的应用程序,然后从我的应用程序返回到客户端。这是正确的吗?

【问题讨论】:

    标签: http iframe go reverse-proxy same-origin-policy


    【解决方案1】:

    在对fiddler 进行一些调查后,我发现指定的地址 (http://google.com) 发送了一个重定向响应。交易基本上是这样的:

    客户端 -> MyProxy -> 真实网站

    客户端https://www.google.com

    客户端 -> https://www.google.com

    因此,客户端尝试在与同源策略冲突的 IFrame 中打开“https://www.google.com”。经过一番研究,我找到了this github issue。似乎golang反向代理没有转换“位置”-Header(这是一个重定向)。

    我现在可以重写 Location-Header,但我决定使用现有的反向代理 (nginx)。

    【讨论】: