ホームページ >バックエンド開発 >PHPチュートリアル >PHP は正方学務システムへの模擬ログインを実装します

PHP は正方学務システムへの模擬ログインを実装します

小云云
小云云オリジナル
2018-03-30 13:51:055048ブラウズ

この記事では、主に PHP のカールライブラリを使用した正方学務システムのログインについて紹介します。正方学事システムは毎年更新される可能性があるため、この記事は 2018 年のものです。正方学務システムへのログインをシミュレートする方法をいくつか紹介します。みんなを助けることができます。


1.ログインインターフェースの認証コードとCookieを保存します

PHP は正方学務システムへの模擬ログインを実装します

内容は以下の通りです
PHP は正方学務システムへの模擬ログインを実装します
名前からもわかるように、これはの認証コードです。ページ。ログイン インターフェイスにアクセスするときに Zhengfang サーバーから返されるページです。検証コードを入力しなくても傍受できるという他の専門家のブログを参考にしましたが、何度か試しましたが機能しないことがわかりました。したがって、Zhengfang はこのバグを修正する必要があると感じています。認証コードを正直に入力してください。

また、上の図には Cookie というパラメーターがあることにも注意してください。この Cookie はページにアクセスするたびに返されますが、この Cookie はログインが成功した後にのみ有効になるため、これを保存する必要があります。教育管理システムで実行されるすべての操作はこの Cookie を検証します。これは本人確認に相当するため、この Cookie は必須です。

以下では、php を使用して Cookie と確認コードをローカルに保存します。

    session_start();    $id=session_id();    $_SESSION['id']=$id;    $cookie = dirname(__FILE__) . '/cookie/'.$_SESSION['id'].'.txt'; //cookie路径,将cookie写入一个文件中

    $verify_code_url = "http://jwgl.hbpu.edu.cn/CheckCode.aspx"; //验证码地址
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $verify_code_url);
    curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie);  //保存cookie
    curl_setopt($curl, CURLOPT_HEADER, 0);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);    $img = curl_exec($curl);  //执行curl
    curl_close($curl);    $fp = fopen("verifyCode.jpg","w");  //文件名
    fwrite($fp,$img);  //写入文件
    fclose($fp);
    echo "验证码取出完成,正在休眠,15秒内请把验证码填入code.txt并保存\n";    //停止运行15秒
    sleep(15);

php に精通している学生なら、このコードの意味を理解できるはずです。まずセッションを作成し、毎回取得するCookieをフォルダーに保存し、ドメイン名にアクセスしてCookieと返された認証コードを取得します。検証コードを手動で入力するには、フォルダー内に検証コードの画像が表示された後、 code.txt ファイルを作成し、15 秒後にリクエストを送信します。正方サーバー。

2. リクエストを送信したサーバーと必要なパラメータを見つけます。

PHP は正方学務システムへの模擬ログインを実装します
上の図で注目すべきヘッダーの 1 つは、このヘッダーの目的です。 CSRFについては最後に説明します。 POST パラメータを見てみましょう: ほとんどのパラメータは推測できるはずですが、言及する必要があるのは _VIEWSTATE と RadioButtonList1 です。
最初のパラメータは現在のページのステータスであり、この文字列がログイン ページのソース コードに含まれていることを確認するために正規表現を使用します。 PHP は正方学務システムへの模擬ログインを実装します 2 番目のパラメータはボタンのタイプで、内容は GBK コードです。私のタイプは学生です。

function login_post($url,$cookie,$post){
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);  //不自动输出数据,要echo才行
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);  //重要,抓取跳转后数据
        curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);
        curl_setopt($ch, CURLOPT_REFERER, 'http://jwgl.hbpu.edu.cn/');  //重要,302跳转需要referer,可以在Request Headers找到
        curl_setopt($ch, CURLOPT_POSTFIELDS,$post);  //post提交数据
        $result=curl_exec($ch);
        curl_close($ch);        return $result;
    }    $xh='';//此处手动输入学号,上线后通过$_POST得到
    $pw='';//此处手动输入密码,上线后通过$_POST得到
    $code = file_get_contents("code.txt");//把验证码输入到code.txt中后通过此方法取出验证码
    $cookie = dirname(__FILE__) . '/cookie/'.$_SESSION['id'].'.txt';//取出cookie
    $url="http://jwgl.hbpu.edu.cn/default2.aspx";  //教务处地址
    $con1=login_post($url,$cookie,'');
    preg_match_all(&#39;/<input type="hidden" name="__VIEWSTATE" value="([^<>]+)" \/>/&#39;, $con1, $view); //获取__VIEWSTATE字段并存到$view数组中
    $post=array(        &#39;__VIEWSTATE&#39;=>$view[1][0],        &#39;txtUserName&#39;=>$xh,        &#39;TextBox2&#39;=>$pw,        &#39;txtSecretCode&#39;=>$code,        &#39;RadioButtonList1&#39;=>&#39;%D1%A7%C9%FA&#39;,  //“学生”的gbk编码
        &#39;Button1&#39;=>&#39;&#39;,        &#39;lbLanguage&#39;=>&#39;&#39;,        &#39;hidPdrs&#39;=>&#39;&#39;,        &#39;hidsc&#39;=>&#39;&#39;
    );    $con2=login_post($url,$cookie,http_build_query($post)); //将数组连接成字符串

この時点で、php ファイルにアクセスできます。コンテンツが次のようであれば、おめでとうございます。Zhengfang に正常にログインできました。


3. 授業スケジュールにアクセスする機能を実装しますPHP は正方学務システムへの模擬ログインを実装します

前述したように、ログインに成功したとしても、各セクションで必要なパラメータやリクエストアドレスが異なるため、内部の機能的な操作を実行することはできません。スコアにアクセスする機能を導入します。


スコアクエリセクションに入り、リクエストアドレスとパラメータを見てみましょう。


パラメータは次のとおりです:
PHP は正方学務システムへの模擬ログインを実装します
これらのパラメータは gnmkdm のみが理解できるはずであり、このパラメータの内容はランダムに生成される文字列であり、必須パラメータではありません。他のものは基本的に前述したとおりで、_VEIWSTATE は以前に取得したメソッドと同じです。コードを以下に示します。

preg_match_all(&#39;/<span id="xhxm">([^<>]+)/&#39;, $con2, $xm);   //正则出的数据存到$xm数组中
    $xm[1][0]=substr($xm[1][0],0,-4);  //字符串截取,获得姓名

    //拼接所需要访问的url,我们需要获取哪个url就去拼接完整的url,此处是获取成绩的url
    //以后如果需要获取别的数据,就去官网找他的url,看需要哪些参数
    $url2="http://jwgl.hbpu.edu.cn/xscj_gc.aspx?xh=".$xh."&xm=".$xm[1][0];    $viewstate=login_post($url2,$cookie,&#39;&#39;);
    preg_match_all(&#39;/<input type="hidden" name="__VIEWSTATE" value="([^<>]+)" \/>/&#39;, $viewstate, $vs);    $state=$vs[1][0];  //$state存放一会post的__VIEWSTATE

    //每个页面都有不同的参数请求,根据不同情况来发送不同的参数
    $post=array(           &#39;__EVENTTARGET&#39;=>&#39;&#39;,           &#39;__EVENTARGUMENT&#39;=>&#39;&#39;,           &#39;__VIEWSTATE&#39;=>$state,           &#39;hidLanguage&#39;=>&#39;&#39;,           &#39;ddlXN&#39;=>&#39;2016-2017&#39;,  //当前学年
           &#39;ddlXQ&#39;=>&#39;1&#39;,  //当前学期
           &#39;ddl_kcxz&#39;=>&#39;&#39;,           &#39;Button1&#39;=>&#39;%B0%B4%D1%A7%C6%DA%B2%E9%D1%AF&#39;  //“学期成绩”的gbk编码,视情况而定
        );    $content=login_post($url2,$cookie,http_build_query($post));    echo $content;
PHP は正方学務システムへの模擬ログインを実装しますOK、コードは完了です。ページが次のように表示されれば成功です。


4. まとめPHP は正方学務システムへの模擬ログインを実装します

実は、ログインする際は少し面倒です。入力後、必要なパラメータ Cookie と _VIEWSTATE が必要になります。その他のパラメータについては、各 POST リクエストを自分で確認して、結合するだけです。上記のコードは、実行時にエラーを報告しません。それをコピーして実行して確認してください。しかし、数年後、Zhengfangが抜け穴を修正するかどうかを確認します。以前に他のブログを読む間隔が長すぎたので、18年間の記事を書きます。まだ何も理解できない場合は、送信してください。私にプライベートメッセージを送っていただくか、コメント欄にメッセージを残してください。

5. CSRF について

いわゆる CSRF は、他の誰かがあなたの ID を盗んでサーバーにリクエストを送信することを意味します。これは、この攻撃を防御するためのものです。私たちは成功したいです 正方学務システムにログインするには、ログイン インターフェースのページをジャンプする必要があります。つまり、ジャンプする前のアドレスは http://jwgl.hbpu.edu.cn/ である必要があります。テスト時には、全員が自分の大学の学務システムを使用します。これは、このアドレスが私の大学の学務システムであり、学生 ID とパスワードを使用して正常にログインできるためです。最後に、大物が書いた CSRF 攻撃に関するブログを投稿しました。 CSRFについて詳しく説明します。 (下のリンクをクリックしてください)
CSRFの攻撃と防御

phpによる正方学事システムへの模擬ログイン(2018)

この記事では主に、正方学事以来のphpのcurlライブラリを介した正方学事システムへのログインについて紹介しています。事務システムは毎年更新される可能性があります。この記事では、2018 年に正坊への着陸をシミュレートするいくつかの方法を紹介します。


1.ログインインターフェースの認証コードとCookieを保存します

PHP は正方学務システムへの模擬ログインを実装します
内容は以下の通りです
PHP は正方学務システムへの模擬ログインを実装します
名前からもわかるように、これはページの認証コードです。これは、サーバーから返されたログイン インターフェイスにアクセスするときの正しい方向です。検証コードを入力しなくても傍受できるという他の専門家のブログを参考にしましたが、何度か試しましたが機能しないことがわかりました。したがって、Zhengfang はこのバグを修正する必要があると感じています。認証コードを正直に入力してください。

また、上の図には Cookie というパラメーターがあることにも注意してください。この Cookie はページにアクセスするたびに返されますが、この Cookie はログインが成功した後にのみ有効になるため、この Cookie を保存する必要があります。私たちは学務を行っているため、システム内で実行されるすべての操作はこの Cookie を検証します。これは本人確認に相当するため、この Cookie は必須です。



以下では、php を使用して Cookie と確認コードをローカルに保存します。

    session_start();    $id=session_id();    $_SESSION[&#39;id&#39;]=$id;    $cookie = dirname(__FILE__) . &#39;/cookie/&#39;.$_SESSION[&#39;id&#39;].&#39;.txt&#39;; //cookie路径,将cookie写入一个文件中

    $verify_code_url = "http://jwgl.hbpu.edu.cn/CheckCode.aspx"; //验证码地址
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $verify_code_url);
    curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie);  //保存cookie
    curl_setopt($curl, CURLOPT_HEADER, 0);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);    $img = curl_exec($curl);  //执行curl
    curl_close($curl);    $fp = fopen("verifyCode.jpg","w");  //文件名
    fwrite($fp,$img);  //写入文件
    fclose($fp);
    echo "验证码取出完成,正在休眠,15秒内请把验证码填入code.txt并保存\n";    //停止运行15秒
    sleep(15);

php に精通している学生なら、このコードの意味を理解できるはずです。まずセッションを作成し、毎回取得するCookieをフォルダーに保存し、ドメイン名にアクセスしてCookieと返された認証コードを取得します。検証コードを手動で入力するには、フォルダー内に検証コードの画像が表示された後、 code.txt ファイルを作成し、15 秒後にリクエストを送信します。正方サーバー。

2. リクエストを送信したサーバーと必要なパラメータを見つけます。

PHP は正方学務システムへの模擬ログインを実装します
上の図で注目すべきヘッダーの 1 つは、このヘッダーの目的です。 CSRFについては最後に説明します。 POST パラメータを見てみましょう: ほとんどのパラメータは推測できるはずですが、言及する必要があるのは _VIEWSTATE と RadioButtonList1 です。
最初のパラメータは現在のページのステータスであり、この文字列がログイン ページのソース コードに含まれていることを確認するために正規表現を使用します。 PHP は正方学務システムへの模擬ログインを実装します 2 番目のパラメータはボタンのタイプで、内容は GBK コードです。私のタイプは学生です。

function login_post($url,$cookie,$post){
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);  //不自动输出数据,要echo才行
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);  //重要,抓取跳转后数据
        curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);
        curl_setopt($ch, CURLOPT_REFERER, &#39;http://jwgl.hbpu.edu.cn/&#39;);  //重要,302跳转需要referer,可以在Request Headers找到
        curl_setopt($ch, CURLOPT_POSTFIELDS,$post);  //post提交数据
        $result=curl_exec($ch);
        curl_close($ch);        return $result;
    }    $xh=&#39;&#39;;//此处手动输入学号,上线后通过$_POST得到
    $pw=&#39;&#39;;//此处手动输入密码,上线后通过$_POST得到
    $code = file_get_contents("code.txt");//把验证码输入到code.txt中后通过此方法取出验证码
    $cookie = dirname(__FILE__) . &#39;/cookie/&#39;.$_SESSION[&#39;id&#39;].&#39;.txt&#39;;//取出cookie
    $url="http://jwgl.hbpu.edu.cn/default2.aspx";  //教务处地址
    $con1=login_post($url,$cookie,&#39;&#39;);
    preg_match_all(&#39;/<input type="hidden" name="__VIEWSTATE" value="([^<>]+)" \/>/&#39;, $con1, $view); //获取__VIEWSTATE字段并存到$view数组中
    $post=array(        &#39;__VIEWSTATE&#39;=>$view[1][0],        &#39;txtUserName&#39;=>$xh,        &#39;TextBox2&#39;=>$pw,        &#39;txtSecretCode&#39;=>$code,        &#39;RadioButtonList1&#39;=>&#39;%D1%A7%C9%FA&#39;,  //“学生”的gbk编码
        &#39;Button1&#39;=>&#39;&#39;,        &#39;lbLanguage&#39;=>&#39;&#39;,        &#39;hidPdrs&#39;=>&#39;&#39;,        &#39;hidsc&#39;=>&#39;&#39;
    );    $con2=login_post($url,$cookie,http_build_query($post)); //将数组连接成字符串

この時点で、php ファイルにアクセスできます。コンテンツが次のようであれば、おめでとうございます。Zhengfang に正常にログインできました。


3. 授業スケジュールにアクセスする機能を実装しますPHP は正方学務システムへの模擬ログインを実装します

前述したように、ログインに成功したとしても、各セクションで必要なパラメータやリクエストアドレスが異なるため、内部の機能的な操作を実行することはできません。スコアにアクセスする機能を導入します。


スコアクエリセクションに入り、リクエストアドレスとパラメータを見てみましょう。


パラメータは次のとおりです:
PHP は正方学務システムへの模擬ログインを実装します
これらのパラメータは gnmkdm のみが理解できるはずであり、このパラメータの内容はランダムに生成される文字列であり、必須パラメータではありません。他のものは基本的に前述したとおりで、_VEIWSTATE は以前に取得したメソッドと同じです。コードを以下に示します。

preg_match_all(&#39;/<span id="xhxm">([^<>]+)/&#39;, $con2, $xm);   //正则出的数据存到$xm数组中
    $xm[1][0]=substr($xm[1][0],0,-4);  //字符串截取,获得姓名

    //拼接所需要访问的url,我们需要获取哪个url就去拼接完整的url,此处是获取成绩的url
    //以后如果需要获取别的数据,就去官网找他的url,看需要哪些参数
    $url2="http://jwgl.hbpu.edu.cn/xscj_gc.aspx?xh=".$xh."&xm=".$xm[1][0];    $viewstate=login_post($url2,$cookie,&#39;&#39;);
    preg_match_all(&#39;/<input type="hidden" name="__VIEWSTATE" value="([^<>]+)" \/>/&#39;, $viewstate, $vs);    $state=$vs[1][0];  //$state存放一会post的__VIEWSTATE

    //每个页面都有不同的参数请求,根据不同情况来发送不同的参数
    $post=array(           &#39;__EVENTTARGET&#39;=>&#39;&#39;,           &#39;__EVENTARGUMENT&#39;=>&#39;&#39;,           &#39;__VIEWSTATE&#39;=>$state,           &#39;hidLanguage&#39;=>&#39;&#39;,           &#39;ddlXN&#39;=>&#39;2016-2017&#39;,  //当前学年
           &#39;ddlXQ&#39;=>&#39;1&#39;,  //当前学期
           &#39;ddl_kcxz&#39;=>&#39;&#39;,           &#39;Button1&#39;=>&#39;%B0%B4%D1%A7%C6%DA%B2%E9%D1%AF&#39;  //“学期成绩”的gbk编码,视情况而定
        );    $content=login_post($url2,$cookie,http_build_query($post));    echo $content;
PHP は正方学務システムへの模擬ログインを実装しますOK、コードは完了です。ページが次のように表示されれば成功です。

4. まとめ

実は、ログインするときは少し面倒です。入力後、必要なパラメータ Cookie と _VIEWSTATE が必要です。その他のパラメータについては、各 POST リクエストを自分で確認し、それらを組み合わせるだけです。リクエスト形式を変更すると、上記のコードは実行時にエラーを報告しません。それをコピーして実行して確認してください。しかし、数年後、Zhengfangが抜け穴を修正するかどうかを確認します。以前に他のブログを読む間隔が長すぎたので、18年間の記事を書きます。まだ何も理解できない場合は、送信してください。私にプライベートメッセージを送っていただくか、コメント欄にメッセージを残してください。

5. CSRF について

いわゆる CSRF は、他の誰かがあなたの ID を盗んでサーバーにリクエストを送信することを意味します。これは、前述の Referer ヘッダーがこの攻撃を防御することを意味します。正方学事システムに正常にログインするには、ログイン インターフェースのページにジャンプする必要があります。つまり、ジャンプする前のアドレスは http://jwgl.hbpu.edu.cn/ である必要があります。テスト時には、全員が自分の大学の学務システムを使用します。これは、このアドレスが私の大学の学務システムであり、学生 ID とパスワードを使用して正常にログインできるためです。最後に、大物が書いた CSRF 攻撃に関するブログを投稿しました。 CSRFについて詳しく説明します。 (下のリンクをクリック)
CSRFの攻撃と防御。

関連の推奨事項:

教育管理システムに関する推奨記事 10 件

GPA を計算するために教育管理システムへのログインをシミュレートする小さなプログラム

php を使用して正方教育管理システムへのシミュレートされたログインを実装する

以上がPHP は正方学務システムへの模擬ログインを実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。