Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 11/06/2012, à 17:45

Wazisisgood

Question sécurité - php

Bien que "php c'est mal" j'aurai besoin de vous pour vérifier 2 - 3 trucs car cela ne doit  pas être parfait. Regardez plutôt :

<?php

// Connexion à la base de données
connectMaBase();
   mysql_query("SET NAMES 'utf8'");
    
  $auteur= $_POST['auteur'];
  $commentaire= $_POST['commentaire'];
  
    function securite_bda($auteur)
    {
        // On regarde si le type de string est un nombre entier (int)
        if(ctype_digit($auteur))
        {
            $auteur = intval($auteur);
        }
        // Pour tous les autres types
        else
        {
            $auteur = mysql_real_escape_string($auteur);
        }
        
        return $auteur;
    }
    
     function securite_bdc($commentaire)
    {
        // On regarde si le type de string est un nombre entier (int)
        if(ctype_digit($commentaire))
        {
            $commentaire = intval($commentaire);
        }
        // Pour tous les autres types
        else
        {
            $commentaire = mysql_real_escape_string($commentaire);
        }
        
        return $commentaire;
    }
    
        if(isset ($_POST['valider']) && !empty($_POST['auteur']) && !empty($_POST['commentaire'])){
            //On récupère les valeurs entrées par l'utilisateur :

            $auteur= securite_bda($auteur);
        $commentaire= securite_bdc($commentaire);
            $id_billet = $_POST['id_billet'];        

            //On construit la date d'aujourd'hui
            //strictement comme sql la construit
            $today = date('y-m-d');
                            
            //On prépare la commande sql d'insertion
$sql = 'INSERT INTO commentaires (id,id_billet,auteur,commentaire,date) VALUES("","'.$id_billet.'","'.$auteur.'","'.$commentaire.'","'.$today.'")';

            /*on lance la commande (mysql_query) et au cas où, 
            on rédige un petit message d'erreur si la requête ne passe pas (or die) 
            (Message qui intègrera les causes d'erreur sql)*/
            mysql_query ($sql) or die ('Erreur SQL !'.$sql.'<br />'.mysql_error()); 

            // on ferme la connexion
            mysql_close();
            header("Location: http://wazisisgood.free.fr/commentaires.php?billet=$id_billet");
    }
    else{
        echo 'veuillez remplir tout les champs - merci !';
    }

?>

Où id_billet est dans le formulaire d'un type="hidden" pour transmettre à ma page d'envoi quel commentaire est lié à quel billet.

Dernière modification par Wazisisgood (Le 11/06/2012, à 17:49)


When the power of love overcomes the love of power the world will know peace.-
http://wazisisgood.free.fr

Hors ligne

#2 Le 11/06/2012, à 18:53

Haleth

Re : Question sécurité - php

Ton code est mauvais, parcqu'il est mal écrit et pas fonctionnel

Retravaille le !


Ubuntu is an ancien African word which means "I can't configure Debian"

Because accessor & mutator are against encapsulation (one of OOP principles), good OOP-programmers do not use them. Obviously, procedural-devs do not. In fact, only ugly-devs are still using them.

Hors ligne

#3 Le 11/06/2012, à 18:58

Wazisisgood

Re : Question sécurité - php

Ba c'est qu'une partie et il marche très bien ? ( Pas d'erreurs en tous cas )

Sa demande tant de travail que ça au point qu'on puisse pas m'aider. Ralala j'pensais pas quand même. Le truc c'est que je vois pas comment je pourrai l'améliorer vu que pour moi il parait bon x)

Dernière modification par Wazisisgood (Le 11/06/2012, à 18:59)


When the power of love overcomes the love of power the world will know peace.-
http://wazisisgood.free.fr

Hors ligne

#4 Le 11/06/2012, à 20:10

Haleth

Re : Question sécurité - php

Bon
Au niveau de la forme:
il ne faut pas mettre des {} quand le bloc n'est pas un bloc, mais une ligne
Exemple:

if(cond){
   bla
   bla
}

if(cond)
   bla

Quant aux alinéas, y'a aussi un problème

Au niveau fonctionnel, j'vais juste de faire réagir sur un point: il se passe quoi si tu doit, non plus utilisé Mysql, mais Sqlite ? ou Psql ?
Il se passe quoi si une fonctionne que tu utilises, genre mysql_real_escape_string, devient deprecated ?

Quand je dit que ton code n'est pas fonctionnel, c'est dans le sens fonction, pas fonctionnalité
Il marche surement, mais il n'est absolument pas extensible etc etc


Ubuntu is an ancien African word which means "I can't configure Debian"

Because accessor & mutator are against encapsulation (one of OOP principles), good OOP-programmers do not use them. Obviously, procedural-devs do not. In fact, only ugly-devs are still using them.

Hors ligne

#5 Le 11/06/2012, à 20:14

pires57

Re : Question sécurité - php

oui et non, le fait de mettre les accolades ouvrantes et fermantes ne constitue pas une faute en soit même par contre une utilisation de PDO serais bien plus judicieuse niveau sécurité.


Utilisateur d'Archlinux, Ubuntu et Kali Linux
Administrateur système et réseau spécialisé Linux.
LinkedIn

Hors ligne

#6 Le 11/06/2012, à 21:56

Wazisisgood

Re : Question sécurité - php

Ben le problème c'est que chez free ils en sont à php4. Donc pas de PDO hmm

Et je sais pas pour Sqlite et le reste.. sûrement que ça marche pas si tu me le dis.
Mais bon.
J'me rend au moins compte que je suis vraiment débutant même si j'étais content d'avoir réussi à faire ce que je voulais faire à l'origine. Mais après c'est peut être pas mon but que ça soit extensible ? Je peux me contenter de ça tant que y'a asser de sécurité.

Et si j'enlève tout ce qui est 'function securit..' et que je met qqchose du style :

$auteur = mysql_real_escape_string($_POST['auteur']);
$commentaire = mysql_real_escape_string($_POST['commentaire']);

et les conditions, ça suffit pas ?

Et avec ça pour l'affichage :

<?php echo htmlentities($donnees['commentaire']); ?>

When the power of love overcomes the love of power the world will know peace.-
http://wazisisgood.free.fr

Hors ligne

#7 Le 11/06/2012, à 22:04

slasher-fun

Re : Question sécurité - php

Wazisisgood a écrit :

Ben le problème c'est que chez free ils en sont à php4.

http://www.emarketeur.fr/gestion-de-pro … les-autres

Hors ligne

#8 Le 12/06/2012, à 09:37

Mathieu147

Re : Question sécurité - php

Tes fonctions securite_bda() et securite_bdc() pourraient être améliorées, déjà d'un point de vue mise en page:

function securite_bda($auteur) {
  if(ctype_digit($auteur))
    $auteur = intval($auteur);
  else
    $auteur = mysql_real_escape_string($auteur);
  return $auteur;
}

mais aussi changer leur nom, parce que je suppose que bda et bdc ça veut dire «base de données auteur» et «base de données commentaires»? Et tu devrais aussi en faire une seule parce que là, tu as exactement la même fonction deux fois, avec un nom différent.

Ensuite, si la chaîne $auteur est constituée uniquement de chiffres, tu la transforme en entier. Après, tu l'intègres dans ta commande SQL où elle est retransformée en chaîne de caractère, ce qui fait des opérations pour rien. Donc en fait des deux fonctions pourraient carrément partir.

Ta fermeture de connexion doit être sortie du if, parce que tu dois fermer la connexion dans tous les cas, pas seulement si ton formulaire a été bien rempli.

Tu n'as pas besoin de demander à PHP de te calculer la date du jour, tu peux utiliser la fonction NOW() dans ta requête SQL, ça sera plus efficace.

Dans une chaîne de caractères en PHP avec les guillemets doubles, tu peux inclure des variables facilement:

$variable = 'prout';
$chaine1 = "Ma variable est $variable et est très facile à utiliser";
$chaine2 = 'Ma variable est '.$variable.' et est moins pratique à utiliser';

Ton code pourrait donc devenir ceci :

<?php
    connectMaBase();
    mysql_query("SET NAMES 'utf8'");
    $auteur      = mysql_real_escape_string($_POST['auteur']);
    $commentaire = mysql_real_escape_string($_POST['commentaire']);
    $id_billet   = mysql_real_escape_string($_POST['id_billet']);

    if(isset ($_POST['valider']) && !empty($_POST['auteur']) && !empty($_POST['commentaire'])) {
        $sql = "INSERT INTO commentaires (id, id_billet, auteur, commentaire, date) VALUES($id_billet, $auteur, $commentaire, NOW())";
        mysql_query ($sql) or die ('Erreur SQL !'.$sql.'<br />'.mysql_error()); 
        header("Location: http://wazisisgood.free.fr/commentaires.php?billet=$id_billet");
    } else
        echo 'veuillez remplir tout les champs - merci !';
    mysql_close();
?>

Tu passes de 59 lignes à 14 (sans compter les vides), j'ai même pu enlever les commentaires, ils deviennent inutiles tellement le code est simple.

Ça peut paraître un détail, mais fais attention à tes indentations et tes alignements, ça augmente la lisibilité.


Pffff…

Hors ligne

#9 Le 12/06/2012, à 13:46

Haleth

Re : Question sécurité - php

Une question: quand tu fait un header location, le code qui est ensuite est exec, ou pas ?
Dans l'un des cas, ta connexion n'est pas fermé


Ubuntu is an ancien African word which means "I can't configure Debian"

Because accessor & mutator are against encapsulation (one of OOP principles), good OOP-programmers do not use them. Obviously, procedural-devs do not. In fact, only ugly-devs are still using them.

Hors ligne

#10 Le 12/06/2012, à 14:48

Mathieu147

Re : Question sécurité - php

Haleth a écrit :

Une question: quand tu fait un header location, le code qui est ensuite est exec, ou pas ?

Oui. D'ailleurs la fonction header() doit impérativement être appelée avant tout output, ce qui est parfois chiant.


Pffff…

Hors ligne

#11 Le 12/06/2012, à 16:33

Wazisisgood

Re : Question sécurité - php

Déjà merci beaucoup de cette réponse plus que complète Mathieu147.

Et oui j'ai eu beaucoup de problème par rapport à ce 'header'. J'ai du me résoudre à utiliser les :

<?php ob_start(); ?>
.
.
<?php ob_end_flush(); ?>

Sinon rien aller et je ne trouvai aucune autre solution. Je pense bien que ça doit être barbare.

Et aussi merci pour le liens php4 -> 5. Je vais regarder ça et commencé à apprendre la PDO alors. Si c'est bien plus pratique, et bien plus sécuritaire.

Haleth a écrit :

Une question: quand tu fait un header location, le code qui est ensuite est exec, ou pas ?
Dans l'un des cas, ta connexion n'est pas fermé

Hum..c'est quoi exec ? Et le problème viendrais en fait que je n'avais pas fermé au bon moment ma connection ?

Car moi 'header' m'en suis servis car je voulais qu'une fois les données transmisent à la BDD le visiteur sois redirigé sur la page où il avais écris son commentaire, donc voilà.

Dernière modification par Wazisisgood (Le 12/06/2012, à 16:37)


When the power of love overcomes the love of power the world will know peace.-
http://wazisisgood.free.fr

Hors ligne

#12 Le 12/06/2012, à 17:46

Haleth

Re : Question sécurité - php

exec = executer

C'était en rapport avec le code de Mat, mais il a expliqué donc ok


Ubuntu is an ancien African word which means "I can't configure Debian"

Because accessor & mutator are against encapsulation (one of OOP principles), good OOP-programmers do not use them. Obviously, procedural-devs do not. In fact, only ugly-devs are still using them.

Hors ligne

#13 Le 12/06/2012, à 21:18

Wazisisgood

Re : Question sécurité - php

A ouai.. j'sais même pas pourquoi j'avais pas compris.

Enfin je vous montre pas mes autres pages ça doit être encore plus désatrophique x)
Mais je vais essayer de m'inspirer de ce petit exemple de style !

Donc merci à vous.


When the power of love overcomes the love of power the world will know peace.-
http://wazisisgood.free.fr

Hors ligne