Golang反向代理以避免SOP

时间:2016-07-09 12:48:52

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

我目前正在开发一个Web应用程序(在golang中),它将用作其他内部应用程序的主要门户(在docker容器中运行)。此Web应用程序应该只提供一个HTML页面,其中导航栏位于顶部,页面的其余部分将是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-Request到达我的申请,然后应转发给google.com。响应应该返回到我的应用程序,然后从我的应用程序返回到客户端。这是对的吗?

1 个答案:

答案 0 :(得分:0)

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

客户 - &gt; MyProxy - &gt; RealWebsite

客户&lt; - Myproxy&lt; - RealWebsite:位置https://www.google.com

客户 - &gt; https://www.google.com

因此,客户试图打开&#34; https://www.google.com&#34;在与同源政策发生冲突的IFrame中。经过一些研究,我发现了this github issue。似乎golang反向代理不会转换&#34;位置&#34; -Header(这是一个重定向)。

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