Vous n'êtes pas identifié(e).
salut a tous
mon code fonctionne parfaitement mais je souhaite savoir si il y a des améliorations a faire... ou bien des suggestions de votre part :
si oui : donnez moi un maximum d'explications SVP car je ne suis pas un expert du tout..
login.php (connexion a un espace membre)
$base = mysql_connect ('serveur', 'login', 'password');
mysql_select_db ('nom_base', $base);
// on teste si une entrée de la base contient ce couple login / pass
$sql = 'SELECT count(*) FROM membre WHERE login="'.mysql_escape_string($_POST['login']).'" AND pass_md5="'.mysql_escape_string(md5($_POST['pass'])).'"';
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
$data = mysql_fetch_array($req);
mysql_free_result($req);
mysql_close();
// si on obtient une réponse, alors l'utilisateur est un membre
if ($data[0] == 1) {
session_start();
$_SESSION['login'] = $_POST['login'];
header('Location: membre.php');
exit();
}
// si on ne trouve aucune réponse, le visiteur s'est trompé soit dans son login, soit dans son mot de passe
elseif ($data[0] == 0) {
$erreur = 'Compte non reconnu.';
}
// sinon, alors la, il y a un gros problème :)
else {
$erreur = 'Probème dans la base de données : plusieurs membres ont les mêmes identifiants de connexion.';
}
}
else {
$erreur = 'Au moins un des champs est vide.';
}
}
?>
<html>
<head>
<title>Accueil</title>
</head>
<body>
Connexion à l'espace membre :<br />
<form action="index.php" method="post">
Login : <input type="text" name="login" value="<?php if (isset($_POST['login'])) echo htmlentities(trim($_POST['login'])); ?>"><br />
Mot de passe : <input type="password" name="pass" value="<?php if (isset($_POST['pass'])) echo htmlentities(trim($_POST['pass'])); ?>"><br />
<input type="submit" name="connexion" value="Connexion">
</form>
<a href="inscription.php">Vous inscrire</a>
<?php
if (isset($erreur)) echo '<br /><br />',$erreur;
?>
</body>
</html>
Merci
Hors ligne
Ligne 4 : le !empty remplace le travail du isset, ce dernier est donc inutile dans la ligne (le empty est programmé à partir du isset)
Ligne 6-7 : tu ne gères pas les erreurs de connexion, si la connexion ne peut se faire le script sera tout de même chargé actuellement
Ligne 11 : tu affiches la requête à tous les passants du coin en cas d'erreur !!!!! Certains pourraient se faire un malin plaisir à faire joujou avec ta page... Ne jamais donner d'informations sur le script aux visiteurs, c'est une règle d'or !
Ligne 18 : si la requête ne renvoie aucun résultat ta variable ne sera pas initialisée à cet index, il manque donc un isset.
Ligne 25 : idem
Hors ligne
Saluton,
Moi ce sont les lignes 46 et 47 qui me font froid dans le dos.
Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy
Hors ligne
De nombreux site le font, PhpBB compris dans le lot (bon sauf pour le mot de passe...).
Qu'est ce que cela peut générer comme faille de sécurité Kris ?
Hormis le mot de passe en clair dans le code html généré.
Dernière modification par xTG (10-02-2010 08:55:33)
Hors ligne
"De nombreux site le font, PhpBB compris dans le lot (bon sauf pour le mot de passe...)."
font quoi ?^^
"Qu'est ce que cela peut générer comme faille de sécurité Kris ?
Hormis le mot de passe en clair dans le code html généré."
en clair ?! a quel moment ?
kris : "Moi ce sont les lignes 46 et 47 qui me font froid dans le dos." ok mais pourquoi ?
Hors ligne
Le fait de réafficher le pseudo dans le input box lors d'une erreur de connexion.
Dans le code on pourra voir la valeur de ton champs input => le mot de passe en CLAIR. Tu prends donc le scénario de la personne qui se connecte mais tape un mauvais pseudo mais un mot de passe correct. Arrivé sur la page avec l'erreur de connexion il se dit qu'il verra plus tard (ou tout autre chose) puis s'en va sans fermer la page. Une autre personne arrive regarde le code généré par le navigateur et possède le mot de passe. Il n'est pas très difficile ensuite à retrouver le pseudo qui doit surement contenir un caractère en trop ou un truc bénin.
Hors ligne
mummm mais... de toute façon j'arrive toujours pas a comprendre "la faille" xTG.. puis toi non plus car tu pose la meme question que moi a Kris :
"Qu'est ce que cela peut générer comme faille de sécurité Kris ?
Hormis le mot de passe en clair dans le code html généré."
car meme avec le mot de passe en clair dans le code HTML, c'est le mot de passe que tapera le visiteur dans le formulaire de connexion donc je vois pas de faille... ?!
Hors ligne
Hormis le mot de passe en clair dans le code html généré... je ne vois pas de faille... ?!
Elle est pourtant béante, celle-là !
Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy
Hors ligne
c'est le mot de passe que tape le membre donc ? il verra le mot de passe qu'il tape c'est tout
Hors ligne
Et le web est un réseau sécurisé, c'est bien connu.
Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy
Hors ligne
ba oui.... enfin bref je comprend toujours pas Kris !
le visiteur tape le mot de passe dans le champ password du formulaire, ensuite il clic sur Connexion mais a un message d'erreur il clic-droit "Afficher la source" dans la source il y a le mot de passe en clair (donc le mauvais mot de passe ou meme pseudo qui la tape) et alors ??? s'il a pas les bons login/mot de passe il pourra rien faire donc ??? et alors !
Hors ligne
La majorité des erreurs sont des erreurs de frappe... Donc il suffit de changer un caractère pour avoir le bon mot de passe.
Pour un hacker c'est bien plus simple que de trouver le mot de passe en cherchant de 0.
Hors ligne
comment le hacker obtient la meme source que le visiteur ? le visiteur chez lui bien tranquil !
Hors ligne
Si tu savais tout ce qu'on peut retrouver comme spyware et ce qu'ils font tu poserais pas une question aussi bête. ^^
Tu sais il y a même des logiciels qui enregistrent ce que tu tapes sur ton clavier... Il y en a d'autres qui filment ce que tu regardes et j'en passe.
Bref on peut t'assurer que c'est une faille de sécurité. De plus pourquoi le remettre alors que sur le navigateur on ne verra que des étoiles ? Cela ne sert strictement à rien.
Hors ligne
Laisse tomber xTG, quand il viendra pleurer ici parce que son site aura été victime d'attaques, il sera probablement plus réceptif à nos conseils.
Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy
Hors ligne
xTG : oui pas faux pour les étoiles ! je supprime je boss aussi sur t'es premiers conseils dans ton premier post ! merci.
"Laisse tomber xTG, quand il viendra pleurer ici parce que son site aura été victime d'attaques, il sera probablement plus réceptif à nos conseils."
pourquoi tu parle comme cela ??? c'est un forum d'entraide, tu post une seule ligne par post aprés tu veux qu'un debutant (comme moi) arrive a comprendre.. dsl si je comprend pas tout de suite d'un seul coup messieur.
Dernière modification par david7 (11-02-2010 20:53:29)
Hors ligne
Hors ligne
tu post une seule ligne par post aprés tu veux qu'un debutant (comme moi) arrive a comprendre.. dsl si je comprend pas tout de suite d'un seul coup messieur.
Quand on alerte sur une telle évidence il ne sert à rien de faire une dissertation.
On ne retourne en aucune circonstance un mot de passe en clair un point c'est tout.
Si tu n'es pas capable d'intuiter ça tout seul, ce n'est pas la peine d'espérer aller très loin dans ce domaine.
Quant à la qualité de mes interventions sur ces forums, fais tes preuves et lorsque tu auras rendu le dixième des services que j'ai eu la joie d'apporter ici tu viendras parler, petit bonhomme.
Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy
Hors ligne
Ouais ouais ouais je suis second !!! Ah hum...
Kris répond à tellement de messages que certains ne sont pas très étoffé mais il faut le comprendre. On ne peut pas prendre le temps de mettre 10 minutes dans la rédaction de chaque message sinon on ne s'en sortirai plus.
Concernant le empty c'est tout à fait cela. Pour la ligne 3 tu peux même optimiser.
Car c'est évalué de gauche à droite. Lorsqu'il verra le ET et qu'il aura évalué la première expression comme fausse il s'arrêtera sans évaluer la seconde.
Donc tu peux remplacer le isset par !empty. Cela revient au même puisque si la variable est vide elle ne peut valoir 'Connexion'.
Hors ligne
ah ok donc comme ceci :
ou bien :
Hors ligne
Le premier assurément !
La ligne de ton second code s'ensuit ainsi :
Cas où $_POST['connexion'] = 'Connexion'
if( !empty( $_POST['connexion'] == 'Connexion'] )
if( !empty( true ) )
if( true )
S'éxécute
Cas autre
if( !empty( $_POST['connexion'] == 'Connexion'] )
if( !empty( false) )
if( false)
ne s'éxécute pas (mais pas propre de tester un !empty sur un false...)
Il ne faut pas oublier que chaque expression se remplace par un true ou un false.
Dernière modification par xTG (13-02-2010 15:15:36)
Hors ligne
merci pour ta réponse.
sinon j'ai pas conpris : "mais pas propre de tester un !empty sur un false..." c'est a dire ? tu ma dit que je pouvais faire pareil.
Hors ligne
ok merci j'ai modifié les 2 premiers points aussi celui de Kris sur la faille.. voici le nouveau code :
* Ligne 6-7 : tu ne gères pas les erreurs de connexion, si la connexion ne peut se faire le script sera tout de même chargé actuellement
jette un oeil pour me dire si c'est bon stp ou si il y a mieu a faire
sinon je comprend pas les points suivants :
* Ligne 11 : tu affiches la requête à tous les passants du coin en cas d'erreur !!!!! Certains pourraient se faire un malin plaisir à faire joujou avec ta page... Ne jamais donner d'informations sur le script aux visiteurs, c'est une règle d'or !
je retire quoi dans la ligne : $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
le $sql sans doute ? mais je pige pas car il y a des ' au debut/a la fin j'efface d'ou a ou ?
* Ligne 18 : si la requête ne renvoie aucun résultat ta variable ne sera pas initialisée à cet index, il manque donc un isset.
je comprend pas (dsl)
* Ligne 25 : idem
je comprend pas (dsl)
voici le nouveau code (attention le numéro des lignes ci-dessus car j'ai modifié donc plus les memes...)
$mabasededonnee="nombase";
$base = mysql_connect("localhost","root","motdepasse");
// test la connection
if ( ! $base )
die ("connection impossible");
// Connecte la base
mysql_select_db($mabasededonnee) or die ("pas de connection");
// on teste si une entrée de la base contient ce couple login / pass
$sql = 'SELECT count(*) FROM membre WHERE login="'.mysql_escape_string($_POST['login']).'" AND pass_md5="'.mysql_escape_string(md5($_POST['pass'])).'"';
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
$data = mysql_fetch_array($req);
mysql_free_result($req);
mysql_close();
// si on obtient une réponse, alors l'utilisateur est un membre
if ($data[0] == 1) {
session_start();
$_SESSION['login'] = $_POST['login'];
header('Location: membre.php');
exit();
}
// si on ne trouve aucune réponse, le visiteur s'est trompé soit dans son login, soit dans son mot de passe
elseif ($data[0] == 0) {
$erreur = 'Compte non reconnu.';
}
// sinon, alors la, il y a un gros problème :)
else {
$erreur = 'Probème dans la base de données : plusieurs membres ont les mêmes identifiants de connexion.';
}
}
else {
$erreur = 'Au moins un des champs est vide.';
}
}
?>
<html>
<head>
<title>Accueil</title>
</head>
<body>
Connexion à l'espace membre :<br />
<form action="index.php" method="post">
Login : <input type="text" name="login" value=""><br />
Mot de passe : <input type="password" name="pass" value=""><br />
<input type="submit" name="connexion" value="Connexion">
</form>
<a href="inscription.php">Vous inscrire</a>
<?php
if (isset($erreur)) echo '<br /><br />',$erreur;
?>
</body>
</html>
Hors ligne