ホームページ > バックエンド開発 > PHPチュートリアル > PHPでcurlを使用してログインセグメントフォールトをシミュレートするにはどうすればよいですか?

PHPでcurlを使用してログインセグメントフォールトをシミュレートするにはどうすればよいですか?

WBOY
リリース: 2016-07-06 13:53:27
オリジナル
1134 人が閲覧しました

リーリー

返信内容:

リーリー

はじめに

この記事は、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それでは、ここを見てみましょう:
リーリー

コードは非常に単純です。リクエスト結果のステータスが 0 の場合、ログインが成功したことを意味します。同時に、バックグラウンドで実行されるログイン リクエスト ページにアクセスしてみましょう。 404になります。これは、サーバーが入力を検証し、リクエストが通常のロジックに準拠していないと判断したことを示しています。次に、リクエスト ヘッダーの作成を開始します。

/api/user/login,即https://segmentfault.com/api/user/loginリクエストヘッダー

Chrome に似た最新のブラウザを使用しています。通常は https://segmentfault.com/user/login にアクセスし、F12 キーを押して、network パネルを選択してリクエストの監視を開始します。 、その後、アカウントとパスワードを任意に入力し、クリックしてログインします。

この時点で以下のメッセージが表示されるので、次のようにリクエストヘッダーを抽出します

リーリー https://segmentfault.com/user/login,按下F12,选择network面板开始监控请求,然后我们随意填写账号密码,点击登陆。
这个时候下面会有一条信息,我们提取其中的Request Headerこれらのリクエストを同じ方法でサーバーに送信するだけで済みます。理論的には問題はなく、404 は発生しません。

ここにあるデータの中には、送信する必要がないものと、送信する必要があるものがあります。

1つずつテストできます。

デバッグ

ここでは、サーバーによって検証されたパラメーターをテストするためのコードを単純に記述するために、nodejs を使用します。

退屈なテストは、リクエストを削除し続けて、サーバーが 404 を返すかどうかを確認することです。

プロセスの詳細は説明しませんが、結果は次のとおりです。

    クエリ文字列の
  1. に対応します。

    _必须和Cookie中的PHPSESSID

  2. X-Requested-With的值需要带ajax请求标志,即XMLHttpRequest

  3. Refererの値

  4. サーバーがかなり厳しいようです。

ソースコード

リーリー

同時に、オープンソースはGitHubのアドレスsegmentfault_loginerにあります

PHPでcurlを使用してログインセグメントフォールトをシミュレートするにはどうすればよいですか?最初の部分は暗号化されていません、可能性の90%はCookieによって引き起こされます

あなたに提案をしてください:

1. https://segmentfault.com/ にアクセスして Cookie を取得します

2. 次に、投稿を送信します

この 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加密,你可以抓个包看下

関連ラベル:
php
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート