变态重口极致另类在线-波多久久夜色精品国产-波多野结衣在线观看一区-波多野结衣在线观看一区二区-污污的网站免费阅读-污污视频网址

當前位置: 首頁編程開發數據庫 → WebClient模擬登陸CSRF的教程

WebClient模擬登陸CSRF的教程

更多

一般我們都是利用WebRequest這個類來向服務器進行數據的POST,不過很多情況下相應的服務器都有驗證,看你是不是登陸,是不是來自同一個域,這些都簡單,我們可以更改其屬性來達到欺騙服務器。不過如果服務器做了CSRF控制,那我們怎么辦?

不熟悉CSRF的可以問下G哥此為何物,這里簡單介紹下。CSRF常規來講是在表單頁里放一個隱藏域,然后在表單提交的時候服務器驗證POST過來的NAVEVALUE里面是不是包含此域,同時如果包含驗證其值。

問題來了,在這種情況下我們POST到服務器的數據怎么寫,雖然我們可以查看HTML來得知這個NAME是什么以及它的VALUE是什么,但是這個VALUE一般情況下每刷一次都是會發生變化的。那好了在我們POST的時候怎么來得到它呢?

網上常見的那些WebRequest方法肯定不行,因為它們都是用這個類先獲得一個Stream,在這個Stream里面寫入我們要POST到服務器的數據,可這個時候我們還不知道這個CSRF的值呢,POST過去肯定出錯。理論上來講我們要先GET一次,然后自己辦法解析GET到的這個HTML,得到CSRF的值,可是接下來我們再去WebRequest.Creat打算去POST的時候,此時相當于又重新訪問了一遍,它的CSRF值已經變了,看來此路不通啊。

好在我們還有WebClient可以利用,WebClient可以讓我們保持一個實例即可,而WebRequest只有通過靜態方法創造出來,不能通過變化URL來達到使用同一個的目的,此處可能也是在NET4里微軟推出全新HttpClient的目的,用來一統HTTP訪問接口的江湖。

好了,我們現在需要做的就是繼承WebClient,重寫相應方法,代碼如下:

public class CookieAwareWebClient : WebClient

    {

        public string Method;

        public CookieContainer CookieContainer { get; set; }

        public Uri Uri { get; set; }


        public CookieAwareWebClient()

            : this(new CookieContainer())

        {

        }


        public CookieAwareWebClient(CookieContainer cookies)

        {

            this.CookieContainer = cookies;

            this.Encoding = Encoding.UTF8;

        }


        protected override WebRequest GetWebRequest(Uri address)

        {

            WebRequest request = base.GetWebRequest(address);

            if (request is HttpWebRequest)

            {

                (request as HttpWebRequest).CookieContainer = this.CookieContainer;

                (request as HttpWebRequest).ServicePoint.Expect100Continue = false;

                (request as HttpWebRequest).UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.5 Safari/537.36";

                (request as HttpWebRequest).Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";

                (request as HttpWebRequest).Headers.Add(HttpRequestHeader.AcceptLanguage, "zh-CN,zh;q=0.8,en;q=0.6,nl;q=0.4,zh-TW;q=0.2");

                (request as HttpWebRequest).Referer = "some url";

                (request as HttpWebRequest).KeepAlive = true;

                (request as HttpWebRequest).AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;

                if (Method == "POST")

                {

                    (request as HttpWebRequest).ContentType = "application/x-www-form-urlencoded";

                }

            }

            HttpWebRequest httpRequest = (HttpWebRequest)request;

            httpRequest.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;

            return httpRequest;

        }


        protected override WebResponse GetWebResponse(WebRequest request)

        {

            WebResponse response = base.GetWebResponse(request);

            String setCookieHeader = response.Headers[HttpResponseHeader.SetCookie];


            if (setCookieHeader != null)

            {

                //do something if needed to parse out the cookie.

                try

                {

                    if (setCookieHeader != null)

                    {

                        Cookie cookie = new Cookie(); 

                        cookie.Domain = request.RequestUri.Host;

                        this.CookieContainer.Add(cookie);

                    }

                }

                catch (Exception)

                {


                }

            }

            return response;

        }

    }

可以看出,其實最關鍵的還是利用好CookieContainer這個類。接下來就是如何使用了,我們需要首先訪問一次登陸頁面,拿到HTML然后正則也好替換也好,拿到這個CSRF的VALUE,然后再將其POST相應的服務器。

var cookieJar = new CookieContainer();

            CookieAwareWebClient client = new CookieAwareWebClient(cookieJar);


            // the website sets some cookie that is needed for login, and as well the 'lt' is always different

            string response = client.DownloadString("url for get");

            string regx = "<input type=\"hidden\" id=\"lt\" name=\"lt\" value=\"(?<PID>\\S+?)\" />";

            // parse the 'lt' and cookie is auto handled by the cookieContainer

            string token = Regex.Match(response, regx).Groups[1].Value;

            string urlforlogin = "url for login";

            string postData =

                string.Format("username={0}&password={1}&lt={2}", "user", "pass", token);

            client.Method = "POST";            

            response = client.UploadString("url for login", postData);


            client.Method = "GET";

到此我們就可以結束,后期就是變化不同的URL去DownloadString了,俗稱爬蟲,接下來就可以根據不同的業務做不同的數據分析了。

熱門評論
最新評論
昵稱:
表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
字數: 0/500 (您的評論需要經過審核才能顯示)
主站蜘蛛池模板: 亚洲综合激情丁香六月 | 日韩欧美中国a v | 午夜影院毛片 | 国产精品久久久久国产精品三级 | 干干日日 | www.天天操.com | 中文字幕va | 77788色淫免费网站视频 | 97日韩| 日韩午夜小视频 | 欧美一区二区在线播放 | 在线亚洲小视频 | 黄色网址视频在线播放 | 英国一级毛片 | 宅男在线影院 | 亚洲成人高清在线观看 | 99久久免费国产精精品 | 亚洲 欧美 中文 日韩欧美 | 国产又色又爽又黄 | 99精品视频在线在线视频观看 | 永久免费毛片手机版在线看 | 久久大香香蕉国产免费网站 | 亚洲毛片在线观看 | 欧美成a人片在线观看 | 国产短视频精品一区二区三区 | 国产粉嫩嫩00在线正在播放 | 99re在线 | 国内精品一区二区三区 | 免费簧网站永久在线播放国产 | 亚洲精品精品 | 午夜影院操一 | 99ri在线精品视频在线播放 | 韩日一区二区 | 亚洲精品午夜在线观看 | 永久免费毛片 | 白丝丝袜高跟国产在线视频 | 欧美日本道免费一区二区三区 | 国产精品九九九久久九九 | 在线成人欧美 | 亚洲 欧美 日韩 在线 | free性欧美另类巨大 |