1. 程式人生 > >python接口自動化12-案例分析(csrfToken)

python接口自動化12-案例分析(csrfToken)

ext date 如果 header live gen enc utf accep

前言:

有些網站的登錄方式跟前面講的博客園和token登錄會不一樣,把csrfToken放到cookie裏,登錄前後cookie是沒有任何變化的,這種情況下如何繞過前端的驗證碼登錄呢?

一、登錄前後對比

1.如果登錄頁面有圖形驗證碼,這種我們一般都是繞過登錄的方式,如下圖通過抓包分析,首先不輸入密碼,抓包

(由於這個是別人公司內部網站,所以網址不能公開,僅提供解決問題的思路)

技術分享圖片

2.在登錄頁面輸入賬號和密碼手動登錄後,抓包信息如下

技術分享圖片

.抓包後cookies信息在登錄前後沒任何變化,這裏主要有三個參數:

--businessUsername:這個是賬號名稱
--JSESSIONID: 這個是一串字符串,主要看這個會不會變(一般有有效期)copy出來就行
--csrfToken: 這個是一串字符串,主要看這個會不會變(一般有有效期)copy出來就行

二、get請求

1.像這種登錄方式的get請求,請求頭部cookie沒任何變化,這種可以直接忽略登錄,不用管登錄過程,直接發請求就行

技術分享圖片

 1 2.代碼實現
 2 # coding:utf-8
 3 import requests
 4 # 優惠券列表
 5 url = http://xxx/xxx/coupon/list
 6 h = {
 7 "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0",
 8 "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
", 9 "Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3", 10 "Accept-Encoding": "gzip, deflate", 11 "Cookie": "csrfToken=xxx(復制抓包的信息); JSESSIONID=xxx(復制抓包的信息); businessUsername=(用戶名)", 12 "Connection": "keep-alive" 13 } 14 r = requests.get(url, headers=h) 15 print r.content

技術分享圖片

三、post請求遇到的坑

1.post請求其實也可以忽略登錄的過程,直接抓包把cookie裏的三個參數(businessUsername、JSESSIONID、csrfToken)加到頭部也是可以的。

技術分享圖片

2.但是這裏遇到一個坑:用Composer發請求,重定向回到登錄頁了

技術分享圖片

3.主要原因:重定向的請求,cookie參數丟失了

技術分享圖片

四、重定向

1.解決上面問題,其實很簡單,把重定向禁用(具體看2.8重定向Location這篇)後的鏈接獲取到,重新發個get請求,頭部帶上cookies的三個參數就行了

 1 # coding:utf-8
 2 import requests
 3 # 主要是post請求後重定向,cookie丟失,所以回到登錄頁面了
 4 # 解決辦法,禁止重定向,獲取重定向的url後,重新發重定向的url地址請求就行了
 5 
 6 # 三個主要參數
 7 csrfToken = 獲取到的csrftoken,一般有有效期的
 8 jsessionId = 獲取到的jsessionid
 9 userName = 用戶名
10 
11 
12 url = http://xxx/xxxx/update
13 h1 = {
14     "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0",
15     "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
16     "Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3",
17     "Accept-Encoding": "gzip, deflate",
18     "Cookie": "csrfToken=%s; JSESSIONID=%s; businessUsername=%s" % (csrfToken, jsessionId, userName),
19     "Connection": "keep-alive",
20     "Content-Type": "application/x-www-form-urlencoded",
21     "Content-Length": "115"
22     }
23 
24 body = {"instantMessageId":"56",
25         "name": u"哈哈1",
26         "order": "",
27         "csrfToken": csrfToken,
28         "type": "qq",
29         "account": "1001"}
30 
31 s = requests.session()
32 r1 = s.post(url, headers=h1, data=body, allow_redirects=False)
33 print r1.status_code
34 # 獲取重定向的url地址
35 redirect_url = r1.headers["Location"]
36 print redirect_url
37 
38 h2 = {
39 "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0",
40 "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
41 "Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3",
42 "Accept-Encoding": "gzip, deflate",
43 "Cookie": "csrfToken=%s; JSESSIONID=%s; businessUsername=%s" % (csrfToken, jsessionId, userName),
44 "Connection": "keep-alive"
45 }
46 r2 = s.get(redirect_url, headers=h2)
47 print r2.content

python接口自動化12-案例分析(csrfToken)