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实现模拟登陆正方教务系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 石英加速度计的工作原理
- 下一篇: LAD线性判别模型简介及sklearn参