proxy简单的代理服务器

来源:互联网 发布:音乐在线剪切软件 编辑:程序博客网 时间:2024/05/19 20:21

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 mainimport (    "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, val := range resp.Header {                w.Header().Set(key, sliceToString(val))            }            w.Write(b)        }    })    http.ListenAndServe(":8088", nil)}

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

总结

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

0 0