proxy简单的代理服务器

前端之家收集整理的这篇文章主要介绍了proxy简单的代理服务器前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

proxy

proxy,既是代理服务器,在网络环境中,两台机器无法直接相连,如google,facebook等,在国内环境中无法直接访问,为了使用google和facebook,则需要FQ,跨过长城防火墙。在FQ过程中,一个重要的环节,就是proxy了。经常听到有人说通过代理上网,现在就来揭示一下proxy的过程,看完这个后,我猜,以后大家用代理服务器,都会更加的谨慎了,不会再盲目的觉得什么东西好,什么东西不好。

简单的http转发模式

客户端A想要访问目标服务器B,但是由于某些限制,A在通往B的过程中,由于是走的官道,被道路检查小队给逮住了,直接就地正法了。那么A就无法再官道中走到B。现在有一条小路Proxy,A在Proxy的小路上,一路坎坷,东躲西藏的来到了B,这样A和B就联系上了。在这个环节中,Proxy就获取了A和B互相联系的信息。那么问题就来了。如果Proxy是一个邪恶的摆渡者,那么对于A来说,将会是致命的打击。

session劫持

经常听过一些人说,我在输入密码的时候,又没有人看见,怎么我的密码就被别人知道了。有些时候,并不是密码泄露了,而是登录后session被他人获取,这样他人就可以直接使用你的账号登录到系统中,即使他不知道你的密码,是不是很可怕?

proxy示例代码

package main

import (
    "crypto/tls"
    "flag"
    "fmt"
    "io/IoUtil"
    "net/http"
    "net/http/cookiejar"
    "strings"
)

var (
    Target   = flag.String("target","https://www.asofdate.com","target server")
    Protocol = flag.String("protocol","https","http or https protocol")
)

func sliceToString(str []string) string {
    result := ""
    for _,val := range str {
        result += val + " "
    }
    result = strings.TrimSpace(result)
    return result
}

func NewReq(sr *http.Request) (*http.Request,error) {
    sr.ParseForm()
    url := *Target + sr.RequestURI
    req,_ := http.NewRequest(sr.Method,url,strings.NewReader(sr.Form.Encode()))
    req.Form = sr.Form
    req.Header = sr.Header
    req.TLS = sr.TLS
    req.TransferEncoding = sr.TransferEncoding
    req.Trailer = sr.Trailer

    return req,nil
}

func main() {
    flag.Parse()
    tr := &http.Transport{
        TLSClientConfig:    &tls.Config{InsecureSkipVerify: true},DisableCompression: true,}
    client := http.Client{Transport: tr}
    client.Jar,_ = cookiejar.New(nil)

    client2 := http.Client{}
    client2.Jar,_ = cookiejar.New(nil)

    http.HandleFunc("/",func(w http.ResponseWriter,r *http.Request) {
        r.ParseForm()
        protocol := *Protocol

        switch protocol {
        case "https":
            req,err := NewReq(r)
            if err != nil {
                fmt.Println(err)
                return
            }
            resp,err := client.Do(req)

            if err != nil {
                fmt.Println("do error:",err)
                return
            }
            b,err := IoUtil.ReadAll(resp.Body)
            if err != nil {
                fmt.Println("read error:",err)
            }

            // it is very import
            // if didn't set header,
            // custom brower will complex.
            for key,val := range resp.Header {
                w.Header().Set(key,sliceToString(val))
            }
            fmt.Println(client.Jar.Cookies(req.URL),resp.StatusCode,resp.Status)
            w.Write(b)

        case "http":
            req,err := NewReq(r)
            if err != nil {
                fmt.Println(err)
            }

            resp,err := client2.Do(req)

            if err != nil {
                fmt.Println(err)
                return
            }
            b,err := IoUtil.ReadAll(resp.Body)
            if err != nil {
                fmt.Println(err)
            }
            for key,sliceToString(val))
            }
            w.Write(b)
        }
    })

    http.ListenAndServe(":8088",nil)
}

当proxy服务启动后,你登录到proxy服务器,看到的内容和proxy转发目标服务器内容一模一样。这样很容易引起误导。以前经常有短消息,告诉你登录某个网站,零取礼物,网站地址就和某某银行,或者某些电商网站地址差一个字母或数字,很误导人。当你登录后,你的cookies就被proxy劫持住,这样,不怀好意的人,就可以利用这个已经连接的用户做一些恶心的事情。设想一下,你在FQ的过程中,输入了某某网站的用户名和密码,就算你加密了,也无济于事。尤其是,当你在很多地方都用一个用户名和密码的时候,是不是更危险。所以,看到诱惑的时候,看清楚,是不是真实有效的,看到好的代理的时候,不要盲目的说好,不知不觉,说不定,你的信息就泄露了。
上述实例代码中,将Target和Protocol改成对应网站的地址,就可以通过proxy访问目标服务器,这段代码记录了用户的cookies信息。一旦登录,将会造成用户信息泄露。当然,也不必过于担心,银行,电商等等线上有几重校验信息,这种低级的代理是不会对他们的系统造成影响。但是对于一些安全防范比较差的系统,就一击必中。

总结

任何事物,都有好,有坏,不盲从,亦不偏激。在合适的场合下,选择合适的方式。

猜你在找的Go相关文章