2009-08-11 6 views
0
<?php 
session_start(); 
// After user logged in 
session_regenerate_id(); 
$_SESSION['logged_in'] = 1; 
$_SESSION['ip'] = $_SERVER['REMOTE_ADDR']; 
$_SESSION['agent'] = $_SERVER['HTTP_USER_AGENT']; 


// Session Checking 
function session_check(){ 
    if(isset($_SESSION['logged_in']) && !empty($_SESSION['logged_in'])){ 
     if(isset($_SESSION['ip']) && !empty($_SESSION['ip']) && ($_SESSION['ip'] == $_SERVER['REMOTE_ADDR'])){ 
      if(isset($_SESSION['agent']) && !empty($_SESSION['agent']) && ($_SESSION['agent'] == $_SERVER['HTTP_USER_AGENT'])){ 
       return true; 
      } else { 
       echo "Not allowed to view this page. Error no: 3. You will be redrected to login page in few seconds"; 
       header('Refresh: 3; url=./login.php'); 
      } 
     } else { 
      echo "Not allowed to view this page. Error no: 2. You will be redirected to login page in few seconds"; 
      header('Refresh: 3; url=./login.php'); 
     } 
    } else { 
     echo "You are not allowed to view this page. Error no: 1. You will be redirected to login page in few seconds"; 
     header('Refresh: 3; url=./login.php'); 
     return false; 
    } 
} 

Et je continue à obtenir no2 d'erreur quand je lance:Quel est le problème avec ce code php, continuez à recevoir l'erreur n ° 2?

if(session_check()){ echo "something";} 

Est-ce parce que je suis en utilisant IP dynamique?

Mon code est-il assez bon pour protéger le détournement de session?

Si j'exclus le ($_SESSION['ip'] != $_SERVER['REMOTE_ADDR']), cela fonctionne parfaitement.

Question importante:

Quelles sont vos méthodes anti-piratage de session? Peut partager avec nous? Utilisation de la vérification IP, vérification de l'agent utilisateur ou probablement d'autres méthodes?

+0

Il manque un?>. Est-ce que c'est dans votre code actuel? – Extrakun

+0

Juste en général: vous pouvez omettre 'isset()' si vous voulez utiliser 'empty()' de toute façon. 'empty()' ne va pas se plaindre de variables inexistantes. – deceze

+0

@extrakun: s'il me manque?>, Il ne s'agira pas de "l'erreur n ° 2" .. J'inclus déjà?>. @deceze: merci pour les conseils. Je ne le savais pas. Y a-t-il quelque chose qui ne va pas dans mon code? – bbtang

Répondre

1

Oui, une adresse IP dynamique vous ferait journaliser en tant qu'utilisateur de ce code dès que vous changez d'adresse IP. Vous ne devriez pas utiliser l'adresse IP pour vérifier la sécurité de la session. Le contrôle de l'agent utilisateur que vous avez déjà devrait suffire à lui seul.

Voici un excellent article sur la sécurité de session: http://phpsec.org/projects/guide/4.html. Près du bas, il montre comment vous pouvez rendre l'agent utilisateur encore plus sûr en utilisant le hachage md5. Aussi voici un extrait concernant les adresses IP:

Il est imprudent de compter sur quoi que ce soit au niveau TCP/IP, telles que l'adresse IP, parce que ce sont des protocoles de niveau inférieur qui ne sont pas destinés à accueillir des activités qui ont lieu à le niveau HTTP. Un seul utilisateur peut potentiellement avoir une adresse IP différente pour chaque requête, et plusieurs utilisateurs peuvent potentiellement avoir la même adresse IP.

+0

Certains disent que l'utilisateur-agent de vérification n'est pas assez sécurisé, donc j'inclus tout ce que j'ai .. Peut-être que je devrais exclure la vérification IP, si je ne trouve vraiment pas la réponse ici :( – bbtang

+0

Oui, vous devez exclure la vérification IP, c'est ce que j'essaie de dire dans ma réponse –

+0

Pourriez-vous lire ceci, http://stackoverflow.com/questions/1221447/what-do-i-nene-pas-store-in-the-php-session-when -user-logged-in Trouvez la réponse linéaire. – bbtang

0

Je suppose qu'il y a plus de passe entre le réglage des variables et la vérification. C'est probablement ce qui cause le problème, mais il nous est difficile de dire ce qui pourrait en être la cause si nous ne voyons aucun message d'erreur ou code susceptible de le provoquer. Essayez de faire l'écho de la session [ip] et affichez-la ici.

0

Vous ne pouvez pas répercuter quoi que ce soit avant d'émettre une écriture dans l'en-tête, sauf si vous utilisez la mise en mémoire tampon de sortie. Je vous suggère de renvoyer un code d'état au lieu de placer l'en-tête dans la fonction session_check. Après tout, il est nommé session_check, non session_check_redirect(): D

De l'PHP manual on header()

Rappelez-vous que la tête() doit être appelé avant toute sortie réelle est envoyée, soit par des balises HTML normales, lignes vides dans un fichier, ou à partir de PHP. include(), ou require(), functions, ou une autre fonction d'accès aux fichiers, et ont les espaces ou les lignes vides qui sont affichés avant que header() soit appelé. Le même problème existe lors de l'utilisation d'un seul fichier PHP/HTML .

+0

Eh bien, en fait, pas vraiment l'écho. Après faire le session_check(), je vais procéder à d'autres choses comme le profil de vue, le profil de mise à jour etc. Eh bien, j'essaierais de placer l'en-tête en dehors de la fonction session_check. Revenir à vous dès que possible – bbtang

+0

Vous avez une déclaration d'écho avant votre en-tête(). Essayez de supprimer l'écho et voir si cela fonctionne. – Extrakun

+0

j'ai pris l'en-tête totalement, mais ça ne marche pas .. – bbtang

0

Je ne vois pas quel est le problème avec votre code. Comme suggéré, essayez var_dumping le contenu des deux $_SERVER et $_SESSION au début de session_check() pour voir ce qu'ils contiennent.

Même si vous utilisez une adresse IP dynamique, elle ne devrait pas changer entre deux demandes (elle change généralement lorsque vous débranchez votre câble réseau ou déconnectez votre carte wifi).

Votre méthode peut vous aider à éviter le détournement de session, mais elle ne fonctionnerait pas si l'attaquant est derrière la même adresse IP publique que l'utilisateur.

Je suggère de lire OWASP recommandations pour de meilleures pratiques en matière de sécurité web.

0

D'accord avec Marius, il se passe probablement plus de choses.
J'ai pris la liberté de faire votre logique if..else plus lisible:

function session_check(){ 
    if (empty($_SESSION['logged_in'])){ 
     echo "Error no: 1."; 
     return false; 
    } 
    if (empty($_SESSION['ip']) || ($_SESSION['ip'] != $_SERVER['REMOTE_ADDR'])){ 
     echo "Error no: 2."; 
     return false; 
    } 
    if (empty($_SESSION['agent']) || ($_SESSION['agent'] != $_SERVER['HTTP_USER_AGENT'])){ 
     echo "Error no: 3."; 
     return false; 
    } 

    return true; 
} 
+0

Eh bien, j'ai essayé d'utiliser votre code. On dirait d'avoir la même erreur, "Erreur no: 2." Le reste va bien. Donc, bizarre. Si j'exclus le ($ _SESSION ['ip']! = $ _SERVER ['REMOTE_ADDR']), cela fonctionne bien – bbtang

+0

Avez-vous vérifié les variables? Mettez ceci avant la vérification IP: 'echo $ _SESSION ['ip']." == ". $ _ SERVER ['REMOTE_ADDR'];' – deceze

+0

Essayé, mais toujours échoué. Je produis 2 variables, elles sont identiques. Eh bien l'esprit nvr alors. J'exclurai cette vérification, comme l'a suggéré Jeremy Ruten. – bbtang

Questions connexes