La
sessionsûre en PHP ? PHP ne nous fournit qu'une implémentation de session. Les travaux de sécurité ultérieurs nécessitent que les programmeurs la maîtrisent avec flexibilité. Par conséquent, la programmation PHP est vraiment flexible. Les amis qui ont besoin de comprendre la sécurité de session en PHP peuvent se référer à
J'ai développé PHP. depuis si longtemps, et je n'ai jamais vraiment prêté attention aux problèmes de sécurité. Je me concentre toujours sur la réalisation du projet. J'ai récemment vu un article sur la sécurité sur Internet, j'ai remarqué qu'il existait dans mes projets précédents. une grosse faille de sécurité, alors j'ai choisi un projet et je l'ai testé, et j'ai découvert qu'il était facile de se faire prendre. Ici, je vais partager un exemple de test que j'ai écrit pour illustrer en quoi la session en PHP n'est pas sécurisée et comment renforcer sa sécurité dans le projet.
Quant au principe et au mécanisme de session, il existe de nombreux bons articles sur Internet pour le présenter, et nous pouvons le vérifier par nous-mêmes. Partageons des exemples de tests directement.
L'exemple de ce test est principalement une page de connexion. Après une connexion réussie, vous pouvez changer le mot de passe.
L'interface est la suivante
Tout d'abord, utilisez la fonction session_start() à l'entrée du projet pour ouvrir la session. De cette manière, lorsque le client initie une requête, un identifiant d'identité, à savoir SessionID, sera généré. Il est enregistré sur le client via un cookie Chaque communication entre le client et le serveur s'appuie sur ce SessionID pour l'identification. Après une connexion réussie, l'ID utilisateur et le nom d'utilisateur seront stockés dans la session
$_SESSION[‘userid'] = 用户id $_SESSION[‘uname'] = 用户名
if(isset($_SESSION['userid'])) return true;
$.post("接口*******", { oldpass:oldpass, newpass:newpass, userid:uid, }, function(data){ data = eval('(' +data+ ')'); $('.grant_info').html(infos[data.info]).show(); } );
L'interface de modification du mot de passe est implémentée de cette manière. Tout d'abord, il est jugé si l'utilisateur est connecté. Si l'utilisateur est connecté, l'opération de modification du mot de passe sera effectuée.
L'idée d'implémentation de l'exemple de test est à peu près celle décrite ci-dessus.
Utiliser l'attaque SessionID
1. La première consiste à obtenir le SessionID. Bien sûr, il existe de nombreuses façons pour les attaquants d'obtenir cet identifiant. En raison de mon niveau limité, je ne présenterai pas comment. pour l'obtenir ici. Nous pouvons le simuler en accédant d'abord normalement à ce projet, puis en vérifiant le SessionID via le navigateur pour obtenir un identifiant d'utilisateur légal. Vous pouvez voir cet ID dans l'en-tête de la demande
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3 Connection: keep-alive Cookie: Hm_lvt_bf1154ec41057869fceed66e9b3af5e7=1450428827,1450678226,1450851291,1450851486; PHPSESSID=2eiq9hcpu3ksri4r587ckt9jt7; Host: ****** Referer: ****** User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:41.0) Gecko/20100101 Firefox/41.0
utilisateur se connecte avec succès, alors les informations de l'utilisateur seront dans la session sur le serveur. côté. 2. Après avoir obtenu le SessionID, si l'attaquant connaît déjà l'interface de changement de mot de passe, il peut directement changer le mot de passe de l'utilisateur. Si l'attaquant n'a pas encore obtenu l'adresse de l'interface, il peut la trouver en consultant le code de la page. Vous pouvez utiliser la commande suivante
#curl --cookie "PHPSESSID=2eiq9hcpu3ksri4r587ckt9jt7" 页面地址
Une partie du html le code est le suivant
<html xmlns="http://www.w3.org/1999/xhtml"> <head> …… var uid = $(".userid").val(); $.post("/User/User/modifypass_do", { oldpass:oldpass, newpass:newpass, userid:uid, }, function(data){ data = eval('(' +data+ ')'); $('.grant_info').html(infos[data.info]).show(); } ); …… <span><input type="password" name="oldpass" id="textfield_o" placeholder="原密码"></span> <span><input type="password" name="newpass" id="textfield_n" placeholder="新密码"></span> <span><input type="password" name="confirmpass" id="textfield_c" placeholder="确认密码"></span> <input type="button" class="btn_ok" value="确认修改" />
La commande est la suivante
# curl --cookie "PHPSESSID=2eiq9hcpu3ksri4r587ckt9jt7" -d oldpass=111111 -d newpass=000000 -d userid=用户id 接口地址
Solution
Pour les attaques ci-dessus, nous pouvons améliorer sa sécurité en compliquant la méthode de vérification. L'un des moyens consiste à utiliser l'élément User-Agent dans l'en-tête de la requête pour améliorer sa sécurité.
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3 Connection: keep-alive Cookie: Hm_lvt_bf1154ec41057869fceed66e9b3af5e7=1450428827,1450678226,1450851291,1450851486; PHPSESSID=2eiq9hcpu3ksri4r587ckt9jt7; Host: ****** Referer: ****** User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:41.0) Gecko/20100101 Firefox/41.0
$_SESSION[‘User_Agent'] = md5($_SERVER[‘HTTP_USER_AGENT']);
If(isset($_SESSION[‘userid']) && $_SESSION[‘User_Agent'] == md5($_SERVER[‘HTTP_USER_AGENT'])){ return true; }
Résumé :
Bien sûr, l'attaque réelle est loin d'être simple. Premièrement, il est difficile d'obtenir le SessionID. Ensuite, le code interagissant avec le serveur doit être crypté autant que possible pour éviter la situation ci-dessus. Après avoir modifié le code une deuxième fois, nous pouvons augmenter la complexité de l’attaque, mais cela ne peut pas l’éliminer. Il existe de nombreuses façons d'attaquer. Ce n'est qu'une manière simple et ne donne qu'une idée, mais le principe est le même. Dans les situations réelles, la sécurité de notre code peut être améliorée en fonction de la situation réelle.
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!