如何模拟登陆添加了CSRF保护的网站
上次写了篇文章,内容是如何利用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("<=" + 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保护的网站的更多相关文章
- Python实现网站模拟登陆
一.实验简介 1.1 基本介绍 本实验中我们将通过分析登陆流程并使用 Python 实现模拟登陆到一个实验提供的网站,在实验过程中将学习并实践 Python 的网络编程,Python 实现模拟登陆的方 ...
- 使用webdriver+urllib爬取网页数据(模拟登陆,过验证码)
urilib是python的标准库,当我们使用Python爬取网页数据时,往往用的是urllib模块,通过调用urllib模块的urlopen(url)方法返回网页对象,并使用read()方法获得ur ...
- Jsoup模拟登陆例子
Jsoup模拟登陆小例子,不同的网站,需要不同的模拟策略,散仙在这里仅仅作为一个引导学习. package com.jsouplogin; import java.util.HashMap; impo ...
- Node.js:实现知乎(www.zhihu.com)模拟登陆,获取用户关注主题
前一段时间,在瞎看看 Node.js,便研究通过 Node.js 实现知乎模拟登陆.相信,有很多网站有登陆权限设置,如若用户未登陆,将会跳转至首页提醒用户登陆,无法浏览部分页面. 如若是 b/s 架构 ...
- selenium3.7+ python3 添加cookie模拟登陆
一.背景介绍 最近做一个爬虫项目,用selenium调用浏览器去获取渲染后的源码,但是每次登陆都需要手机验证,这真的是头痛啊,这种验证方式不要想着去破解,还是老老实实用手机收验证码去吧!反正我是不知道 ...
- Python 爬虫模拟登陆知乎
在之前写过一篇使用python爬虫爬取电影天堂资源的博客,重点是如何解析页面和提高爬虫的效率.由于电影天堂上的资源获取权限是所有人都一样的,所以不需要进行登录验证操作,写完那篇文章后又花了些时间研究了 ...
- Python模拟登陆新浪微博
上篇介绍了新浪微博的登陆过程,这节使用Python编写一个模拟登陆的程序.讲解与程序如下: 1.主函数(WeiboMain.py): import urllib2 import cookielib i ...
- python模拟登陆知乎并爬取数据
一些废话 看了一眼上一篇日志的时间 已然是5个月前的事情了 不禁感叹光阴荏苒其实就是我懒 几周前心血来潮想到用爬虫爬些东西 于是先后先重写了以前写过的求绩点代码 爬了草榴贴图,妹子图网,后来想爬婚恋网 ...
- 【教程】手把手教你如何利用工具(IE9的F12)去分析模拟登陆网站(百度首页)的内部逻辑过程
[前提] 想要实现使用某种语言,比如Python,C#等,去实现模拟登陆网站的话,首先要做的事情就是使用某种工具,去分析本身使用浏览器去登陆网页的时候,其内部的执行过程,内部逻辑. 此登陆的逻辑过程, ...
随机推荐
- React Native踩坑之Unable to load script from assets
报错: Unable to load script from assets 'index.android.bundle'. Make sure your bundle is packaged corr ...
- String 字符串补0
method1: 前提是你的长度已经确定!比如规定现实10位! - 优点: 不需要都是数字类型 String str_m = "123X"; String str =&q ...
- 用于解析通过JS的escape函数加密过的数据
function js_unescape($str) { $ret = ''; $len = strlen($str); for ($i = 0; $i < $len; $i++) { if ( ...
- Unity Shader基础
Unity Shader基础 先上代码,代码一般是这样的. void Initialization(){ //先从硬盘加载代码再加载到GPU中 string vertexShaderCode = Lo ...
- SPOJ375 Query on a tree 【倍增,在线】
题目链接[http://www.spoj.com/problems/QTREE/] 题意:给出一个包含N(N<=10000)节点的无根树,有多次询问,询问的方式有两种1.DIST a b 求a ...
- ddms 安卓录制
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha 屏幕录制, 视频录制 保存为 . 打开 .显示在浏览器里. 设备屏幕捕捉 刷 ...
- android intent 传递 二进制数据
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha 实现序列化.
- Nginx 502 Bad Gateway 解决方法
proxy_next_upstream error timeout invalid_header http_500 http_503;或者尝试设置:large_client_header_buffer ...
- [HDU1290]献给杭电五十周年校庆的礼物
[HDU1290]献给杭电五十周年校庆的礼物 题目大意: 问\(n(n\le1000)\)个平面能够将一个三维空间分成几部分. 思路: 公式\(\frac{n^3+5n+6}6\). 源代码: #in ...
- Swift 闭包反向传值
Swift中闭包反向传值 1.第二控制器申明一个闭包类型 typealias BackBlock = (String) -> Void 2.第二控制器定义一个变量 var BackBlockCl ...