Question sécurité php
Php_Sécurité
-
Php_securite Messages postés 6 Statut Membre -
Php_securite Messages postés 6 Statut Membre -
Bonjour,
Je voudrais vous soumettre mon code pour savoir si celui ci ne comporte pas de faille ?
Voici le code :
Faut il le rendre conforme avec les nouvelles fonction PDO ?
Je voudrais vous soumettre mon code pour savoir si celui ci ne comporte pas de faille ?
Voici le code :
<?php
// on teste si le visiteur a soumis le formulaire de connexion
if (isset($_POST['connexion']) && $_POST['connexion'] == 'Connexion') {
if ((isset($_POST['login']) && !empty($_POST['login'])) && (isset($_POST['pass']) && !empty($_POST['pass']))) {
$base = mysql_connect ('localhost', 'root', 'pass');
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.';
}
}
?>
Faut il le rendre conforme avec les nouvelles fonction PDO ?
A voir également:
- Question sécurité php
- Question de sécurité - Guide
- Votre appareil ne dispose pas des correctifs de qualité et de sécurité importants - Guide
- Mode securite - Guide
- Easy php - Télécharger - Divers Web & Internet
- Clé de sécurité windows 10 gratuit - Guide
8 réponses
Bonsoir,
A priori tu as bien fais ce qu'il fallait niveau sécurité. Sinon je te conseil d'utiliser PDO pour te simplifier la vie, et éviter ce genre de variable : mysql_escape_string($_POST['login'])
A priori tu as bien fais ce qu'il fallait niveau sécurité. Sinon je te conseil d'utiliser PDO pour te simplifier la vie, et éviter ce genre de variable : mysql_escape_string($_POST['login'])
Php_Sécurité
Merci pour ta réponse ! je débute en php, pourrais tu me soumettre un exemple avec PDO ? car j'ai essayé avec PDO et je foire tout le code...
Voila un des codes pour se connecter. Il faut que tu change les requêtes, et le mot de passe n'est pas en md5 il faut que tu le fasse.
<?php
session_start();
?>
<form method="post" action="#">
<input name="account" type="text" value="account"><br/>
<input name="password" type="password" value="Mot de passe"><br/>
<input type="submit" value="Valider"/><br/>
</form>
<?php
try //test de la connexion
{
$bdd = new PDO('mysql:host=localhost;dbname=test','root',''); //connexion
}
catch (Exception $e)
{
die('Erreur : '.$e->getMessage()); // si la connexion échoue, on renvoie un message d'erreur au lieu d'afficher le code php
}
if(isset($_POST['account']) AND isset($_POST['password']))
{
$requete = $bdd->prepare('SELECT COUNT(*) FROM membres WHERE account = ?');
$requete->execute(array($_POST['account']));
$nombreDeLignes = $requete->fetch(); // Récupère le résultat du calcul
if ($nombreDeLignes[0] == 0) // on teste le nombre de ligne: si il est egal à 0, le pseudo n'exite pas
{
echo 'Pseudo incorrect';
}
else
{
$requete = $bdd->prepare('SELECT password FROM membres WHERE account = ?');
$requete->execute(array($_POST['account']));
$reponse = $requete->fetch();
if ($_POST['password'] == $reponse['password'])
{
$_SESSION['account'] = $_POST['account'];
echo 'Bonne navigation<br/>';
echo $_POST['account'];
}
else
{
echo 'Mot de passe incorrect';
}
}
$requete->closeCursor();
}
else
{
echo 'ERREUR';
}
?>
Si tu t'en sors pas voici la table membres
CREATE TABLE 'membres' (
'id' int(11) NOT NULL AUTO_INCREMENT,
'account' varchar(50) NOT NULL,
'password' varchar(50) NOT NULL,
'email' varchar(100) NOT NULL,
PRIMARY KEY ('id')
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
Je n'arrive pas à mettre en place ce code.
J'ai le message pseudo incorrect...
Ma table membre :
Dans le code que j'avais poster en haut je suis redirigé vers la page membre.php
Dans le code que tu m'as donné je ne comprend pas comment la redirection se fera ?
Merci d'avance ;)
J'ai le message pseudo incorrect...
<?php
try //test de la connexion
{
$bdd = new PDO('mysql:host=localhost;dbname=nom_bdd', 'root', 'pass', $pdo_options); //connexion
}
catch (Exception $e)
{
die('Erreur : '.$e->getMessage()); // si la connexion échoue, on renvoie un message d'erreur au lieu d'afficher le code php
}
if(isset($_POST['login']) AND isset($_POST['password']))
{
$requete = $bdd->prepare('SELECT COUNT(*) FROM membres WHERE login = ?');
$requete->execute(array($_POST['login']));
$nombreDeLignes = $requete->fetch(); // Récupère le résultat du calcul
if ($nombreDeLignes[0] == 0) // on teste le nombre de ligne: si il est egal à 0, le pseudo n'exite pas
{
echo 'Pseudo incorrect';
}
else
{
$requete = $bdd->prepare('SELECT password FROM membres WHERE login = ?');
$requete->execute(array($_POST['login']));
$reponse = $requete->fetch();
if ($_POST['password'] == $reponse['password'])
{
$_SESSION['login'] = $_POST['login'];
echo 'Bonne navigation<br/>';
echo $_POST['login'];
}
else
{
echo 'Mot de passe incorrect';
}
}
$requete->closeCursor();
}
else
{
echo 'ERREUR';
}
?>
<form action="index.php" method="post">
<p>Identifiant* <br/>
<input type="text" name="login"
value="<?php if (isset($_POST['login'])) echo htmlentities(trim($_POST['login'])); ?>" /><br /></p>
<p>Mot de passe* <br/>
<input type="password" name="password"
value="<?php if (isset($_POST['password'])) echo htmlentities(trim($_POST['password'])); ?>" /><br />
<input type="submit" name="connexion" value="Connexion" /></p>
</form>
Ma table membre :
1 id int(11) Non Null AUTO_INCREMENT 2 login varchar(50) Non Null latin1_swedish_ci 3 password varchar(50) Non Null latin1_swedish_ci
Dans le code que j'avais poster en haut je suis redirigé vers la page membre.php
Dans le code que tu m'as donné je ne comprend pas comment la redirection se fera ?
Merci d'avance ;)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
C'est bon tous est ok pour moi, j'avais une erreur à l'appel de ma table membre et pas membre's'.
Par contre je n'arrive pas à rediriger vers ma page membre.php l'utilisateur une fois loggé...
j'essaye cela mais ça ne marche pas :
Par contre je n'arrive pas à rediriger vers ma page membre.php l'utilisateur une fois loggé...
j'essaye cela mais ça ne marche pas :
<?php
try //test de la connexion
{
$bdd = new PDO('mysql:host=localhost;dbname=nom_bdd', 'root', 'pass'); //connexion
}
catch (Exception $e)
{
die('Erreur : '.$e->getMessage()); // si la connexion échoue, on renvoie un message d'erreur au lieu d'afficher le code php
}
if(isset($_POST['login']) AND isset($_POST['password']))
{
$requete = $bdd->prepare('SELECT COUNT(*) FROM membre WHERE login = ?');
$requete->execute(array($_POST['login']));
$nombreDeLignes = $requete->fetch(); // Récupère le résultat du calcul
if ($nombreDeLignes[0] == 0) // on teste le nombre de ligne: si il est egal à 0, le pseudo n'exite pas
{
echo 'Pseudo incorrect';
}
else
{
$requete = $bdd->prepare('SELECT password FROM membre WHERE login = ?');
$requete->execute(array($_POST['login']));
$reponse = $requete->fetch();
if ($_POST['password'] == $reponse['password'])
{
session_start();
$_SESSION['login'] = $_POST['login'];
header('Location: membre.php');
exit();
}
else
{
echo 'Mot de passe incorrect';
}
}
$requete->closeCursor();
}
else
{
echo 'ERREUR';
}
?>
<?php
try //test de la connexion
{
$bdd = new PDO('mysql:host=...;dbname=...', '...', '...'); //connexion
}
catch (Exception $e)
{
die('Erreur : '.$e->getMessage()); // si la connexion échoue, on renvoie un message d'erreur au lieu d'afficher le code php
}
if(isset($_POST['login']) AND isset($_POST['password']))
{
$requete = $bdd->prepare('SELECT COUNT(*) FROM membre WHERE login = ?');
$requete->execute(array($_POST['login']));
$nombreDeLignes = $requete->fetch(); // Récupère le résultat du calcul
if ($nombreDeLignes[0] == 0) // on teste le nombre de ligne: si il est egal à 0, le pseudo n'exite pas
{
echo 'Pseudo incorrect';
}
else
{
$requete = $bdd->prepare('SELECT password FROM membre WHERE login = ?');
$requete->execute(array($_POST['login']));
$reponse = $requete->fetch();
if (md5($_POST['password']) == $reponse['password'])
{
session_start();
$_SESSION['login'] = $_POST['login'];
header('Location: membre.php');
}
else
{
echo 'Mot de passe incorrect';
}
}
$requete->closeCursor();
}
else
{
echo 'ERREUR';
}
?>
J'ai un message d'erreur :
Warning: Cannot modify header information - headers already sent by (output started at /index.php:10) in /index.php on line 66