IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

livre d'or à améliorer et à sécuriser


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2011
    Messages : 25
    Points : 15
    Points
    15
    Par défaut livre d'or à améliorer et à sécuriser
    Bonjour à tous,

    je travaille actuellement sur la refonte d'un site auquel je voudrais ajouter un livre d'or, étant débutant, j'aimerais avoir votre avis sur le code et notamment d'un point de vue sécurité, ou s'il y a des améliorations que je pourrais apporté.
    j'aimerais aussi savoir (mais peut-être ne suis-je pas sur le bon forum), si on peut l'améliorer avec du javascript (ou jquery).
    voici mon code :

    le premier est config.php, ce sont mes éléments de configuration, que je changerais pour mettre ceux du serveur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
     
    define('DB_SERVEUR', 'localhost');
     
    define('DB_NAME', 'livreor');
     
    define ('DB_LOGIN','root');
     
    define('DB_PASS', '');
     
    define('DB_ENC', 'UTF8');
    ?>
    le deuxième est index.php:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    <?php
    require "config.php";
     
    //connexion base de donnée
    mysql_connect(DB_SERVEUR, DB_LOGIN, DB_PASS);
    mysql_select_db(DB_NAME);
    mysql_query('SET NAMES '.DB_ENC);
     
    //on vérifie qu'un message est posté et on l'ajoute dans bd
    if(!empty($_POST))
    {
    	$pseudo = mysql_real_escape_string(htmlspecialchars($_POST['pseudo']));
    	$email = mysql_real_escape_string(htmlspecialchras($_POST['email'])); 
        $message = mysql_real_escape_string(htmlspecialchars($_POST['message']));
        $message = nl2br($message);
    	extract($_POST);
    	$ip= $_SERVER["REMOTE_ADDR"];
    	$sql = "INSERT INTO lo_message (pseudo,mail,message,ip) VALUES ('$pseudo','$email','$message','$ip')";
    	mysql_query($sql) or die('erreur SQL !<br>'.$sql.'<br>'.mysql_error());
    }
     
    //Suppression message
    if(isset($_GET['suppr']))
    {
    	$sql = "DELETE FROM lo_message WHERE id={$_GET['suppr']}";
    	mysql_query($sql) or die('erreur SQL !<br>'.$sql.'<br>'.mysql_error());
    	echo "Message supprimmé";
    }
    ?>
     
    <form method="post" action="index.php">
    	nom : <input type="text" name="pseudo"/><br/>
    	mail : <input type="text" name="email"/><br/>
    	message :<br/>
    	<textarea name="message"></textarea><br/>
    	<input type="submit" value="envoyer"/>
    </form>
     
     
    <?php>
    	//requête et affichage du résultat
    $sql="SELECT * FROM lo_message ORDER BY id DESC";
    $req = mysql_query($sql) or die('erreur SQL !<br>'.$sql.'<br>'.mysql_error());
    while ($data = mysql_fetch_assoc($req))
    {
    	echo "<strong>".$data['pseudo']."</strong>";
    	//effacer message, à paramettrer pour l'admin
    	echo '<a href="index.php?suppr=' .$data["id"]. '"> x </a><br/>';
    	echo "<p>".$data['message']."</p>";
    }
     
    print_r($data);
     
    mysql_close();
    ?>
    je souhaiterais aussi améliorer par la suite en contrôlant si l'identifiant est dispo en javascript (ou jquery), si l'email rentré est valide et est répertorié dans la base de donnée de la news letter (faut être abonné pour pouvoir laisser un message. là je sèche, tout est aide est la bienvenue.

    Merci d'avance pour vos réponse.

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Ta requête n'est pas protégée puisque tu as un
    qui écrase tes variables après leur traitement.

    Il faudrait également vérifier si l'utilisateur a saisi quelque chose.

    Il n'y a pas lieu d'utiliser htmlspecialchars pour l'insertion des données (au passage le deuxieme est mal écris).

    La requête DELETE n'est pas protégée du tout (et il y a une faute d'orthographe a "supprimé")
    Et la page semble etre accessible a tout le monde, c'est à dire que n'importe qui peut supprimer n'importe quoi.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2011
    Messages : 25
    Points : 15
    Points
    15
    Par défaut
    Bonjour sabotage, effectivement, il y avait quelques problème de sécurité, voilà un code un peu mieux, par contre je n'ai aucune idée de comment réserver le droit d'effacer aux webmaster.

    peux-tu me dire ce que tu pense de ce code là
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    <?php
    require "config.php";
     
    //connexion base de donn�e
    mysql_connect(DB_SERVEUR, DB_LOGIN, DB_PASS);
    mysql_select_db(DB_NAME);
    mysql_query('SET NAMES '.DB_ENC);
     
    //on v�rifie qu'un message est post� et on l'ajoute dans bd
    if(isset($_POST['pseudo']) && isset($_POST['email']) && isset($_POST['message']) && $_POST['pseudo']!=NULL && $_POST['email']!=NULL && $_POST['message']!=NULL)//on verrifie qu ils existe et qu ils ne soit pas null
    {
    	if(!preg_match('#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#is', $email)){//vérification de la validite de l adresse mail
    		$erreur++;
    	}else{
    		$email = mysql_real_escape_string(htmlspecialchars($_POST['email']));
    	}
    	$pseudo = mysql_real_escape_string(htmlspecialchars($_POST['pseudo']));
    	$message = mysql_real_escape_string(htmlspecialchars($_POST['message']));
    	$message = nl2br($message);
    	$ip= mysql_real_escape_string($_SERVER["REMOTE_ADDR"]);
    	if($erreur==0){
    		$sql = "INSERT INTO lo_message (pseudo,mail,message,ip) VALUES ('$pseudo','$email','$message','$ip')";
    		mysql_query($sql) or die('erreur SQL !<br>'.$sql.'<br>'.mysql_error());
    	}
    }
     
    //Suppression message
    if(isset($_GET['suppr']) && $_GET['suppr']!=NULL)
    {
    	$id= mysql_real_escape_string($_GET['suppr']);
    	$sql = "DELETE FROM lo_message WHERE id='".$id."'";
    	mysql_query($sql) or die('erreur SQL !<br>'.$sql.'<br>'.mysql_error());
    	echo "Message supprimm�";
    }
    ?>
     
    <form method="post" action="index.php">
    	nom : <input type="text" name="pseudo"/><br/>
    	mail : <input type="text" name="email"/><br/>
    	message :<br/>
    	<textarea name="message"></textarea><br/>
    	<input type="submit" value="envoyer"/>
    </form>
     
     
    <?php>
    	//requ�te et affichage du r�sultat
    $sql="SELECT * FROM lo_message ORDER BY id DESC";
    $req = mysql_query($sql) or die('erreur SQL !<br>'.$sql.'<br>'.mysql_error());
    while ($data = mysql_fetch_assoc($req))
    {
    	echo "<strong>".$data['pseudo']."</strong>";
    	//effacer message, � paramettrer pour l'admin
    	echo '<a href="index.php?suppr=' .$data["id"]. '"> x </a><br/>';
    	echo "<p>".$data['message']."</p>";
    }
     
    print_r($data);
     
    mysql_close();
    ?>

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    tiens compte des remarques que je t'ai déjà faites.

    De plus, quand ton entrée est numérique, utilise intval() au lieu de mysql_real_escape_string().

    Tu n'as pas besoin de protéger $_SERVER["REMOTE_ADDR"] puisque c'est une valeur fournie par le serveur.

    Pour la restriction à certains utilisateurs, il te faut déjà une gestion des utilisateurs.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 386
    Points : 5 733
    Points
    5 733
    Billets dans le blog
    1
    Par défaut
    Pour la restriction à certains utilisateurs, il te faut déjà une gestion des utilisateurs.
    En effet, il faudrait pouvoir créer un compte (avec mot de passe) et être l'auteur d'un message pour pouvoir le supprimer (en gros ce que j'avais fait sur ce forum en PHP)
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

Discussions similaires

  1. Réponses: 0
    Dernier message: 05/06/2014, 12h02
  2. Réponses: 0
    Dernier message: 18/10/2010, 14h04
  3. existe t il un livre qui explique comment sécuriser un site web
    Par zemickeyman dans le forum Sécurité
    Réponses: 1
    Dernier message: 06/01/2010, 18h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo