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

WRInaute occasionnel
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:
<?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:
<?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>";
}
?>
 
WRInaute accro
Tu sais que tu peux faire comme tu as fais plus haut, à savoir fermer la balise php et mixer avec du HTML :

Code:
while ($ligne = mysql_fetch_array($result, MYSQL_ASSOC)) {
?>
<td>
        <?php echo $ligne['IDPROFIL']; ?></td>
        ...
 
WRInaute occasionnel
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 ?
 
WRInaute accro
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 ?
 
WRInaute occasionnel
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 .... :?
 
WRInaute accro
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 ?
 
WRInaute occasionnel
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');
}
}
?>
 
WRInaute accro
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 ?
 
WRInaute accro
jamalofski a dit:
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 :/
 
WRInaute occasionnel
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:
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 ?
 
WRInaute occasionnel
jamalofski a dit:
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 :)
 
WRInaute accro
user2home a dit:
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:
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 ?
 
WRInaute accro
Bonjour
Je me trompe peut etre, mais il semble y avoir un souci de logique dans ton code de vérification login / password
Code:
$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:
$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:
if (isset($_POST['login']) && isset($_POST['pwd'])) {
ca c'est à faire avant de lancer la requete, sinon erreurs SQL en vue :)


Code:
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 :)
 
WRInaute accro
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.
 
WRInaute accro
Euh non en fait, n'importe quoi, mon dernier post n'est pas vrai. J'peux pas éditer, si quelqu'un veut le supprimer :)
 
WRInaute occasionnel
Bonjour, après encore quelques heures mon script semble fonctionner, mon soucis viens uniquement de la connexion à présent.
J'ai utilisé le script de http://www.lephpfacile.com/cours/18-les-sessions#h2 comme base que j'ai modifié :wink:

Lorsque je me connect avec mon nom d'utilisateur et mon mot de passe, après avoir validé la page ce recharge.... mais je ne suis toujours pas connecté .... j'ai de nouveau ma fenetre qui me demande mon identifiant et mon mot de passe !

La je ne vois pas du tout ce qui pourrai me faire ce soucis..... :?

<?php
// On définit un login et un mot de passe de base pour tester notre exemple. Cependant, vous pouvez très bien interroger votre base de données afin de savoir si le visiteur qui se connecte est bien membre de votre site
include_once ('../../cfg/connexion.cfg.php');
$login =$_POST['login'];
$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'];

// on teste si nos variables sont définies
if (isset($_POST['login']) && isset($_POST['pwd'])) {

// on vérifie les informations du formulaire, à savoir si le pseudo saisi est bien un pseudo autorisé, de même pour le mot de passe
if ($login_valide == $_POST['login'] && $pwd_valide == $_POST['pwd']) {
// dans ce cas, tout est ok, on peut démarrer notre session

// on la démarre :)
session_start ();
// on enregistre les paramètres de notre visiteur comme variables de session ($login et $pwd) (notez bien que l'on utilise pas le $ pour enregistrer ces variables)
$_SESSION['login'] = $_POST['login'];
$_SESSION['pwd'] = $_POST['pwd'];

// on redirige notre visiteur vers une page de notre section membre
header ('location: ../../');
}
else {
// Le visiteur n'a pas été reconnu comme étant membre de notre site. On utilise alors un petit javascript lui signalant ce fait
echo "Veuillez saisir un nom d'utilisateur valide";
// puis on le redirige vers la page d'accueil

}
}
else {
echo 'Les variables du formulaire ne sont pas déclarées.';
}
?>
 
WRInaute impliqué
Est-ce que tu sais lire un code ? Pas dans le sens propre, mais transformer le code un texte humainement compréhensible.

Exemple de traduction de ton code :
  • inclure « '../../cfg/connexion.cfg.php' » (implique de transformer le code de ce fichier et de le placer à la place de cette ligne)
  • définir $login et $pwd en utilisant $_POST['login'] et $_POST['pwd']
  • sélection du profil dans la BDD en utilisant ces variables
  • définir $login_valide et $pwd_valide avec $ligne['USERNAME'] et $ligne['MDP']
  • si $_POST['login'] et $_POST['pwd'] existent
    • si $login_valide == $_POST['login'] et $pwd_valide == $_POST['pwd']
      • démarrer la session
      • définir $_SESSION['login'] et $_SESSION['pwd'] avec $_POST['login'] et $_POST['pwd']
      • redirection vers « ../../ »
    • sinon
      • écrire « Veuillez saisir un nom d'utilisateur valide »
  • sinon
    • écrire « Les variables du formulaire ne sont pas déclarées. »

Tu ne vois pas un (même plusieurs d'ailleurs) problème de logique ?
La programmation est avant tout de la logique, où il faut faire les choses le plus simplement possible (avec sécurité). Sans logique, il est dur d'avancer.
 
WRInaute occasionnel
Blount a dit:
Je n'ai pas parcouru toutes les messages ;)

Cela te donne une réponse, ton message est limite insultant, ca approche le statut de la débilité la manière dont tu l'exprime. Et pour une fois je savais déjà tout ce que tu as marqué dans ton intervention.

Je remercie les précédentes intervention qui m'ont permis de résoudre mon soucis ainsi que ce post ( http://www.lephpfacile.com/cours/18-les-sessions ) fort utile pour comprendre la logique des session.

Cordialement

EDIT: Je suis à l'écoute des plus sages mais ta façon de dire ca est pleine d'arrogance donc pour ton information

Est-ce que tu sais lire un code ? Pas dans le sens propre, mais transformer le code un texte humainement compréhensible.

On appel ca de l'algorithmique
 
WRInaute impliqué
Non mais ne t'emballe pas. Combien de personne s'aventure dans la programmation PHP ne prenant pas réellement le langage au sérieux du fait de son fort rapprochement avec la conception de site web.

Le PHP est un langage de programmation peut-être simple à apprendre, mais capable du meilleurs comme du pire. Et si l'on ne maitrise pas celui-ci, on se retrouve avec des machines zombies grâce au crackage de site web.

Ma question était tout à fait sérieuse. Ce n'est pas parce que la plupart du temps on la sort pour se foutre du monde qu'on ne peut pas la poser sérieusement.

Personnellement, l'algorithmique (sur papier par exemple), je ne le fait jamais, car je n'en ai pas besoin (elle ne t'apprend strictement rien). Mais certaines personnes ont moins de « logique » et partent souvent dans un truc compliqué et peu compréhensible. Et ton code (de ton poste précédent) est tout à fait un code sans logique. Tu veux que je te le dise comment ?

Je pourrai te pondre le code tout fait, mais ça ne t'apprendrai rien.

J'ai pris du temps à écrire mon poste, tu penses réellement que j'aurai perdu autant de temps rien que pour me la jouer ? J'ai autre chose à faire.

Montre nous ton code final, parce que si tu as laissé la plupart du code présent dans ton poste, tu risques d'avoir quelques surprises.

Sur ce, tu le prends comme tu veux mais c'est hélas la réalité des choses. Certains ton données des informations importantes (notamment les injections SQL) et tu ne les as pas pris en compte.
 
WRInaute occasionnel
Salut !

C'est pas juste un problème de quiproquo au final ? Car sur un forum, mise à part les smiley, le ton est parfois complexe à déceler et on peut très facilement prendre un message comme ironique, voir agressif, alors que c'était pas du tout le but du posteur ...

Bref, Blount n'a pas peut-être pris de gants pour dire ce qu'il pensait mais sur le fond, je pense que tu (user2home) devrais prendre en considération ce qui a été dit ;)
 
WRInaute occasionnel
J'ai tout lus, j'ai pris ce qui pouvait me faire avancer.

Vous postez mon code finale ne pourrai en rien faire avancer ma situation, je suis encore en apprentissage. Mon code ne peut pas être parfait du premier coup, un jour j'aurai surement la prétention de déballer mon code en public et de proposer mon aide! Pour le moment je pense pas être qualifié pour ca :mrgreen:


Sans aucun rancune merci à tous :)
 
WRInaute impliqué
Bin justement, montrer ton code n'a pas pour but de te dire que t'es une daube en programmation, mais te signaler les erreurs que tu fais. Les bonnes pratiques doivent être apprises dès le début, sinon, on prend l'habitude de faire avec nos erreurs et il en devient plus dur de changer.
 
Discussions similaires
Haut