相關(guān)資訊
本類常用軟件
-
福建農(nóng)村信用社手機(jī)銀行客戶端下載下載量:584212
-
Windows優(yōu)化大師下載量:419777
-
90美女秀(視頻聊天軟件)下載量:366966
-
廣西農(nóng)村信用社手機(jī)銀行客戶端下載下載量:365708
-
快播手機(jī)版下載量:325899
WebClient模擬登陸CSRF的教程
2014/5/20 23:10:24 出處:本站原創(chuàng) 人氣:86次 字號:小 中 大
一般我們都是利用WebRequest這個類來向服務(wù)器進(jìn)行數(shù)據(jù)的POST,不過很多情況下相應(yīng)的服務(wù)器都有驗證,看你是不是登陸,是不是來自同一個域,這些都簡單,我們可以更改其屬性來達(dá)到欺騙服務(wù)器。不過如果服務(wù)器做了CSRF控制,那我們怎么辦?
不熟悉CSRF的可以問下G哥此為何物,這里簡單介紹下。CSRF常規(guī)來講是在表單頁里放一個隱藏域,然后在表單提交的時候服務(wù)器驗證POST過來的NAVEVALUE里面是不是包含此域,同時如果包含驗證其值。
問題來了,在這種情況下我們POST到服務(wù)器的數(shù)據(jù)怎么寫,雖然我們可以查看HTML來得知這個NAME是什么以及它的VALUE是什么,但是這個VALUE一般情況下每刷一次都是會發(fā)生變化的。那好了在我們POST的時候怎么來得到它呢?
網(wǎng)上常見的那些WebRequest方法肯定不行,因為它們都是用這個類先獲得一個Stream,在這個Stream里面寫入我們要POST到服務(wù)器的數(shù)據(jù),可這個時候我們還不知道這個CSRF的值呢,POST過去肯定出錯。理論上來講我們要先GET一次,然后自己辦法解析GET到的這個HTML,得到CSRF的值,可是接下來我們再去WebRequest.Creat打算去POST的時候,此時相當(dāng)于又重新訪問了一遍,它的CSRF值已經(jīng)變了,看來此路不通啊。
好在我們還有WebClient可以利用,WebClient可以讓我們保持一個實例即可,而WebRequest只有通過靜態(tài)方法創(chuàng)造出來,不能通過變化URL來達(dá)到使用同一個的目的,此處可能也是在NET4里微軟推出全新HttpClient的目的,用來一統(tǒng)HTTP訪問接口的江湖。
好了,我們現(xiàn)在需要做的就是繼承WebClient,重寫相應(yīng)方法,代碼如下:
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;
}
}
可以看出,其實最關(guān)鍵的還是利用好CookieContainer這個類。接下來就是如何使用了,我們需要首先訪問一次登陸頁面,拿到HTML然后正則也好替換也好,拿到這個CSRF的VALUE,然后再將其POST相應(yīng)的服務(wù)器。
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}<={2}", "user", "pass", token);
client.Method = "POST";
response = client.UploadString("url for login", postData);
client.Method = "GET";
到此我們就可以結(jié)束,后期就是變化不同的URL去DownloadString了,俗稱爬蟲,接下來就可以根據(jù)不同的業(yè)務(wù)做不同的數(shù)據(jù)分析了。