摘要:大致意思是模擬登陸,一時手癢,本文將帶領大家一起實現這個操作。方案事實上為了探究這個有意思的問題,我專門動手做一個有意思的實驗。這說明了服務端驗證了輸入,并判斷我們的請求不符合正常邏輯。過程不再贅述,結果是中的必須和中的對應。
前言
本文來自我在 SegmentFault 上的 回答,我紀錄了其中精彩的部分到本博客。
大致意思是模擬登陸 segmentfault.com,一時手癢,本文將帶領大家一起實現這個操作。
解析這個問題問的非常好,但可惜的是大家的回復都是紙上談兵未經探討,最前最高票的回答的竟然說讓下抓包工具,簡直可笑啊,chrome下F12直接就可以看到賬號密碼是明文發送的何必還要抓包?另外的題主的http頭就是從chrome下復制的。
根據竟然我判斷你的問題的原因是發送了過多的http頭,其中Content-Length是明顯有問題的,這個代表內容長度,你這次抓包是49,但下次換個賬號密碼可就真不一定了。比如,如果賬號密碼過長,可能就會導致截斷,那么無論如何都會提示密碼錯誤的(因為只發送了一部分的密碼過去)。
方案事實上為了探究這個有意思的問題,我專門動手做一個有意思的實驗。這里就用個最簡單的腳本語言node.js中的ajax模型來重新構建操作過程。
分析我們先去登陸頁--源碼頁去大致看一下,其中
這個跨域請求加載js腳本,看名字應該是和登陸有關的,我們這邊使用嘗試訪問下,結果不用想,一篇亂糟糟的。
根據命名規范,我們猜測壓縮前的名字可能就是叫login.js,我們看下他刪除了沒有,我們嘗試訪問https://dfnjy7g2qaazm.cloudfront.net/v-575e20ec/user/script/login.js,嗯哼還在,看來他們的發布人員可能不是處女座的。
那好我們往下看下這里:
$("form[action="/api/user/login"]").submit(function() { var data, url; url = "/api/user/login"; data = $(this).serialize(); $.post(url, data, function(d) { if (!d.status) { return location.href = d.data; } }); return false; });
代碼非常簡單,我們知道了請求結果中status為0時代表登陸成功,同時我們也知道了后臺執行登陸請求頁是/api/user/login,即https://segmentfault.com/api/user/login,我們訪問一下,嗯404。這說明了服務端驗證了輸入,并判斷我們的請求不符合正常邏輯。下面我們開始偽造請求頭。
請求頭我們用類似chrome的現代化瀏覽器,正常訪問https://segmentfault.com/user/login,按下F12,選擇network面板開始監控請求,然后我們隨意填寫賬號密碼,點擊登陸。
這個時候下面會有一條信息,我們提取其中的Request Header如下
POST /api/user/login?_=93e1b923149fb56c4fd329fe95ea4001 HTTP/1.1 Host: segmentfault.com Connection: keep-alive Content-Length: 46 Pragma: no-cache Cache-Control: no-cache Accept: */* Origin: https://segmentfault.com X-Requested-With: XMLHttpRequest User-Agent: xxxx Content-Type: application/x-www-form-urlencoded; charset=UTF-8 DNT: 1 Referer: https://segmentfault.com/ Accept-Encoding: gzip, deflate, br Accept-Language: en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4 Cookie: PHPSESSID=web5~to8l5ovmt9t3jkb84aevuqf151; Hm_lvt_e23800c454aa573c0ccb16b52665ac26=1465799317; Hm_lpvt_e23800c454aa573c0ccb16b52665ac26=1465799317; _ga=GA1.2.915515414.1465799317; _gat=1
我們只需要同樣發送這些請求到服務器上,理論上就不會有問題,同時也不會再404了。
這里面的數據中,有些不需要發的,有些是必須要發送的。我們可以一一測試下。
調試我們這里使用nodejs來簡單寫段代碼測試下服務端所驗證的參數。
枯燥的測試就是不斷刪減請求來看看服務端會不會返回404。過程不再贅述,結果是:
querystring中的 _必須和Cookie中的PHPSESSID對應。
X-Requested-With的值需要帶ajax請求標志,即XMLHttpRequest
Referer的值
看來他們服務端還是蠻嚴格的。
源碼var superagent = require("superagent"); superagent.post("https://segmentfault.com/api/user/login?_=7ef046ad4f224034d7b51655238bd870") .set("Referer", "https://segmentfault.com/user/login") .set("X-Requested-With", "XMLHttpRequest") .set("Cookie", "PHPSESSID=web1~395mahoqliohh5kclv894ibpr3; _gat=1; _ga=GA1.2.1234754628.1465797373; Hm_lvt_e23800c454aa573c0ccb16b52665ac26=1465797373; Hm_lpvt_e23800c454aa573c0ccb16b52665ac26=1465797538") .send({ mail: "xxxxxx", password: "xxxx" }) .type("form") .end(function(err, res) { if (err || !res.ok) { console.log(err.status); } else { console.log("yay got " + JSON.stringify(res.body)); } });
同時,開源在 GitHub 上,地址 segmentfault_loginer:https://github.com/Rozbo/segmentfault_loginer。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/79630.html
摘要:爬蟲是我接觸計算機編程的入門。練練練本文推薦的資源就是以項目練習帶動爬蟲學習,囊括了大部分爬蟲工程師要求的知識點。拓展閱讀一文了解爬蟲與反爬蟲最后,請注意,爬蟲的工作機會相對較少。 爬蟲是我接觸計算機編程的入門。哥當年寫第一行代碼的時候別提有多痛苦。 本文旨在用一篇文章說透爬蟲如何自學可以達到找工作的要求。 爬蟲的學習就是跟著實際項目去學,每個項目會涉及到不同的知識點,項目做多了,自然...
摘要:微信知乎新浪等主流網站的模擬登陸爬取方法摘要微信知乎新浪等主流網站的模擬登陸爬取方法。先說說很難爬的知乎,假如我們想爬取知乎主頁的內容,就必須要先登陸才能爬,不然看不到這個界面。圖片描述知乎需要手機號才能注冊登陸。 微信、知乎、新浪等主流網站的模擬登陸爬取方法摘要:微信、知乎、新浪等主流網站的模擬登陸爬取方法。 網絡上有形形色色的網站,不同類型的網站爬蟲策略不同,難易程度也不一樣。從是...
摘要:方法不僅適用于百度云,別的一些比較難以模擬登陸的網站都可以按照這種方式分析。本文要求讀者具有模擬登陸主要是抓包和閱讀代碼和密碼學的基本知識。和模擬登陸微博的分析流程一樣,我們首先要做的是以正常人的流程完整的登錄一遍百度網盤。 這是第二篇從簡書搬運過來的文章(大家別誤會,是我原創的)。因為前一篇文章,我看反響還挺好的,所以把這篇也搬運過來了,其實目的還是為宣傳自己的分布式微博爬蟲(該項目...
摘要:它也會在同一個實例發出的所有請求之間保持,期間使用的功能。而主要是方便解析源碼,從中獲取請求需要的一些參數完整代碼請輸入賬號請輸入密碼項目地址模擬京東登錄吐槽群 Python 爬蟲之模擬登陸CSND 工具 基本的腳本語言是Python,雖然不敢說是最好的語言,至少是最好的之一(0.0),用模擬登陸,我們需要用到多個模塊,如下: requests BeautifulSoup requ...
閱讀 2256·2021-11-25 09:43
閱讀 3123·2021-10-14 09:42
閱讀 3484·2021-10-12 10:12
閱讀 1526·2021-09-07 10:17
閱讀 1901·2019-08-30 15:54
閱讀 3181·2019-08-30 15:54
閱讀 1550·2019-08-30 15:53
閱讀 1908·2019-08-29 11:21