リーリー
この記事は、segmentfault に対する私の回答から来ており、興奮した部分をこのブログに記録しました。
一般的な意味は、segmentfault.com へのログインをシミュレートすることですが、しばらくの間手がかゆくなります。この記事は、この操作を誰もが理解できるようにガイドします。
これは非常に良い質問ですが、皆さんの回答がすべて議論のない単なる机上の空論であるのは残念です。実際にはパケットキャプチャツールを放棄すると言っていますが、これはばかげています。アカウントのパスワードが直接表示されます。 Chrome で F12 を押します。クリア テキストで送信されたパケットをキャプチャする必要があるのはなぜですか?他の件名の http ヘッダーは chrome からコピーされます。
私の判断によれば、問題の原因は大量の http ヘッダーを送信していることであり、その Content-Length
は明らかに問題です。今回キャプチャしたパケットは 49 でしたが、アカウントを変更するのは非常に困難です。次回からは必ずパスワードです。たとえば、アカウントのパスワードが長すぎる場合、切り詰められる可能性があり、いずれにしても間違ったパスワードが要求されます (パスワードの一部のみが送信されるため)。
実際、この興味深い質問を調査するために、私は興味深い実験を実施しました。
ここでは最も単純なスクリプト言語node.js
中的ajax
モデルを使用して操作プロセスを再構築します。
まず、ログイン ページ (ソース コード ページ) に移動して、大まかに見てみましょう。 リーリー
このクロスドメインリクエストは、名前から判断すると、ログインに関連しているはずです。結果は混乱しています。命名規則によれば、圧縮前の名前は
であると推測されますが、うーん、まだ残っていますが、発行元は Virgo ではないようです。 login.js
,我们看下他删除了没有,我们尝试访问https://dfnjy7g2qaazm.cloudfront.net/v-575e20ec/user/script/login.js
それでは、ここを見てみましょう:
リーリー
/api/user/login
,即https://segmentfault.com/api/user/login
リクエストヘッダー
https://segmentfault.com/user/login
にアクセスし、F12 キーを押して、network
パネルを選択してリクエストの監視を開始します。 、その後、アカウントとパスワードを任意に入力し、クリックしてログインします。 リクエストヘッダー
を抽出します
リーリー
https://segmentfault.com/user/login
,按下F12,选择network
面板开始监控请求,然后我们随意填写账号密码,点击登陆。
这个时候下面会有一条信息,我们提取其中的Request Header
これらのリクエストを同じ方法でサーバーに送信するだけで済みます。理論的には問題はなく、404 は発生しません。
1つずつテストできます。
デバッグ
プロセスの詳細は説明しませんが、結果は次のとおりです。
_
必须和Cookie
中的PHPSESSID
X-Requested-With
的值需要带ajax请求标志,即XMLHttpRequest
Referer
の値
ソースコード
リーリー
最初の部分は暗号化されていません、可能性の90%はCookieによって引き起こされます
あなたに提案をしてください:この GET パラメーターも非常に重要です
_
Charles を使用して HTTPS パケットをキャプチャできます。http://www.tuicool.com/articles/JfEZr23 を参照してください。パスワードがフロントエンドで JS で暗号化されている場合は、暗号化コードを確認できます。暗号化アルゴリズムも確認でき、このアルゴリズムの暗号化をシミュレートすることもできます。私も以前、チャイナモバイルのウェブサイトをクロールしたときにこの問題に遭遇しました
看原始http请求
<code>$ch = curl_init(); $url = "https://segmentfault.com/api/user/login?_=259f90fcf626f304c69c52db1454f03e"; $data = array( 'mail' => '***', 'password' => '**', ); foreach ($data as $key => $value){ $postfields .= urlencode($key) . '=' . urlencode($value) . '&'; } $postfields = rtrim($postfields, '&'); $headers = array( 'Accept:*/*', 'Accept-Encoding:gzip, deflate', 'Accept-Language:zh-CN,zh;q=0.8', 'Connection:keep-alive', 'Content-Type:application/x-www-form-urlencoded; charset=UTF-8', 'Cookie:mp_18fe57584af9659dea732cf41c1c0416_mixpanel=%7B%22distinct_id%22%3A%20%22153c6c3ec0c91-04fd9c038-12771e2d-1fa400-153c6c3ec0d18a%22%2C%22%24initial_referrer%22%3A%20%22%24direct%22%2C%22%24initial_referring_domain%22%3A%20%22%24direct%22%7D; editor-code-detect-disabled=1; PHPSESSID=web2~oag2uol7e47i88hp6t6uqac9b0; Hm_lvt_e23800c454aa573c0ccb16b52665ac26=1465290769,1465713371,1465781816,1465866651; Hm_lpvt_e23800c454aa573c0ccb16b52665ac26=1465867161; _ga=GA1.2.1469164019.1455850659; _gat=1', 'Host:segmentfault.com', 'Origin:https://segmentfault.com', 'Referer:https://segmentfault.com/', 'User-Agent:Mozilla/5.0 (X11; Linux i686 (x86_64)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.97 Safari/537.36', 'X-Requested-With:XMLHttpRequest', ); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields); //curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_ENCODING, ""); $result = curl_exec($ch); curl_close($ch); var_dump($result);</code>
至少得先保存个cookie在登录吧
之前写过一个
51job
的模拟登录并投递简历的demo,代码如下,可参考
<code class="php"><?php // 首先引入zend框架(官网地址:http://www.zend.com/) require_once 'Zend/Loader.php'; Zend_Loader::loadClass('Zend_Http_Client'); $client = new Zend_Http_Client(); $client->setCookieJar(); /** * 登录 */ //$client->setHeaders('Set-cookie', $response->getHeader('Set-cookie')); $client->setUri('http://my.51job.com/my/passport_login.php'); $client->setMethod('POST'); $client->setParameterPost(array( 'from_domain' => 'www.51job.com', 'passport_loginName' => '*****', // 账号 'passport_password' => '***' // 密码 )); $res = $client->request(); /** * 投简历 */ $client->setUri('http://my.51job.com/sc/sendtwo/send_resume_new.php'); $client->setHeaders('Host', 'my.51job.com'); $client->setHeaders('Cookie', $res->getHeader('Set-cookie')); $client->setMethod('GET'); $client->setParameterGet(array( 'isEN' => '0', 'rsmid' => '337097130', 'deflang' => '0', 'coverid' => '', 'jsoncallback' => 'jsonp1447931687767', '_' => '1447931692678', 'jobiduni' => '(73015544)', //括号里面为职位id )); $rs = $client->request(); print_r($rs);</code>
不错,问题具有代表性
既然是https,那为啥不加上curl的https选项
应该是密码在前端做了hash加密,你可以抓个包看下