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示例代码

  1. package main
  2.  
  3. import (
  4. "crypto/tls"
  5. "flag"
  6. "fmt"
  7. "io/IoUtil"
  8. "net/http"
  9. "net/http/cookiejar"
  10. "strings"
  11. )
  12.  
  13. var (
  14. Target = flag.String("target","https://www.asofdate.com","target server")
  15. Protocol = flag.String("protocol","https","http or https protocol")
  16. )
  17.  
  18. func sliceToString(str []string) string {
  19. result := ""
  20. for _,val := range str {
  21. result += val + " "
  22. }
  23. result = strings.TrimSpace(result)
  24. return result
  25. }
  26.  
  27. func NewReq(sr *http.Request) (*http.Request,error) {
  28. sr.ParseForm()
  29. url := *Target + sr.RequestURI
  30. req,_ := http.NewRequest(sr.Method,url,strings.NewReader(sr.Form.Encode()))
  31. req.Form = sr.Form
  32. req.Header = sr.Header
  33. req.TLS = sr.TLS
  34. req.TransferEncoding = sr.TransferEncoding
  35. req.Trailer = sr.Trailer
  36.  
  37. return req,nil
  38. }
  39.  
  40. func main() {
  41. flag.Parse()
  42. tr := &http.Transport{
  43. TLSClientConfig: &tls.Config{InsecureSkipVerify: true},DisableCompression: true,}
  44. client := http.Client{Transport: tr}
  45. client.Jar,_ = cookiejar.New(nil)
  46.  
  47. client2 := http.Client{}
  48. client2.Jar,_ = cookiejar.New(nil)
  49.  
  50. http.HandleFunc("/",func(w http.ResponseWriter,r *http.Request) {
  51. r.ParseForm()
  52. protocol := *Protocol
  53.  
  54. switch protocol {
  55. case "https":
  56. req,err := NewReq(r)
  57. if err != nil {
  58. fmt.Println(err)
  59. return
  60. }
  61. resp,err := client.Do(req)
  62.  
  63. if err != nil {
  64. fmt.Println("do error:",err)
  65. return
  66. }
  67. b,err := IoUtil.ReadAll(resp.Body)
  68. if err != nil {
  69. fmt.Println("read error:",err)
  70. }
  71.  
  72. // it is very import
  73. // if didn't set header,
  74. // custom brower will complex.
  75. for key,val := range resp.Header {
  76. w.Header().Set(key,sliceToString(val))
  77. }
  78. fmt.Println(client.Jar.Cookies(req.URL),resp.StatusCode,resp.Status)
  79. w.Write(b)
  80.  
  81. case "http":
  82. req,err := NewReq(r)
  83. if err != nil {
  84. fmt.Println(err)
  85. }
  86.  
  87. resp,err := client2.Do(req)
  88.  
  89. if err != nil {
  90. fmt.Println(err)
  91. return
  92. }
  93. b,err := IoUtil.ReadAll(resp.Body)
  94. if err != nil {
  95. fmt.Println(err)
  96. }
  97. for key,sliceToString(val))
  98. }
  99. w.Write(b)
  100. }
  101. })
  102.  
  103. http.ListenAndServe(":8088",nil)
  104. }

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

总结

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

猜你在找的Go相关文章