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 :

Mon code est il bon ?


Sujet :

Langage PHP

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Mon code est il bon ?
    Bonjour alors j'aimerais vous exposer mon code ici pour voir ce que vous en pensiez. Failles, propretés etc...
    Avant tout, j'aimerais que vous m'éclaircissiez sur un point.
    Le :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysql_query("SET NAMES 'utf8'");
    Est il obligatoire pour prévenir le serveur MYSQL que la transaction des données ce fait en UTF8 ?

    Pas page enregistrement (pour ce qui est des protections htmlspecialschars, je le fais à l'affichage) :
    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
    <?php
    include ("connect.php");
    $sql = "SELECT * FROM quetes WHERE titre='".$_POST['titre']."'";
    $result = mysql_query($sql);
    if(mysql_num_rows($result) > 0) // Vérification si il existe déjà.
    {
    echo 'La quêtes existe déjà';
    }
    else // Sinon, on enregistre
    {
    if (!empty ($_POST['titre']) && is_numeric($_POST['type']) && is_numeric($_POST['faction']) && is_numeric($_POST['classe']) && !empty ($_POST['de']) && is_numeric($_POST['lvl']) && !empty ($_POST['objectif']) && !empty ($_POST['aide']) && is_numeric($_POST['xp']) && is_numeric($_POST['kinah']))
    {
    include ("connect.php");
    $sql = "INSERT INTO quetes VALUES ('', '".mysql_real_escape_string($_POST['titre'])."', '".($_POST['type'])."', '".($_POST['faction'])."', '".($_POST['classe'])."', '".mysql_real_escape_string($_POST['de'])."', '".($_POST['lvl'])."', '".mysql_real_escape_string($_POST['objectif'])."', '".mysql_real_escape_string($_POST['aide'])."', '".($_POST['xp'])."', '".($_POST['kinah'])."')";
    mysql_query ($sql);
    echo $sql;
    }
    else
    {
    echo 'Vous n\'avez pas remplis tout les champs, ou vous avez fait une erreur...';
    }
    }
    ?>
    Maintenant l'affichage :
    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
    62
    63
    64
    65
    <?php
    // Affichage des quêtes de la faction ELYSEENS !
    if (isset ($_GET['Faction']) AND isset ($_GET['Classe']))
    {
    	if (($_GET['Faction'] == 'Elyseens') OR ($_GET['Faction'] == 'Asmodiens') OR ($_GET['Faction'] == 'E/A') OR ($_GET['Classe'] == 'Tout') OR ($_GET['Classe'] == 'Mage') OR ($_GET['Classe'] == 'Prêtre') OR ($_GET['Classe'] == 'Guerrier') OR ($_GET['Classe'] == 'Éclaireur'))
    	{
    			if ($_GET['Faction'] == 'E/A')
    			{
    			$faction = 0;
    			}
    			if ($_GET['Faction'] == 'Elyseens')
    			{
    			$faction = 1;
    			}
    			if ($_GET['Faction'] == 'Asmodiens')
    			{
    			$faction = 2;
    			}
    			if ($_GET['Classe'] == 'Tout')
    			{
    			$classe = 0;
    			}
    			if ($_GET['Classe'] == 'Mage')
    			{
    			$classe = 1;
    			}
    			if ($_GET['Classe'] == 'Prêtre')
    			{
    			$classe = 2;
    			}
    			if ($_GET['Classe'] == 'Guerrier')
    			{
    			$classe = 3;
    			}
    			if ($_GET['Classe'] == 'Éclaireur')
    			{
    			$classe = 4;
    			}
    		include ("connect.php");
    		$sql = "SELECT * FROM quetes WHERE faction=".$faction." AND classe=".$classe;
    		$result = mysql_query($sql);
    		while ($rep = mysql_fetch_array($result))
    		{
    		echo 'Titre : '.$rep['titre'].'<br />';
    		}
    	}
    }
    // Affichage => FIN
     
    else
    {
    ?>
    <a href="quetes.php?Faction=Elyseens&Classe=Tout">Toutes les quêtes Elyseens</a><br />
    <a href="quetes.php?Faction=Elyseens&Classe=Mage">Elyseens/Mage</a><br />
    <a href="quetes.php?Faction=Elyseens&Classe=Prêtre">Elyseens/Prêtre</a><br />
    <a href="quetes.php?Faction=Elyseens&Classe=Guerrier">Elyseens/Guerrier</a><br />
    <a href="quetes.php?Faction=Elyseens&Classe=Éclaireur">Elyseens/Éclaireur</a><br /><br />
    <a href="quetes.php?Faction=Asmodiens&Classe=Tout">Toutes les quêtes Asmodiens</a><br />
    <a href="quetes.php?Faction=Asmodiens&Classe=Mage">Asmodiens/Mage</a><br />
    <a href="quetes.php?Faction=Asmodiens&Classe=Prêtre">Asmodiens/Prêtre</a><br />
    <a href="quetes.php?Faction=Asmodiens&Classe=Guerrier">Asmodiens/Guerrier</a><br />
    <a href="quetes.php?Faction=Asmodiens&Classe=Éclaireur">Asmodiens/Éclaireur</a><br />
    <?php
    }
    ?>
    Qu'en pensez vous ? Merci

  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
    Tu pourrais un peu alléger le deuxieme script :
    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
    <?php
    if (isset ($_GET['Faction']) AND isset ($_GET['Classe'])) {
    	switch ($_GET['Faction']) {
    		case 'E/A' : $faction = 0; break;
    		case 'Elyseens' : $faction = 1; break;
    		...
    	}
     
    	switch ($_GET['Classe']) {
    		case 'Tout' : $classe = 0; break;
    		case 'Mage' : $classe = 1; break;
    		....
    	}
     
    	if (isset($classe) && isset($faction)) {
    		include ("connect.php");
    		$sql = "SELECT * FROM quetes WHERE faction=".$faction." AND classe=".$classe;
    		$result = mysql_query($sql);
    		while ($rep = mysql_fetch_array($result)) {
    			echo 'Titre : '.$rep['titre'].'<br />';
    		}
    	}
    }
    Ou utiliser des elseif{}

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql = "INSERT INTO quetes VALUES ('', '"
    Il vaut mieux indiquer le nom des champs et ne pas mettre une chaine vide pour l'autoincrementation, certains configurations de mysql ne l'accepte pas.

  3. #3
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 228
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 228
    Points : 8 487
    Points
    8 487
    Billets dans le blog
    17
    Par défaut
    Je mets en commentaire les critiques que je peux apporter au script...

    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
    <?php
    include ("connect.php"); // Pas besoin de " autour d'un littéral, des ' suffisent
     
    // Pas besoin de " autour d'un littéral, utilise " ou immerge $_POST dans la chaîne
    // $_POST n'est pas échappée, magic-quotes ?
    $sql = "SELECT * FROM quetes WHERE titre='".$_POST['titre']."'";
     
    $result = mysql_query($sql);
     
    // Si la requête sert à tester l'existence d'un enregistrement
    // Alors inutile de faire un SELECT *, un SELECT COUNT( ) suffit
    if(mysql_num_rows($result) > 0)
    {
    echo 'La quêtes existe déjà';
    }
    else
    {
    // J'aurais d'abord tester la validité des champs avant de faire appel au serveur MySQL
    // empty( ) n'est pas adapté pour tester si un champ a été rempli ou non
    // is_numeric( ) n'est pas adapté pour tester si une valeur est un entier ou non
    if (!empty ($_POST['titre']) && is_numeric($_POST['type']) && is_numeric($_POST['faction']) && is_numeric($_POST['classe']) && !empty ($_POST['de']) && is_numeric($_POST['lvl']) && !empty ($_POST['objectif']) && !empty ($_POST['aide']) && is_numeric($_POST['xp']) && is_numeric($_POST['kinah']))
    {
    // Tu rappelles une 2nde fois connect.php
    include ("connect.php");
    // Tu n'échappes pas toutes les valeurs envoyées à MySQL
    $sql = "INSERT INTO quetes VALUES ('', '".mysql_real_escape_string($_POST['titre'])."', '".($_POST['type'])."', '".($_POST['faction'])."', '".($_POST['classe'])."', '".mysql_real_escape_string($_POST['de'])."', '".($_POST['lvl'])."', '".mysql_real_escape_string($_POST['objectif'])."', '".mysql_real_escape_string($_POST['aide'])."', '".($_POST['xp'])."', '".($_POST['kinah'])."')";
    mysql_query ($sql);
    // Bien pour le débugage uniquement
    echo $sql;
    }
    else
    {
    echo 'Vous n\'avez pas remplis tout les champs, ou vous avez fait une erreur...';
    }
    }
    ?>
    + Code non indenté = difficilement lisible


    Pour le 2nd script tu peux remplacer la 1re partie par :

    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
     
    if ( isset($_GET['Faction'], $_GET['Classe']) )
    {
            $factions = array(1 => 'Elyseens', 2 => 'Asmodiens', 0 => 'E/A') ;
            $classes = array(0 => 'Tout', 1 => 'Mage', 2 => 'Prêtre', 3 => 'Guerrier', 4 => 'Éclaireur') ;
     
            $faction = array_search($_GET['Faction'], $factions) ;
            $classe = array_search($_GET['Faction'], $classes) ;
     
            if ( $faction !== FALSE && $classe !== FALSE ) {
     
                include ("connect.php");
     
                // Eviter les SELECT * si on n'utilise pas tous les champs
                $sql = "SELECT titre FROM quetes WHERE faction=".$faction." AND classe=".$classe;
                $result = mysql_query($sql);
     
                while ($rep = mysql_fetch_array($result)) {
                    echo 'Titre : '.$rep['titre'].'<br />';
                }
            }
    }
    else ...

  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
    J'ai reflechi (et oui) à ce is_numeric() :

    si l'utilisateur passe autre chose que des chiffres, ca ne passera pas ; si l'utilisateur passe un decimal ou un chiffre avec des zeros au début, ca passera mais mysql ne gardera que la valeur entiere (sous reserve d'utiliser les guillemets).

    Donc finalement n'est ce pas suffisant comme test ? Et du coup inutile d'echapper la chaine.

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par sabotage Voir le message

    Donc finalement n'est ce pas suffisant comme test ? Et du coup inutile d'echapper la chaine.
    J'ai pas compris ce que tu essaye de me dire la :p


    Ensuite
    // empty( ) n'est pas adapté pour tester si un champ a été rempli ou non
    Alors je met quoi ? ^^

    // Tu n'échappes pas toutes les valeurs envoyées à MySQL
    Ce qui veut dire ? (si c'est is_numeric, unitule de faire le test non , )

    Sinon,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysql_query("SET NAMES 'utf8'");
    Est il obligatoire pour prévenir le serveur MYSQL que la transaction des données ce fait en UTF8 ?

  6. #6
    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
    Est il obligatoire pour prévenir le serveur MYSQL que la transaction des données ce fait en UTF8 ?
    Est-ce que cela te coute de le mettre ?
    Cela t'assure que la connexion se fait dans l'encodage que tu souhaites independemment de la configuration du serveur.

  7. #7
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 228
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 228
    Points : 8 487
    Points
    8 487
    Billets dans le blog
    17
    Par défaut
    // empty( ) n'est pas adapté pour tester si un champ a été rempli ou non
    Alors je met quoi ? ^^
    empty('0') => TRUE alors que la chaîne n'est pas vide http://fr.php.net/empty

    Amha mieux vaux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ( $tonChamp === '' ) { // Si rien n'a été saisi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ( $tonChamp !== '' ) { // Si qquechose a été saisi
    Ensuite :

    Citation:
    // Tu n'échappes pas toutes les valeurs envoyées à MySQL
    Ce qui veut dire ? (si c'est is_numeric, unitule de faire le test non , )
    Certes, mais il faudrait que tu aies 100% confiance en is_numeric( ) (en restant raisonnable).
    La sécurité est affaire de non-confiance

    si l'utilisateur passe autre chose que des chiffres, ca ne passera pas ;
    Si si ça passera car is_numeric( ) accepte les notations scientifique et hexadécimale, dixit la doc.

  8. #8
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Si si ça passera car is_numeric( ) accepte les notations scientifique et hexadécimale, dixit la doc.
    Ma table est en Tynint je risque logiquement rien.

  9. #9
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 228
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 228
    Points : 8 487
    Points
    8 487
    Billets dans le blog
    17
    Par défaut
    Tout dépend de ta définition du risque.

Discussions similaires

  1. [Dates] Le résultat de mon code est inexact
    Par bebas dans le forum Langage
    Réponses: 1
    Dernier message: 27/02/2007, 10h50
  2. Réponses: 1
    Dernier message: 08/02/2007, 09h11
  3. Pourquoi mon code est plus lent que Arrays.sort
    Par alexis779 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 12/12/2006, 12h44
  4. [Tableaux] Mon code est bon ?
    Par garaut dans le forum Langage
    Réponses: 8
    Dernier message: 14/11/2006, 15h47
  5. [Dates] calcul de date est ce que mon code est bon?
    Par carmen256 dans le forum Langage
    Réponses: 2
    Dernier message: 09/06/2006, 11h30

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