Maison > Article > développement back-end > PHP implémente une connexion simulée au système des affaires académiques de Zhengfang
Cet article présente principalement la connexion au Zhengfang Academic Affairs System via la bibliothèque curl de PHP. Étant donné que Zhengfang Academic Affairs System peut avoir des mises à jour chaque année, cet article concerne 2018. Il présente certaines méthodes de simulation de connexion à Zhengfang I. j'espère que cela pourra aider tout le monde.
Le contenu est le suivant
Nous pouvons le voir. Une requête, comme son nom l'indique, est le code de vérification de la page, qui est renvoyé par le serveur Zhengfang lors de l'accès à l'interface de connexion. Je fais référence aux blogs d'autres experts qui ont dit que le code de vérification peut être intercepté sans le saisir, mais je l'ai testé plusieurs fois et j'ai constaté qu'il ne fonctionnait pas. Par conséquent, je pense que Zhengfang aurait dû corriger ce bug, nous devrions donc. entrez honnêtement le code de vérification.
Il convient également de noter qu'il existe un paramètre Cookie dans l'image ci-dessus. Ce cookie sera renvoyé à chaque fois que vous visiterez la page, mais ce cookie ne prendra effet qu'une fois la connexion réussie, nous devons donc le sauvegarder. Ce cookie, car toutes les opérations que nous effectuons dans le système éducatif vérifieront ce cookie, ce qui équivaut à l'authentification de l'identité, ce cookie est donc essentiel.
Ci-dessous, j'utilise php pour enregistrer les cookies et les codes de vérification localement.
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);
Les étudiants qui connaissent PHP devraient être capables de comprendre la signification de ce code. Créez d'abord une session, nous enregistrons le cookie obtenu à chaque fois dans un dossier, et obtenons le cookie et le code de vérification renvoyé en accédant au nom de domaine. Pour remplir manuellement le code de vérification, nous créons un fichier code.txt. Après avoir vu l'image du code de vérification dans le dossier, nous l'écrivons manuellement dans le fichier code.txt. Après quinze secondes, nous enverrons une demande au. Serveur Zhengfang.
Vous pouvez voir une requête POST, dans laquelle l'un des en-têtes auxquels nous devons prêter attention l'image ci-dessus est Referer. Le but de cet en-tête de message est d'empêcher le CSRF. Quant au CSRF, j'y reviendrai à la fin. Jetons un coup d'œil aux paramètres POST :
Vous devriez être capable de deviner la plupart des paramètres. Je n'entrerai pas dans les détails sur les paramètres avec un contenu vide. Ce qu'il faut mentionner, c'est _VIEWSTATE. et RadioButtonList1.
Le premier paramètre est le statut de la page actuelle. Cette chaîne sert à vérifier que nous venons de l'interface de connexion. Ce paramètre est dans le code source de la page de connexion. Nous l'extrayons via des expressions régulières.
Le deuxième paramètre est le type de bouton, et le contenu est un encodage GBK. Mon type est étudiant.
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('/<input type="hidden" name="__VIEWSTATE" value="([^<>]+)" \/>/', $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)); //将数组连接成字符串
À ce stade, nous pouvons accéder à notre fichier php. Si votre contenu est le suivant, félicitations, vous vous êtes connecté avec succès à Zhengfang.
Comme mentionné précédemment, même si nous nous connectons avec succès, nous ne pouvons pas effectuer les opérations fonctionnelles à l'intérieur car chaque section le nécessite. différents paramètres, ou différentes adresses de requête, je vais donc introduire ici une fonction d'accès aux scores.
Entrez dans la section de requête de score et examinons l'adresse et les paramètres de la demande.
Les paramètres sont les suivants :
Tout le monde devrait pouvoir comprendre ces paramètres. Le seul est gnmkdm. Le contenu de ce paramètre est une chaîne générée aléatoirement. Ce n'est pas un paramètre obligatoire. Les autres ont été essentiellement mentionnés précédemment, _VEIWSTATE est la même que la méthode obtenue précédemment. Le code est donné ci-dessous.
preg_match_all('/<span id="xhxm">([^<>]+)/', $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('/<input type="hidden" name="__VIEWSTATE" value="([^<>]+)" \/>/', $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;
D'accord, le code est terminé. Si votre page s'affiche comme suit, alors vous avez réussi.
En fait, c'est un peu plus gênant lors de la connexion. Après avoir saisi, les deux paramètres nécessaires Cookie et _VIEWSTATE vous sont laissés. à chaque requête POST, puis combinez-le selon le format de la requête. Le code ci-dessus ne signalera pas d'erreur lors de l'exécution. Veuillez le copier et l'exécuter pour voir. Mais après quelques années, nous verrons si Zhengfang comblera les lacunes. L'intervalle de temps entre la lecture d'autres blogs était auparavant trop long, j'écrirai donc un article sur 18 ans. Si vous ne comprenez toujours pas quelque chose, vous pouvez l'envoyer. envoyez-moi un message privé ou laissez un message dans la zone de commentaire. Discussions bienvenues.
Le soi-disant CSRF est une contrefaçon intersite, ce qui signifie que quelqu'un d'autre vole votre identité pour envoyer une requête au serveur. L'en-tête Referer mentionné précédemment sert à se défendre contre cela. attaque, ce qui signifie que Saïd, si nous voulons nous connecter avec succès au système des affaires académiques de Zhengfang, nous devons passer par la page de l'interface de connexion, ce qui signifie que l'adresse avant le saut doit être http://jwgl.hbpu.edu.cn /. Lors des tests, chacun utilise le système d'administration académique de sa propre université, car cette adresse est le système d'administration académique de mon université et je peux me connecter avec succès via mon identifiant d'étudiant et mon mot de passe. Enfin, j'ai posté un blog sur les attaques CSRF, écrit par un gros bonnet. Décrivez CSRF en détail. (Cliquez sur le lien ci-dessous)
Attaque et défense CSRF
Cet article présente principalement la connexion du système des affaires académiques de Zhengfang via curl bibliothèque de php. Depuis Zhengfang Academic Affairs Le système peut avoir des mises à jour chaque année, donc cet article concerne 2018 et présente quelques méthodes de simulation de connexion à Zhengfang.
Le contenu est le suivant
Nous pouvons voir une telle demande, Comme son nom l'indique, il s'agit du code de vérification de la page, qui est renvoyé par le serveur Zhengfang lors de l'accès à l'interface de connexion. Je fais référence aux blogs d'autres experts qui ont dit que le code de vérification peut être intercepté sans le saisir, mais je l'ai testé plusieurs fois et j'ai constaté qu'il ne fonctionnait pas. Par conséquent, je pense que Zhengfang aurait dû corriger ce bug, nous devrions donc. entrez honnêtement le code de vérification.
Il convient également de noter qu'il existe un paramètre Cookie dans l'image ci-dessus. Ce cookie sera renvoyé à chaque fois que vous visiterez la page, mais ce cookie ne prendra effet qu'une fois la connexion réussie, nous en avons donc besoin. pour enregistrer ce cookie. Parce que toutes les opérations que nous effectuons dans le système éducatif vérifieront ce cookie, ce qui équivaut à une vérification d'identité, ce cookie est donc essentiel.
Ci-dessous, j'utilise php pour enregistrer les cookies et les codes de vérification localement.
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);
Les étudiants qui connaissent PHP devraient être capables de comprendre la signification de ce code. Créez d'abord une session, nous enregistrons le cookie obtenu à chaque fois dans un dossier, et obtenons le cookie et le code de vérification renvoyé en accédant au nom de domaine. Pour remplir manuellement le code de vérification, nous créons un fichier code.txt. Après avoir vu l'image du code de vérification dans le dossier, nous l'écrivons manuellement dans le fichier code.txt. Après quinze secondes, nous enverrons une demande au. Serveur Zhengfang.
Vous pouvez voir une requête POST, dans laquelle l'un des en-têtes auxquels nous devons prêter attention l'image ci-dessus est Referer. Le but de cet en-tête de message est d'empêcher le CSRF. Quant au CSRF, j'y reviendrai à la fin. Jetons un coup d'œil aux paramètres POST :
Vous devriez être capable de deviner la plupart des paramètres. Je n'entrerai pas dans les détails sur les paramètres avec un contenu vide. Ce qu'il faut mentionner, c'est _VIEWSTATE. et RadioButtonList1.
Le premier paramètre est le statut de la page actuelle. Cette chaîne sert à vérifier que nous venons de l'interface de connexion. Ce paramètre est dans le code source de la page de connexion. Nous l'extrayons via des expressions régulières.
Le deuxième paramètre est le type de bouton, et le contenu est un encodage GBK. Mon type est étudiant.
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('/<input type="hidden" name="__VIEWSTATE" value="([^<>]+)" \/>/', $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)); //将数组连接成字符串
À ce stade, nous pouvons accéder à notre fichier php. Si votre contenu est le suivant, félicitations, vous vous êtes connecté avec succès à Zhengfang.
Comme mentionné précédemment, même si nous nous connectons avec succès, nous ne pouvons pas effectuer les opérations fonctionnelles à l'intérieur car chaque section le nécessite. différents paramètres, ou différentes adresses de requête, je vais donc introduire ici une fonction d'accès aux scores.
Entrez dans la section de requête de score et examinons l'adresse et les paramètres de la demande.
Les paramètres sont les suivants :
Tout le monde devrait pouvoir comprendre ces paramètres. Le seul est gnmkdm. Le contenu de ce paramètre est une chaîne générée aléatoirement. Ce n'est pas un paramètre obligatoire. Les autres ont été essentiellement mentionnés précédemment, _VEIWSTATE est la même que la méthode obtenue précédemment. Le code est donné ci-dessous.
preg_match_all('/<span id="xhxm">([^<>]+)/', $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('/<input type="hidden" name="__VIEWSTATE" value="([^<>]+)" \/>/', $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;
D'accord, le code est terminé. Si votre page s'affiche comme suit, alors vous avez réussi.
En fait, c'est un peu plus gênant lors de la connexion. Après avoir entré, les deux paramètres nécessaires Cookie et _VIEWSTATE sont requis. Pour les autres paramètres, vérifiez simplement chaque requête POST par vous-même, puis selon Combinez simplement les formats de demande. Le code ci-dessus ne signalera pas d'erreur lors de l'exécution. Veuillez le copier et l'exécuter pour voir. Mais après quelques années, nous verrons si Zhengfang comblera les lacunes. L'intervalle de temps entre la lecture d'autres blogs était auparavant trop long, j'écrirai donc un article sur 18 ans. Si vous ne comprenez toujours pas quelque chose, vous pouvez l'envoyer. envoyez-moi un message privé ou laissez un message dans la zone de commentaire. Discussions bienvenues.
Le soi-disant CSRF est une contrefaçon intersite, ce qui signifie que quelqu'un d'autre vole votre identité pour envoyer une requête au serveur. se défendre contre cette attaque. , ce qui signifie que si nous voulons nous connecter avec succès au système des affaires académiques de Zhengfang, nous devons passer par la page de l'interface de connexion, ce qui signifie que l'adresse avant le saut doit être http://jwgl.hbpu. edu.cn/ . Lors des tests, chacun utilise le système d'administration académique de sa propre université, car cette adresse est le système d'administration académique de mon université et je peux me connecter avec succès via mon identifiant d'étudiant et mon mot de passe. Enfin, j'ai posté un blog sur les attaques CSRF, écrit par un gros bonnet. Décrivez CSRF en détail. (Cliquez sur le lien ci-dessous)
Attaque et défense CSRF.
Recommandations associées :
10 articles recommandés sur le système d'administration éducative
Un petit programme qui simule la connexion au système d'administration éducative pour calculer GPA
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!