来源:自学PHP网 时间:2015-04-16 23:15 作者: 阅读:次
[导读] 一般我们都是利用WebRequest这个类来向服务器进行数据的POST,不过很多情况下相应的服务器都有验证,看你是不是登陆,是不是来自同一个域,这些都简单,我们可以更改其属性来达到欺...
一般我们都是利用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; } }
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";
|
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com