Maison >développement back-end >tutoriel php >Est-il sûr d'utiliser une session en php ?
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'] = 用户名Toutes les opérations ultérieures vérifieront si l'utilisateur est connecté en jugeant si $_SESSION['userid'] existe . Le code est le suivant :
if(isset($_SESSION['userid'])) return true;L'appel à l'interface de modification de mot de passe transmet les données au serveur via ajax post.
$.post("接口*******", { oldpass:oldpass, newpass:newpass, userid:uid, }, function(data){ data = eval('(' +data+ ')'); $('.grant_info').html(infos[data.info]).show(); } );Notez que j'ai écrit ce code dans la page html, donc si vous voyez le code html, vous connaîtrez l'adresse de l'interface.
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.0Après avoir obtenu l'ID de session, si l'
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" 页面地址Comme nous l'avons dit plus haut, dans cet exemple le code ajax est écrit dans la page html, vous pouvez donc voir l'adresse de l'interface sur cette page
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="确认修改" />3. Après avoir obtenu l'interface, vous pouvez envoyer des données via curl pour simuler la publication pour changer le mot de passe
La commande est la suivante
# curl --cookie "PHPSESSID=2eiq9hcpu3ksri4r587ckt9jt7" -d oldpass=111111 -d newpass=000000 -d userid=用户id 接口地址Si l'utilisateur est déjà connecté, l'attaquant peut exécuter la commande ci-dessus pour modifier le mot de passe de l'utilisateur.
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.0Au début du projet, nous avons simplement utilisé la fonction session_start() pour ouvrir la session. Maintenant, nous pouvons ajouter ce code ci-dessous session_start()
$_SESSION[‘User_Agent'] = md5($_SERVER[‘HTTP_USER_AGENT']);puis chaque fois que nous jugeons s'il faut nous connecter, ajouter les conditions de jugement comme suit
If(isset($_SESSION[‘userid']) && $_SESSION[‘User_Agent'] == md5($_SERVER[‘HTTP_USER_AGENT'])){ return true; }De cette façon, nous pouvons éviter l'attaque simple ci-dessus.
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!