Maison >développement back-end >tutoriel php >Est-il sûr d'utiliser une session en php ?

Est-il sûr d'utiliser une session en php ?

怪我咯
怪我咯original
2017-07-05 09:44:491455parcourir

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.0
Aprè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(&#39;(&#39; +data+ &#39;)&#39;);
      $(&#39;.grant_info&#39;).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.0
Au 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&#39;] = md5($_SERVER[‘HTTP_USER_AGENT&#39;]);
puis chaque fois que nous jugeons s'il faut nous connecter, ajouter les conditions de jugement comme suit

If(isset($_SESSION[‘userid&#39;]) && $_SESSION[‘User_Agent&#39;] == md5($_SERVER[‘HTTP_USER_AGENT&#39;])){
    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.

Ici, je partage simplement les problèmes que j'ai rencontrés au travail, et j'espère que tout le monde pourra en apprendre davantage en profondeur.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn