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

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

 string url = "loginurl";
StringBuilder sb = new StringBuilder();
sb.Append("username=un");
sb.Append("&password=up");
sb.Append("&service=sv");
HttpWebRequest requestget = (HttpWebRequest)WebRequest.Create(url);
byte[] postData = Encoding.UTF8.GetBytes(sb.ToString());
using (Stream stream = requestget.GetRequestStream())
{
stream.Write(postData, , postData.Length);
}
WebResponse reponse1 = requestget.GetResponse();
StreamReader sr2 = new StreamReader(reponse1.GetResponseStream(), Encoding.UTF8);
string html2 = sr2.ReadToEnd();

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

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

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

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

 from urllib.parse import urlencode
url = 'somurl'
r,c = h.request(url,'GET')
sc = c.decode('utf-8')
import re
regx = r'<input type="hidden" id="lt" name="lt" value="(\S+?)" />';
pm = re.search(regx,sc)
csrf = pm.group(1)
body = {'username':'user','password':'pass','lt':csrf,'service':'url'}
r,c = h.request(url,'POST',body=urlencode(body))
print (c.decode("UTF-8"))

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

变量h的定义如下:

 h = httplib2.Http('.cache')

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

如何模拟登陆添加了CSRF保护的网站的更多相关文章

  1. Python实现网站模拟登陆

    一.实验简介 1.1 基本介绍 本实验中我们将通过分析登陆流程并使用 Python 实现模拟登陆到一个实验提供的网站,在实验过程中将学习并实践 Python 的网络编程,Python 实现模拟登陆的方 ...

  2. 使用webdriver+urllib爬取网页数据(模拟登陆,过验证码)

    urilib是python的标准库,当我们使用Python爬取网页数据时,往往用的是urllib模块,通过调用urllib模块的urlopen(url)方法返回网页对象,并使用read()方法获得ur ...

  3. Jsoup模拟登陆例子

    Jsoup模拟登陆小例子,不同的网站,需要不同的模拟策略,散仙在这里仅仅作为一个引导学习. package com.jsouplogin; import java.util.HashMap; impo ...

  4. Node.js:实现知乎(www.zhihu.com)模拟登陆,获取用户关注主题

    前一段时间,在瞎看看 Node.js,便研究通过 Node.js 实现知乎模拟登陆.相信,有很多网站有登陆权限设置,如若用户未登陆,将会跳转至首页提醒用户登陆,无法浏览部分页面. 如若是 b/s 架构 ...

  5. selenium3.7+ python3 添加cookie模拟登陆

    一.背景介绍 最近做一个爬虫项目,用selenium调用浏览器去获取渲染后的源码,但是每次登陆都需要手机验证,这真的是头痛啊,这种验证方式不要想着去破解,还是老老实实用手机收验证码去吧!反正我是不知道 ...

  6. Python 爬虫模拟登陆知乎

    在之前写过一篇使用python爬虫爬取电影天堂资源的博客,重点是如何解析页面和提高爬虫的效率.由于电影天堂上的资源获取权限是所有人都一样的,所以不需要进行登录验证操作,写完那篇文章后又花了些时间研究了 ...

  7. Python模拟登陆新浪微博

    上篇介绍了新浪微博的登陆过程,这节使用Python编写一个模拟登陆的程序.讲解与程序如下: 1.主函数(WeiboMain.py): import urllib2 import cookielib i ...

  8. python模拟登陆知乎并爬取数据

    一些废话 看了一眼上一篇日志的时间 已然是5个月前的事情了 不禁感叹光阴荏苒其实就是我懒 几周前心血来潮想到用爬虫爬些东西 于是先后先重写了以前写过的求绩点代码 爬了草榴贴图,妹子图网,后来想爬婚恋网 ...

  9. 【教程】手把手教你如何利用工具(IE9的F12)去分析模拟登陆网站(百度首页)的内部逻辑过程

    [前提] 想要实现使用某种语言,比如Python,C#等,去实现模拟登陆网站的话,首先要做的事情就是使用某种工具,去分析本身使用浏览器去登陆网页的时候,其内部的执行过程,内部逻辑. 此登陆的逻辑过程, ...

随机推荐

  1. React Native踩坑之Unable to load script from assets

    报错: Unable to load script from assets 'index.android.bundle'. Make sure your bundle is packaged corr ...

  2. String 字符串补0

    method1: 前提是你的长度已经确定!比如规定现实10位! - 优点: 不需要都是数字类型    String str_m =  "123X";  String str =&q ...

  3. 用于解析通过JS的escape函数加密过的数据

    function js_unescape($str) { $ret = ''; $len = strlen($str); for ($i = 0; $i < $len; $i++) { if ( ...

  4. Unity Shader基础

    Unity Shader基础 先上代码,代码一般是这样的. void Initialization(){ //先从硬盘加载代码再加载到GPU中 string vertexShaderCode = Lo ...

  5. SPOJ375 Query on a tree 【倍增,在线】

    题目链接[http://www.spoj.com/problems/QTREE/] 题意:给出一个包含N(N<=10000)节点的无根树,有多次询问,询问的方式有两种1.DIST  a b 求a ...

  6. ddms 安卓录制

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 屏幕录制, 视频录制 保存为 .   打开 .显示在浏览器里. 设备屏幕捕捉     刷 ...

  7. android intent 传递 二进制数据

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 实现序列化.

  8. Nginx 502 Bad Gateway 解决方法

    proxy_next_upstream error timeout invalid_header http_500 http_503;或者尝试设置:large_client_header_buffer ...

  9. [HDU1290]献给杭电五十周年校庆的礼物

    [HDU1290]献给杭电五十周年校庆的礼物 题目大意: 问\(n(n\le1000)\)个平面能够将一个三维空间分成几部分. 思路: 公式\(\frac{n^3+5n+6}6\). 源代码: #in ...

  10. Swift 闭包反向传值

    Swift中闭包反向传值 1.第二控制器申明一个闭包类型 typealias BackBlock = (String) -> Void 2.第二控制器定义一个变量 var BackBlockCl ...