JeuWeb - Crée ton jeu par navigateur
SESSION et redirection - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : SESSION et redirection (/showthread.php?tid=7236)



SESSION et redirection - hercull - 20-10-2014

Bonjour à tous,

Avoir avoir développer mon script en local, je le met en ligne et la surprise mon système de connexion ne fonctionne plus.

Pour mon formulaire de connexion , je récupère les infos de l'utilisateur et si tout est ok je declare mes variables de Session et je redirige vers une autre page grâce à un window.location en js, seulement une fois redirigé sur la page mes variable de session sont vide.

Je ne sais pas pourquoi, et j'ai besoin de leur contenu pour accéder à la page suivante.

Ma page entete.php demare bien avec :

Code :
<?php
session_start();
?>


Ma page de connexion:


Code :
<?php
session_start();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<meta name="robots" content="noindex,nofollow" />
<link rel="stylesheet" type="text/css" media="screen" href="css/style_admin.css" />
</head>
<?php


$i=0;

echo '<div id="corp_conexion_utilisateurs"><center>
                <form method="post" action="">
                <h3>Connexion</h3>
                <label for="email">Email :</label>
                    <input type="text"  name="email" id="email" size="17"/><br/><br/>
                    <label for="mdp">Pass :</label>
                    <input type="password"  name="mdp" id="mdp" size="17"/><br/><br/>
                    <input type="submit" value="Connexion" class="btn btn-primary"/></center><br/><br/>
                    <br/>
                </form>
    </div>';
        
if($_POST){
if (empty($_POST['email']) || empty ($_POST['mdp']))  
{  
    $i++;
    echo "<center>Le login et/ou le mot de passe sont vide!</center>";  
  
    
}

if (!preg_match("#^[a-z0-9]+$#", $_POST['mdp']))
        {
            echo '<center><p>Votre mot de passe ne peut contenir que des lettre et des chiffre.</p></center>';
            $i++;
        }
        
        function VerifierAdresseMail($email)
                {
                $Syntaxe = '#^[\w.-]+@[\w.-]+\.[a-zA-Z]{2,6}$#';
                if(preg_match($Syntaxe, $email))
                return true;
                else
                return false;
                }
                
                $email = htmlspecialchars($_POST['email']);
                if(VerifierAdresseMail($email)==false)
                {

                echo '<center>Le format du mail n\'est pas correct.</center><br/>';
                $i++;
                
                }


if($i > 0)
{
    
}
else{
    
    
    $email = htmlspecialchars($_POST['email']);  
    $mdp = htmlspecialchars($_POST['mdp']);
    include('connexion_bdd.php');

        
        define('PREFIX_SALT', 'powaa');
    $mdphash = sha1(sha1(PREFIX_SALT.$mdp));

    
    $r ="SELECT * FROM utilisateurs WHERE email = '".$email."' AND mdp = '".$mdphash."'";
    $d= mysql_query($r) or die(mysql_error());
    $row1 = mysql_fetch_array($d);
    $row1['utilisateur_ID'];
    
     if (isset($row1['utilisateur_ID'])) {
        
    
         $r = mysql_query('SELECT utilisateur_ID,role,email FROM utilisateurs WHERE email = "'.$email.'";') or die (mysql_error());  
         $d= mysql_fetch_array($r);
                
         $role = $d['role'];
         $email = $d['email'];
         $utilisateur_ID = $d['utilisateur_ID'];

                    
        if($role == 3)
        {
            
         $_SESSION['email'] = $email;
         $_SESSION['utilisateur_ID'] = $utilisateur_ID;

         echo'<script>window.location="prochaine_vente.php";</script>';
              
}
else{
    echo'<center>Vous n\'etes pas administrateur</center>';
}
}
else {
    echo'<center>Le mot de passe ou le login sont errones</center>';
}
}

}



?>


et sur ma page de destination:

Code :
<?php

include('entete.php');

include('connexion_bdd.php');

if(empty($_SESSION['email']))
{
  
    

    echo'Vous ne pouvez pas acceder à cette page';
}
else{
// affichage de ma page
}

include('footer.php');

?>


Merci de votre aide.


RE: SESSION et redirection - Xenos - 20-10-2014

Il faut démarrer la session sur la page de destination si tu veux y lire les données de session:

Code :
session_start();

Je passe sous silence certains autres points:
• sha(sha()) ne sert à rien, on sale puis on hash le pass, avec une fonction MySQL de préférence
• Les mot de passe étant hashés, ils ont le droit de contenir tous types de caractères (dont les caractères spéciaux comme # € et £), les interdire c'est obliger les joueurs à avoir des mdp faibles
throw new Exception() + try {} catch() {}, c'est mieux que des $i qui traînent
htmlspecialchars() n'évite pas forcément l'injection puisqu'il faut préciser si on souhaite échapper les guillemets simples, les doubles, ou les deux via ENT_QUOTES
• Par principe, colle bien le ?> et <!DOCTYPE, sinon il y aura un caractère de retour à la ligne qui sera émis avant le <!DOCTYPE
or die mysql_error(), on évite, car cela veut dire "affiche au client (joueur, visiteur, hacker, ...) les informations sur l'erreur MySQL... C'est comme mettre un panneau Ma serrure est cassée sur la porte de sa maison quand on part en vacances
• Attention aux expressions régulières: elles sont sensibles à la casse si on n'utilise pas le drapeau i


RE: SESSION et redirection - hercull - 20-10-2014

Merci pour toutes ces précisions, peut tu 'en dire plus sur :
"htmlspecialchars() n'évite pas forcément l'injection puisqu'il faut préciser si on souhaite échapper les guillemets simples, les doubles, ou les deux via ENT_QUOTES"

J'aimerai bien securiser mes formulaire.

Et pour session_start(); il est bel et bien présent, dans la page entete.php qui est en include sur la page de destination, donc je pense que le probleme ne vient pas de la.

D'autre pistes?

Cordialment.


RE: SESSION et redirection - Xenos - 20-10-2014

Il faut juste demander explicitement l'échappement des guillemets simples / doubles suivant ceux que tu utilises. Sinon, pour pousser au bout, on peut suivre les recommandations de l'OWASP si on n'utilises pas de framework.

if ($role == 3)
Vérifie que l'intérieur de ce if est bien exécuté, et que $email n'est pas vide (la BDD ne renvoie peut-être pas de résultat), car empty() revoie true si la variable n'existe pas, ou si sa valeur est évaluée à "false" (donc, si $email était vide).

Il existe aussi filter_input pour valider les entrées comme les emails.
mysql_* est toujours aussi déprécié qu'avant... mysqli_* est à utiliser à la place.

PS1
Au fait, pourquoi faire deux requêtes SQL? La première requête récupère toutes les informations de l'utilisateur, alors pourquoi en refaire une seconde pour récupérer des infos que tu as déjà?

PS2
Et pitié, respecte une convention de formatage de code!
Passe encore que les variables soient nommées un coup en français, un coup en anglais (autant choisir l'un ou l'autre quand même) ou qu'on ait des variables débutant par des majuscules ($Syntaxe) ou des minuscules ($row1) voire même des snake_case ($utilisateur_ID) et des lowercase ($mdphash; pas sûr du nom sur ce coup).
Mais lla présentation... un coup les accolades sont collées au if, le coup d'après elles sont dans une nouvelle ligne, sans parler des tabulations de l'indentation...
Tu clarifieras facilement tes codes en adoptant une convention et en t'y tenant. D'autant que tout IDE (Netbeans, ou même Notepad++) offre ce genre de fonctionnalités.


RE: SESSION et redirection - hercull - 20-10-2014

Bien vu! L'erreur venait bien de ma requête envoyer une deuxième fois inutilement.

Merci cela fonctionne à présent.

Tu as raison je vais tenir compte de la forme de mon code.

Autre chose avant j'utilisais mysql_real_escape_string , mais cette fonctionne est obsolète comment sécuriser vous vos formulaires? Un regex? vous permettez quel caractère? une autre méthode?

Cordialement.


RE: SESSION et redirection - Xenos - 20-10-2014

Regex pour les chaines et cast $input = (int)$_POST['inputName']; avant de découvrir (grâce à NetBeans, oui, finalement, Notepad++ j'oublie) filter_input qui n'a pas l'air mal du tout (pas encore essayé).

En pratique, l'application de la vérification se fait chez moi de cette façon:
• Récupération des données $monInput = $_POST['data'];
• Instanciation d'un objet correspondant à ce que ces données sont: $monInputValide = new Email($monInput); // Email implements IEmail
• Utilisation de ces données, via typehinting: public function saveEmail(IEmail $email) { ... }

La vérification de validité se fait alors dans la classe Email, en utilisant si besoin une autre classe chargée uniquement de vérifier la validité d'une chaine de caractères (aka, vérifier qu'une chaine respecte une norme donnée, qui peut être plus restrictive que celle des e-mail ou qui peut être réutilisée ailleurs, mais c'est assez rare quand même).
Le typehinting assure que l'on ne passe, à la fonction, que des objets de type IEmail, donc, des adresses vérifiées point de vue syntaxe de la chaine de caractères (peu importe, dans la fonction saveEmail, d'où vient le mail: il peut venir d'un formulaire, d'un cookie, ou d'un tirage au sort).


RE: SESSION et redirection - hercull - 21-10-2014

Très bien merci.

Je suis entrain de regarder filter_input dont tu parle plus haut sa m'a l'air vraiment bien, quelqu'un l'utilise? peut on faire confiance à cela pour la sécurité des input?

Par exemple pour FILTER_SANITIZE_FULL_SPECIAL_CHARS "full_special_chars" , si je comprend bien cela a le même rôle qu'un htmlspecialchars() mais a cela il ajoute le jeu ENT_QUOTES , c'est bien ce dont tu parlais au dessus? , puis je utiliser cette fonction pour mes input ou j'attend une chaîne de caractère, cela est il suffisant pour la sécurité? et dois je ajouter à cela un regex ou il devient inutile?

Cordialment.


RE: SESSION et redirection - Xenos - 21-10-2014

Citation :peut on faire confiance à cela pour la sécurité des input?

Ce sont des fonctions par défaut de PHP, elles seront toujours meilleures que celles que tu construiras toi-même. Quand bien même certaines erreurs se glisseraient dans ces fonctions, PHP étant régulièrement mis à jour, ces erreurs seraient vite corrigées.

Si tu filtres par filter_input (correctement j'entends, aka si tu veux un booléen, t'en auras un mais rien ne garantis que c'est un booléen qu'il te faut réellement donc à toi de bien faire la conception), la regex est inutile.

Pour FILTER_*, je n'en sais rien il faut essayer un peu soi même, et surtout lire attentivement la doc (préférentiellement la VO, mais PHP n'est pas trop mal servi niveau qualité de la doc fr). Je redit: n'ai pas essayé filter_input, mais cela semble parfaitement adapté au problème.


RE: SESSION et redirection - Lindis - 28-10-2014

Bonsoir amis Dev Big Grin

Message qui n'a rien à voir, mais juste pour dire pwaaa quand Xenos donne des explications il ne fait pas semblant !! Wink