码迷,mamicode.com
首页 > Web开发 > 详细

如何模拟登陆添加了CSRF保护的网站

时间:2014-05-30 04:24:05      阅读:384      评论:0      收藏:0      [点我收藏+]

标签:c   style   class   blog   code   java   

上次写了篇文章,内容是如何利用WebClient模拟登陆CSRF控制的网站,回复中有人还是不理解,现在另开一篇,打算说说用Python如何来登陆。

开写之前,先说下为什么webrequest不行,常规情况下,我们在利用webrequest的时候,都是如下的形式:

bubuko.com,布布扣
 1 string url = "loginurl";
 2 StringBuilder sb = new StringBuilder();
 3 sb.Append("username=un");
 4 sb.Append("&password=up");
 5 sb.Append("&service=sv");
 6 HttpWebRequest requestget = (HttpWebRequest)WebRequest.Create(url);
 7 byte[] postData = Encoding.UTF8.GetBytes(sb.ToString());
 8 using (Stream stream = requestget.GetRequestStream())
 9 {
10     stream.Write(postData, 0, postData.Length);
11 }
12 WebResponse reponse1 = requestget.GetResponse();
13 StreamReader sr2 = new StreamReader(reponse1.GetResponseStream(), Encoding.UTF8);
14 string html2 = sr2.ReadToEnd();
bubuko.com,布布扣

可关键是我们POST过去的数据并没有服务器所认可的CSRF值,在GetResponse处就会报错,要是我们在上面第六行后面添加如下代码:

bubuko.com,布布扣
1 WebResponse reponseget = requestget.GetResponse();
2 StreamReader sr = new StreamReader(reponseget.GetResponseStream(), Encoding.UTF8);
3 string html = sr.ReadToEnd();
4 string regx = "<input type=\"hidden\" id=\"lt\" name=\"lt\" value=\"(?<PID>\\S+?)\" />";
5 string token = Regex.Match(html, regx).Groups[1].Value;
6 sb.Append("&lt=" + token);
bubuko.com,布布扣

先获得其值,并加入到postdata的stringbuild中,其它不变,当执行到GetRequestStream的时候,会报System.Net.ProtocolViolationException的错误,此时如果你重新create一个httpwebrequest又会导致csrf值失效。这些就是在模拟登陆具有CSRF保护网站时碰到的问题,所以才有第一篇文章重写WebClient来达到。

今天碰巧在写Python代码,就想利用Python看看怎么来做这样带保护的模拟登陆,简单说来,代码如下:

bubuko.com,布布扣
 1 from urllib.parse import urlencode
 2 url = somurl
 3 r,c = h.request(url,GET)
 4 sc = c.decode(utf-8)
 5 import re
 6 regx = r<input type="hidden" id="lt" name="lt" value="(\S+?)" />;
 7 pm = re.search(regx,sc)
 8 csrf = pm.group(1)
 9 body = {username:‘user,password:‘pass,lt:csrf,service:url}
10 r,c = h.request(url,POST,body=urlencode(body))
11 print (c.decode("UTF-8"))
bubuko.com,布布扣

感觉还是满简单的。当然我们也还是要利用cookie来达到目的,上面是主要的代码,大家可以参考下。

变量h的定义如下:

1 h = httplib2.Http(.cache)

可以看到,用的是httplib2这个库。在Python中推荐用其来代替标准库的http客户端。

 

 

如何模拟登陆添加了CSRF保护的网站,布布扣,bubuko.com

如何模拟登陆添加了CSRF保护的网站

标签:c   style   class   blog   code   java   

原文地址:http://www.cnblogs.com/xwang/p/3757711.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!