JeuWeb - Crée ton jeu par navigateur
Connexion - 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 : Connexion (/showthread.php?tid=2067)

Pages : 1 2


Connexion - Berz - 26-11-2007

Hello tous le monde,

je suis encore un novice en ce qui conserne le php et mysql

je voudrais savoir si ce script de connexion comporte des failles et comment l'améliorer bien sur !!

Il y a une page avec un POST avant cela bien sur!

Code PHP :
<?php
$pseudojou
= $_POST['pseudocon'];
$mdpjou = $_POST['mdpcon'];
mysql_connect("bdd", "db", "code");
mysql_select_db("db");
$pseudo = mysql_query("SELECT pseudo, mdp FROM nom_de_la_table WHERE pseudo='$pseudojou'");
while (
$donnees = mysql_fetch_array($pseudo) )
{
if (isset(
$donnees['pseudo']))
{
if(
$pseudojou == $donnees['pseudo'] AND $mdpjou == $donnees['mdp'])
{
?>
/*go page suivante*/
<?php
}
else
{
?>
<center>Informatinos erronées !!!</center>
<meta http-equiv="refresh" content="1; url=page_de_connexion" />
<?php
}
}
else
{
?>
<center>Informatinos erronées !!!</center>
<meta http-equiv="refresh" content="1; url=page_de_connexion" />
<?php
}
}
mysql_close();
?>

voilà j'espère que c'est clair !

merci !![/php]


RE: Connexion - Berz - 26-11-2007

dans ce cas il faut laisser

if (isset($donnees['pseudo']))

pour savoir si il a touver qqc ou pas ?


RE: Connexion - Berz - 26-11-2007

Ben j'aurais pensé a envoye les variables pseudo et password avec un formulaire GET et vérifier à chaque page avec

mysql_query("SELECT pseudo FROM nom_de_la_table WHERE pseudo='$pseudojou' and password = '$passalacon'");

mais je pense que c'est trop lourd .

As-tu une autre solution ?


RE: Connexion - Galaan - 26-11-2007

mysql_query("SELECT pseudo FROM nom_de_la_table WHERE pseudo='$pseudojou' and password = '$passalacon'");

Oula !!!!

Ne jamais faire ca malheureux !!!!

Le mieux pour etre sur d'eviter les failles est de faire
mysql_query("SELECT id,pseudo,password FROM nom_de_la_table WHERE pseudo='$pseudojou'");
Et de boucler sur la liste pour savoir si le mot de passe existe.

Sinon c'est une invitation au sql injection.(sauf si tu blindes cote php)


RE: Connexion - Galaan - 26-11-2007

Ca passe avec la liste de tous les mots de passe que si tu ne verifies que le mot de passe. Si tu verifies le pseudo et le pass ca ne passe plus.

Mais de toute facon, il est clair que tu as raison, securiser toutes ses variables de facon systematique est une excellente habitude a prendre. Ca evite les mauvaises surprises.


RE: Connexion - Zamentur - 26-11-2007

Je dirais meme que la colone "pseudo" (ou de preference la colonne id qui y correspond) doit etre positionner en clef index/unique (avec auto increment pour l'id)
De cette façon il n'y a pas besoin de mettre de while car la requete s'arreteras de chercher dès le premier resultat (pas besoin de LIMIT 1 à rajouter en théorie)

Code PHP :
<?php 
<meta http-equiv="refresh" content="1; url=page_de_connexion" />
prefere la methode par header() à rechercher dans la reference...
N'oublie pas de mettre ton URL de façon absolue (ou fait une fonction qui le fait pour toi)


Si possible indente ton code, je sais que sur un forum c'est soulant, mais là tu as due faire un copier /coller donc l'indentation aurrais du apparaitre

Code PHP :
<?php 
mysql_connect
("bdd", "db", "code");
mysql_select_db("db");
Je te conseil vivement de te creer une fonction qui te connecte à la bdd et de mettre ces parametre ailleurs qu'en plein milieu du code de connexion! Et oui car tu utiliseras forcement ces données sur d'autre page, que ce passeras t'il le jour ou tu changeras d'hebergement? Tu reecriras tout tes codes? Non, alors centralises tes données

Sinon pour md5 et les session je suis tout à fait d'accord!
Et je suis d'accord avec oxman! La le script est vulnerable sur un formulaire qui est forcement accessible à tous! Ca veux dire que quiconque a assez de jujote pour trouver un nom de table de ton jeu peut le foutre en l'air en moins de 2 minutes...


RE: Connexion - Berz - 27-11-2007

OK pour les variables sessions j'ai compris mais j'ai une question:

comment on sécurise ses variables ! si vous avez un lien ca va aussi !


RE: Connexion - Sephi-Chan - 27-11-2007




RE: Connexion - Zamentur - 27-11-2007

Alors pour la securité, le premier pas c'est d'y penser effectivement!
un lien qui me semble etre pas mal:
http://phpsec.org/projects/guide/fr/1.html

Sinon, reprenont ici le debut de ton script:
Code PHP :
<?php
$pseudojou
= $_POST['pseudocon'];
$mdpjou = $_POST['mdpcon'];
mysql_connect("bdd", "db", "code");
mysql_select_db("db");
$pseudo = mysql_query("SELECT pseudo, mdp FROM nom_de_la_table WHERE pseudo='$pseudojou'");
while (
$donnees = mysql_fetch_array($pseudo) )
{
if (isset(
$donnees['pseudo']))
{
if(
$pseudojou == $donnees['pseudo'] AND $mdpjou == $donnees['mdp'])
{
?>
Ce script ouvre clairement une faille dans ton jeu si le script d'inscription est à peu prés pareil:

En effet ici tu perlet aux utilisateur d'inserer du html dans leur pseudo, et par consequent d'afficher ce qu'il leur semble bien sur ta page
Un bon scripteur ayant étudié les code du jeu pourrait reussir à afficher par exemple de la publicité, ou alors un formulaire demandant une adresse mail aux autres joueurs(les joueurs pensant que c'est le jeu qui le demande) et ainsi spammer ces derniers
Ca peut aussi les obliger à supprimer leur compte

pour eviter çà il faut encoder les balise html de maniere à les afficher plutot qu'à les executer:
http://de3.php.net/manual/fr/function.htmlspecialchars.php (par exemple avec htmlspecialchar()...

Mais tu peux par exemple definir une fonction qui impose un pseudo d'une cerrtaine taille à l'enregistrement, qui impose que seul les lettres et les chiffres sont accepté...



De maniere général ne pas faire confiance à ce qui vient de l'exterieur!
Notament les données recuperer par POST,GET, COOKIES et l'entete HTTP (donc les superglobal utilisateur)
Mais aussi les donnée lue sur le net (par exemple si le site lis une page d'un autre site (qu'on ne controle pas) pour en extraire des données celles ci(par exemple les script pour les tchats qui affiche vous avez tant de tchateur...)

Donc en gros si la variable doit etre un nombre positif entier il faut verifier si c'est le cas, si ce doit etre une phrase sans HTML et SQL pareil
Si la variable est censé venir d'un formulaire du jeu il est possible de verifier dans l'entet HTTP la provenance de la page (mais attention elle est falsifiable) , il est aussi possible de verifier que le formulaire a été généré pour cette personne juste avant...
Pour eviter les bugs il faut se soucier des apostrophes dans les phrases qui seront enregistré dans sql

De maniere general php demande d'utiliser http://de3.php.net/manual/fr/function.mysql-real-escape-string.php ce que peut font à cause du probleme de lisibilité que celà implique (c'est là que la creation d'une classe d'abstraction sql peut devenir utile)


Sinon il y a des attaques très dure à contrer comme les attaques de type XRCF. Dans un premier temps il est preferable de passer par POST pour tout ce qui est execution d'action
Dans un second temps , pour une protection beaucoup plus longue à transgresser il faut generer des nom de champs de formulaire aleatoire, de façon à verifier qu'elle provienne bien du bon formulaire. Et verifier le HTTP REFERER si le hacker l'aurais oublié
Toutes les actions importante( comme le changement de mot de passe, la supression d'un compte) doivent demander le mot de passe (qui si il n'est pas connue stoppe ce type d'attaque) surtout si l'utilisateur s'est connecté auparavant!

Aujourd'hui je pense pas etre dans le faux en disant que la plus part des sites sont très vulnerable à cette faille, et qu'il n'existe pas de solution 100% fiable(en dehors du mot de passe) contre cette derniere (avec la combinaison HTML/PHP). Juste des solutions qui sont très longue à contourner...

EDIT: oops j'ai encore ecris un trucs un peu en decalage de ce qui as étais demandé ...


RE: Connexion - Berz - 27-11-2007