Un peut de PHP SQL pour finir l'apres midi !


user2home
WRInaute discret
WRInaute discret
 
Messages: 228
Inscription: 19 Déc 2007

Un peut de PHP SQL pour finir l'apres midi !

Message le Lun Avr 18, 2011 15:32

Bonjour à tous, j'ai un soucis avec un bout de code, si quelqu'un peut me dépanner ou me donner une piste je l'en remercie je ne trouve vraiment pas de solutions..... je suis étudiant en 1 année donc je débute en dev ( je précise cela pour éviter tout jet de pierres :wink: )

Il s'agit de mon projet de PTI, je tente cet apres midi de compléter avec une vérification via le SESSION l'acces à des pages réservé aux membres.

Via un IF et un ELSE, si l'utlistateurs est connecté alors j'affiche, sinon un message s'affiche.


Voici mon fichier "action" authentification, suivit du code de ma page réservé aux membres.

Je cherche également un moyen d'integrer du code html dans un if en php, j'ai tenté via des echo 'html'; mais c'est vraiment artisanale je pense !

En vous remerciant par avance !


Code: Tout sélectionner
<?php

include_once ('../../cfg/connexion.cfg.php');
$login = $_POST['login']; //recuperation de login et mdp
$pwd = $_POST['pwd'];



$sql = "SELECT * FROM profils WHERE USERNAME='" . $login . "' AND MDP='" . $pwd . "';"; //selection du compte depuis la DB
$resultat = mysql_query($sql);
$ligne = mysql_fetch_array($resultat, MYSQL_ASSOC);


$login_valide = $ligne['USERNAME'];
$pwd_valide = $ligne['MDP'];
//echo $sql;
// on teste si nos variables sont définies
if (isset($_POST['login']) && isset($_POST['pwd'])) {

    // je vérifie les informations du formulaire
    if ($login_valide == $_POST['login'] && $pwd_valide == $_POST['pwd']) {
        //tout est ok on demarre la session
        session_start ();
        $_SESSION['auth'] = "ok";
        $_SESSION['id'] = $ligne['IDPROFIL'];

        //j'enregistre le visiteur dans des variable de session
        $_SESSION['login'] = $_POST['login'];
        $_SESSION['pwd'] = $_POST['pwd'];
        header('location:../../index.php');
        // je redirige le membre
    } else {
        // Visiteur inconnu
        header('location:../../index.php');
    }
}
?>


Code: Tout sélectionner
<?php
if (!isset($_SESSION['login']) && !isset($_SESSION['pwd']) && $_SESSION['auth'] != "ok") {
echo "Vous devez êtres enregistré vous afficher ce contenu";   
}
else {
?>
    <div id="administrer">
        <br />
        <table border="0">   
            <tr><th>Ajouter un Profil  :</th>
                <th><a href="index.php?page=form/form_compte_ajouter_sc2&id=';<?php echo $_SESSION['id']; ?>">Starcraft II</a> - </th>
                <th><a href="index.php?page=form/form_compte_ajouter_war3&id=<?php echo $_SESSION['id']; ?>">Warcraft III</a> - </th>
                <th><a href="index.php?page=form/form_compte_ajouter_wow&id=<?php echo $_SESSION['id']; ?>">World Of Warcraft</a></th></tr>
        </table>

        <h1>TABLEAU PROVISOIR LISTAGE COMPTE</h1>
        <br />
        <br />
        <table border="1">
            <tr><th>Identifiant</th><th>Pseudo</th><th>mot de passe</th><th>Mail</th><th>Code Postal</th><th>Pays</th><th>Modifier</th><th>Supprimer</th></tr>
<?php
    $resultat = "SELECT PR.IDPROFIL, PR.IDPAYS, P.LIBELLE, PR.USERNAME, PR.MDP, PR.EMAIL, PR.URL, PR.CODEPOSTAL  FROM profils as PR, pays as P WHERE  PR.IDPAYS=P.IDPAYS";
    $result = mysql_query($resultat);
    while ($ligne = mysql_fetch_array($result, MYSQL_ASSOC)) {
        echo "<td>";
        echo $ligne['IDPROFIL'] . "</td>
            <td> " . $ligne['USERNAME'] . "</td>
            <td> " . $ligne['MDP'] . "</td><td> " . $ligne['EMAIL'] . "</td><td> " . $ligne['CODEPOSTAL'] . "</td>
            <td> " . $ligne['LIBELLE'] . "</td>";
        echo "<td> <a href=\"index.php?page=form/form_compte_modifier&id=" . $ligne['IDPROFIL'] . "\">Modifier</a></td>";
        echo "<td> <a href=\"index.php?page=action/action_compte_suprimer&id=" . $ligne['IDPROFIL'] . "\">Supprimer</a></td></tr>";
    }
    echo "</table>";
    echo "</div>";
}
?>


UsagiYojimbo
WRInaute accro
WRInaute accro
 
Messages: 8578
Inscription: 23 Nov 2005

Re: Un peut de PHP SQL pour finir l'apres midi !

Message le Lun Avr 18, 2011 15:34

Tu sais que tu peux faire comme tu as fais plus haut, à savoir fermer la balise php et mixer avec du HTML :

Code: Tout sélectionner
while ($ligne = mysql_fetch_array($result, MYSQL_ASSOC)) {
?>
<td>
        <?php echo $ligne['IDPROFIL']; ?></td>
        ...


user2home
WRInaute discret
WRInaute discret
 
Messages: 228
Inscription: 19 Déc 2007

Re: Un peut de PHP SQL pour finir l'apres midi !

Message le Lun Avr 18, 2011 15:36

Oui, je te remercie ce problème semble résolu ! Mon soucis principal vient des pages réservé aux membres :?

Ai je bien fais mon fichier d'authentification, me conseillez vous autre chose ?


UsagiYojimbo
WRInaute accro
WRInaute accro
 
Messages: 8578
Inscription: 23 Nov 2005

Re: Un peut de PHP SQL pour finir l'apres midi !

Message le Lun Avr 18, 2011 15:38

Bein du coup ton problème n'est pas du tout clair. Quels problèmes tu rencontres ? As-tu bien mis un session_start() en en-tête de tes pages, avant toute sortie HTML ?


user2home
WRInaute discret
WRInaute discret
 
Messages: 228
Inscription: 19 Déc 2007

Re: Un peut de PHP SQL pour finir l'apres midi !

Message le Lun Avr 18, 2011 15:43

J'avais effectivement oublié mon session_start en debut de page à vérouiller pour les utilisateurs non enregistrés. Après l'ajout et le test j'obtiens :

Notice: A session had already been started - ignoring session_start() in C:\wamp\www\PTICITATION\pti\pages\form\form_compte_administrer.php on line 1


J'en déduis que la session est deja active.... mais je ne saurai pas interpréter au dela le pourquoi de cette erreur, si la session est bien lancé ( d'après le message d'erreur ) la partie situé dans mon if ne devrai pas s'afficher si je ne suis pas logué, helas elle s'affiche tout de même .... :?


UsagiYojimbo
WRInaute accro
WRInaute accro
 
Messages: 8578
Inscription: 23 Nov 2005

Re: Un peut de PHP SQL pour finir l'apres midi !

Message le Lun Avr 18, 2011 15:47

Ce n'est pas parce que tu as activé les sessions sur une page que LA session que tu testes est définie. Tu as un session_start au début de la page où tu instancies tes variables de session ?


user2home
WRInaute discret
WRInaute discret
 
Messages: 228
Inscription: 19 Déc 2007

Re: Un peut de PHP SQL pour finir l'apres midi !

Message le Lun Avr 18, 2011 15:54

La page ou j'instancie mes variables de connexion est mon premier quote je ne le lance que si le login récupere en $_POST est égal au login importé depuis la BD. :?

if ($login_valide == $_POST['login'] && $pwd_valide == $_POST['pwd']) {
//tout est ok on demarre la session
session_start ();



CODE COMPLET DU FICHIER DE CONNECTION
<?php

include_once ('../../cfg/connexion.cfg.php');
$login = $_POST['login']; //recuperation de login et mdp
$pwd = $_POST['pwd'];



$sql = "SELECT * FROM profils WHERE USERNAME='" . $login . "' AND MDP='" . $pwd . "';"; //selection du compte depuis la DB
$resultat = mysql_query($sql);
$ligne = mysql_fetch_array($resultat, MYSQL_ASSOC);


$login_valide = $ligne['USERNAME'];
$pwd_valide = $ligne['MDP'];
//echo $sql;
// on teste si nos variables sont définies
if (isset($_POST['login']) && isset($_POST['pwd'])) {

// je vérifie les informations du formulaire
if ($login_valide == $_POST['login'] && $pwd_valide == $_POST['pwd']) {
//tout est ok on demarre la session
session_start ();
$_SESSION['auth'] = "ok";
$_SESSION['id'] = $ligne['IDPROFIL'];

//j'enregistre le visiteur dans des variable de session
$_SESSION['login'] = $_POST['login'];
$_SESSION['pwd'] = $_POST['pwd'];
header('location:../../index.php');
// je redirige le membre
} else {
// Visiteur inconnu
header('location:../../index.php');
}
}
?>


UsagiYojimbo
WRInaute accro
WRInaute accro
 
Messages: 8578
Inscription: 23 Nov 2005

Re: Un peut de PHP SQL pour finir l'apres midi !

Message le Lun Avr 18, 2011 15:56

Et si tu fais un print_r($_SESSION) ;exit(); sur la page suivante, avant tout traitement (hormis le session_start bien sûr), tu as quelque chose qui s'affiche ?

jamalofski
WRInaute discret
WRInaute discret
 
Messages: 219
Inscription: 3 Mar 2007

Re: Un peut de PHP SQL pour finir l'apres midi !

Message le Lun Avr 18, 2011 16:03

injection sql ?!


UsagiYojimbo
WRInaute accro
WRInaute accro
 
Messages: 8578
Inscription: 23 Nov 2005

Re: Un peut de PHP SQL pour finir l'apres midi !

Message le Lun Avr 18, 2011 16:05

jamalofski a écrit:injection sql ?!


Je répondais à la question initiale, mais en effet, niveau sécurisation, une requête qui intègre des variables $_GET / $_POST sans un minimum de sécurisation/nettoyage, c'est pas le top :/


user2home
WRInaute discret
WRInaute discret
 
Messages: 228
Inscription: 19 Déc 2007

Re: Un peut de PHP SQL pour finir l'apres midi !

Message le Lun Avr 18, 2011 16:06

Je viens d'executer ce code dans mon fichier "action authentification" donc juste après la validation du formulaire de connexion et j'obtiens :

Code: Tout sélectionner
Notice: Undefined variable: _SESSION in C:\wamp\www\PTICITATION\pti\pages\action\action_auth_connecter.php on line 3


Donc j'en déduis que la session n'est pas encore définie avant la connexion de l'utilisateur ?


user2home
WRInaute discret
WRInaute discret
 
Messages: 228
Inscription: 19 Déc 2007

Re: Un peut de PHP SQL pour finir l'apres midi !

Message le Lun Avr 18, 2011 16:07

jamalofski a écrit:injection sql ?!



je suis étudiant en 1 année donc je débute en dev ( je précise cela pour éviter tout jet de pierres :wink: )



je ne peux pas tout apprendre d'un coup, j'ai deja du mal à gérer des session, pour la sécu je verai plus tard, deja comprendre la théorie "brute".

Le site n'est pas destiné à être mis en ligne...pour le moment :)


UsagiYojimbo
WRInaute accro
WRInaute accro
 
Messages: 8578
Inscription: 23 Nov 2005

Re: Un peut de PHP SQL pour finir l'apres midi !

Message le Lun Avr 18, 2011 16:17

user2home a écrit:Je viens d'executer ce code dans mon fichier "action authentification" donc juste après la validation du formulaire de connexion et j'obtiens :

Code: Tout sélectionner
Notice: Undefined variable: _SESSION in C:\wamp\www\PTICITATION\pti\pages\action\action_auth_connecter.php on line 3


Donc j'en déduis que la session n'est pas encore définie avant la connexion de l'utilisateur ?


Y'a pas de session_start avant le print_r ?


nickargall
WRInaute accro
WRInaute accro
 
Messages: 6468
Inscription: 13 Juin 2005

Re: Un peut de PHP SQL pour finir l'apres midi !

Message le Lun Avr 18, 2011 17:40

Bonjour
Je me trompe peut etre, mais il semble y avoir un souci de logique dans ton code de vérification login / password
Code: Tout sélectionner
$login = $_POST['login'];
$pwd = $_POST['pwd'];

jusque là presque ok, sauf que tu n'as pas vérifié que les variables existent et soient renseignées

Code: Tout sélectionner
$sql = "SELECT * FROM profils WHERE USERNAME='" . $login . "' AND MDP='" . $pwd . "';"; //selection du compte depuis la DB
$resultat = mysql_query($sql);
$ligne = mysql_fetch_array($resultat, MYSQL_ASSOC);

$login_valide = $ligne['USERNAME'];
$pwd_valide = $ligne['MDP'];

donc ici forcement $pwd_valide== $pwd == $_POST['pwd'] et forcement $login_valide== $login == $_POST['login'], vu que ce sont les conditions exprimées dans ta requête SELECT


Code: Tout sélectionner
if (isset($_POST['login']) && isset($_POST['pwd'])) {

ca c'est à faire avant de lancer la requete, sinon erreurs SQL en vue :)


Code: Tout sélectionner
if ($login_valide == $_POST['login'] && $pwd_valide == $_POST['pwd']) { //demarrage session



ce sera toujours valide, étant donné que ce sont forcément les mêmes valeurs (cf plus haut)


Mon conseil :
- verification que les login & pwd sont renseignées; sinon message d'erreur
- requete SQL sur la ligne basée sur le login seul - Si pas de résultat, connexion interdite
- stockage dans une variable de la valeur du pwd associée au login dans la base
- si il est identique au pwd envoyé par le formulaire, là tu connectes.

Et bien sur, sécuriser les variables récoltées du formulaire pour éviter les injections et autres tentatives de crackage :)


nickargall
WRInaute accro
WRInaute accro
 
Messages: 6468
Inscription: 13 Juin 2005

Re: Un peut de PHP SQL pour finir l'apres midi !

Message le Lun Avr 18, 2011 17:50

Exemple d'injection sur ton code :

J'indique, dans le formulaire, pour le login, l'expression suivante :

test' OR 1=1"; et un mot de passe bidon

ce qui me fera le traitement suivant :

$sql = "SELECT * FROM profils WHERE USERNAME='test' OR 1=1"; ' AND MDP='bidon';";

et ensuite une requete sql
SELECT * FROM profils WHERE USERNAME='test' OR 1=1;

ce qui est toujours vrai (1 est toujours égal à 1) donc je me connecte à coup sur.

Un peut de PHP SQL pour finir l'apres midi !

Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité