日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

php模拟登陆,php实现模拟登陆正方教务系统

發布時間:2024/3/12 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php模拟登陆,php实现模拟登陆正方教务系统 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文主要介紹通過php的curl庫實現正方教務系統的登陸,由于正方教務系統每年可能會有一些更新,因此本文是針對2018年而言,所介紹一些模擬登陸正方的方法,希望能幫助到大家。

1.保存登陸界面的驗證碼和Cookie

內容如下

我們可以看到這樣一個請求,從名字可以看出來這個就是頁面的驗證碼,是訪問登錄界面的時候從正方服務器返回的。我參考其他大佬的博客說的是可以攔截驗證碼,不需要輸,但是我測試幾次發現并不行,因此我感覺正方應該是修復了這個bug,所以我們還是老實輸個驗證碼吧。

還需要注意的是上圖中有一個參數Cookie,這個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的同學應該可以看懂這段代碼的意思。首先創建一個session,我們把每次獲取到的cookie保存在文件夾內,通過訪問域名來獲取cookie和返回的驗證碼。驗證碼的手動填寫就是我們創建一個code.txt文件,我們在文件夾內看到驗證碼圖片以后手動在code.txt文件中寫出來,十五秒以后我們就給正方服務器發送請求。

2.找到發請求的服務器以及需要的參數

可以看到一個POST請求,其中我們在上圖中要注意的一個消息頭是Referer,這個消息頭的作用是為了防止CSRF,至于CSRF,我將會在末尾闡述。下面看看POST參數:

大部分參數大家應該猜得到,空內容的參數我就不多說了,需要說的一點是_VIEWSTATE和RadioButtonList1。

第一個參數是當前頁面的狀態,這個字符串是為了驗證我們是從登陸界面過來的,這個參數在登錄頁面的源碼里面,我們通過正則把它摳出來。

第二個參數是按鈕的類型,內容是一個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('//', $con1, $view); //獲取__VIEWSTATE字段并存到$view數組中

$post=array( '__VIEWSTATE'=>$view[1][0], 'txtUserName'=>$xh, 'TextBox2'=>$pw, 'txtSecretCode'=>$code, 'RadioButtonList1'=>'%D1%A7%C9%FA', //“學生”的gbk編碼

'Button1'=>'', 'lbLanguage'=>'', 'hidPdrs'=>'', 'hidsc'=>''

); $con2=login_post($url,$cookie,http_build_query($post)); //將數組連接成字符串

到了這里我們就可以訪問我們的php文件了,如果你的內容如下,那么恭喜你,你已經成功登陸了正方。

3.實現訪問課表功能

前面已經說了,我們就算成功登陸了,也無法進行里面的功能操作,因為每一個板塊都需要不同的參數,或者不同的請求地址,因此我這里介紹一下訪問成績的一個功能。

進入成績查詢板塊,我們看看請求地址和參數。

參數如下:

這幾個參數的話大家應該可以看得懂,唯一一個就是gnmkdm,這個參數的內容是一個隨機生成的字符串,不是必須參數。其他幾個前面基本上已經講過了,_VEIWSTATE跟之前獲取的方法一樣。下面給代碼。preg_match_all('/([^<>]+)/', $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,'');

preg_match_all('//', $viewstate, $vs); $state=$vs[1][0]; //$state存放一會post的__VIEWSTATE

//每個頁面都有不同的參數請求,根據不同情況來發送不同的參數

$post=array( '__EVENTTARGET'=>'', '__EVENTARGUMENT'=>'', '__VIEWSTATE'=>$state, 'hidLanguage'=>'', 'ddlXN'=>'2016-2017', //當前學年

'ddlXQ'=>'1', //當前學期

'ddl_kcxz'=>'', 'Button1'=>'%B0%B4%D1%A7%C6%DA%B2%E9%D1%AF' //“學期成績”的gbk編碼,視情況而定

); $content=login_post($url2,$cookie,http_build_query($post)); echo $content;

好了,代碼給完了,如果你的頁面顯示如下,那么你就成功了。

4.總結

其實也就是登陸的時候麻煩一些,進去以后,必須要的兩個參數Cookie和_VIEWSTATE,其他的參數就自己去每個POST請求看看,然后根據請求格式組合一下就行了,上面的代碼跑起來不會報錯,各位同學copy下來運行一下看看。但是過了幾年看正方會不會修復漏洞,之前看其他博客時間間隔都太久了,因此自己寫一篇18年的,如果還有不明白的地方各位可以私信我,或者評論區留言,歡迎討論。

5.關于CSRF

所謂CSRF,就是跨站點偽造,也就是說別人盜用你的身份去對服務器發送請求,之前提到一個請求消息頭Referer就是防御這個攻擊,意思是說,我們如果要成功登陸正方教務系統,就要求我們必須通過登錄界面的那個頁面跳轉過來,也就是說跳轉之前的地址必須是http://jwgl.hbpu.edu.cn/。大家測試的時候用自己大學的教務系統,因為這個地址是我所在大學的教務系統,通過我的學號密碼才能成功登陸。最后貼出一片關于CSRF攻擊的博客,一個大佬寫的。詳細描述CSRF。(點擊下面鏈接)

CSRF攻防

php模擬登陸正方教務系統(2018年)

本文主要介紹通過php的curl庫實現正方教務系統的登陸,由于正方教務系統每年可能會有一些更新,因此本文是針對2018年而言,所介紹一些模擬登陸正方的方法。

1.保存登陸界面的驗證碼和Cookie

內容如下

我們可以看到這樣一個請求,從名字可以看出來這個就是頁面的驗證碼,是訪問登錄界面的時候從正方服務器返回的。我參考其他大佬的博客說的是可以攔截驗證碼,不需要輸,但是我測試幾次發現并不行,因此我感覺正方應該是修復了這個bug,所以我們還是老實輸個驗證碼吧。

還需要注意的是上圖中有一個參數Cookie,這個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的同學應該可以看懂這段代碼的意思。首先創建一個session,我們把每次獲取到的cookie保存在文件夾內,通過訪問域名來獲取cookie和返回的驗證碼。驗證碼的手動填寫就是我們創建一個code.txt文件,我們在文件夾內看到驗證碼圖片以后手動在code.txt文件中寫出來,十五秒以后我們就給正方服務器發送請求。

2.找到發請求的服務器以及需要的參數

可以看到一個POST請求,其中我們在上圖中要注意的一個消息頭是Referer,這個消息頭的作用是為了防止CSRF,至于CSRF,我將會在末尾闡述。下面看看POST參數:

大部分參數大家應該猜得到,空內容的參數我就不多說了,需要說的一點是_VIEWSTATE和RadioButtonList1。

第一個參數是當前頁面的狀態,這個字符串是為了驗證我們是從登陸界面過來的,這個參數在登錄頁面的源碼里面,我們通過正則把它摳出來。

第二個參數是按鈕的類型,內容是一個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('//', $con1, $view); //獲取__VIEWSTATE字段并存到$view數組中

$post=array( '__VIEWSTATE'=>$view[1][0], 'txtUserName'=>$xh, 'TextBox2'=>$pw, 'txtSecretCode'=>$code, 'RadioButtonList1'=>'%D1%A7%C9%FA', //“學生”的gbk編碼

'Button1'=>'', 'lbLanguage'=>'', 'hidPdrs'=>'', 'hidsc'=>''

); $con2=login_post($url,$cookie,http_build_query($post)); //將數組連接成字符串

到了這里我們就可以訪問我們的php文件了,如果你的內容如下,那么恭喜你,你已經成功登陸了正方。

3.實現訪問課表功能

前面已經說了,我們就算成功登陸了,也無法進行里面的功能操作,因為每一個板塊都需要不同的參數,或者不同的請求地址,因此我這里介紹一下訪問成績的一個功能。

進入成績查詢板塊,我們看看請求地址和參數。

參數如下:

這幾個參數的話大家應該可以看得懂,唯一一個就是gnmkdm,這個參數的內容是一個隨機生成的字符串,不是必須參數。其他幾個前面基本上已經講過了,_VEIWSTATE跟之前獲取的方法一樣。下面給代碼。preg_match_all('/([^<>]+)/', $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,'');

preg_match_all('//', $viewstate, $vs); $state=$vs[1][0]; //$state存放一會post的__VIEWSTATE

//每個頁面都有不同的參數請求,根據不同情況來發送不同的參數

$post=array( '__EVENTTARGET'=>'', '__EVENTARGUMENT'=>'', '__VIEWSTATE'=>$state, 'hidLanguage'=>'', 'ddlXN'=>'2016-2017', //當前學年

'ddlXQ'=>'1', //當前學期

'ddl_kcxz'=>'', 'Button1'=>'%B0%B4%D1%A7%C6%DA%B2%E9%D1%AF' //“學期成績”的gbk編碼,視情況而定

); $content=login_post($url2,$cookie,http_build_query($post)); echo $content;

好了,代碼給完了,如果你的頁面顯示如下,那么你就成功了。

4.總結

其實也就是登陸的時候麻煩一些,進去以后,必須要的兩個參數Cookie和_VIEWSTATE,其他的參數就自己去每個POST請求看看,然后根據請求格式組合一下就行了,上面的代碼跑起來不會報錯,各位同學copy下來運行一下看看。但是過了幾年看正方會不會修復漏洞,之前看其他博客時間間隔都太久了,因此自己寫一篇18年的,如果還有不明白的地方各位可以私信我,或者評論區留言,歡迎討論。

5.關于CSRF

所謂CSRF,就是跨站點偽造,也就是說別人盜用你的身份去對服務器發送請求,之前提到一個請求消息頭Referer就是防御這個攻擊,意思是說,我們如果要成功登陸正方教務系統,就要求我們必須通過登錄界面的那個頁面跳轉過來,也就是說跳轉之前的地址必須是http://jwgl.hbpu.edu.cn/。大家測試的時候用自己大學的教務系統,因為這個地址是我所在大學的教務系統,通過我的學號密碼才能成功登陸。最后貼出一片關于CSRF攻擊的博客,一個大佬寫的。詳細描述CSRF。(點擊下面鏈接)

CSRF攻防。

相關推薦:

總結

以上是生活随笔為你收集整理的php模拟登陆,php实现模拟登陆正方教务系统的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。