[RESOLU][PHP, MySQL et valeur par defaut]

Bonjour,

je debute en php et j’aurais besoin d’un petit conseil:

J’ai un formulaire avec des textes et quelques checkbox que je souhaiterais enregistrer dans une table MySQL via un INSERT INTO
Je recupere donc les valeurs du post dans les variables d’une fonction php qui execute ensuite la requete. jusque là pas de soucis.

Dans ma table, j’ai fixé les champs relatifs aux checkbox en ENUM’oui’,‘non’ avec une valeur par defaut.

Lorsque les checkbox ne sont pas cochés, ils ne transmettent pas de valeur donc dans la fonction php j’obtiens entre autre:

Mon probleme est le suivant:

D’apres ce que j’ai pu constater, il semble que la requete ne considere pas cette valeur comme une absence de valeur mais bel et bien comme un “rien” bien consistant. Je me retrouve donc avec un champ qui possede une valeur vide et pas la valeur fixée par defaut.

J’ai pensé à deux solutions:
-Soit je controles les variables du post pour savoir si mes checkbox renvois quelque chose et je creer une requete “dynamiquement”, ce qui me semble un peu lourd surtout si je multiplie les formulaires…
-Soit je nie l’affaire et je considere les champs vide de ma table comme des checkbox “non checkés” et dans ce cas là les ENUM et les defaut ne servent à rien…

Comment vous faites vous?

Je controle systématiquement les variables du post et je reconstruit la requete dynamiquement. D’une part tu a un niveau de sécurité sans faille et tu ne risque aucune injection à la con, d’autre part cela te donne un plus grand control sur ta requete justement.

Bonjour Bishop,

C’est vrai, en plus une requete dynamique c’est plus classe…mais en ce qui concerne les checkbox, je ne peux m’empecher de me faire le reflexion suivante B) :

  • Etant donné qu’un checkbox standart ne peux pas transmettre autre chose qu’un choix definit par le programmeur ou un « rien »
  • Etant donné qu’un test sur les checkbox donnerait 2^(nombre de checkbox) variations sur la requete d’ajout.
  • Etant donné qu’un codeur est sensé être une feignasse et limiter son code au maxi (ce qui limite aussi le risque d’erreurs)

Cela ne te parait pas un peu parano de controler aussi les checkbox? Connaitrais-tu un cas où un checkbox pourrait representer un danger pour la stabilité du site?

Quoi qu’il en soit, merci infiniment pour tes conseils.

a+

[quote=“Boolean, post:3, topic: 33788”]Bonjour Bishop,
C’est vrai, en plus une requete dynamique c’est plus classe…mais en ce qui concerne les checkbox, je ne peux m’empecher de me faire le reflexion suivante B) :

  • Etant donné qu’un checkbox standart ne peux pas transmettre autre chose qu’un choix definit par le programmeur ou un “rien”
  • Etant donné qu’un test sur les checkbox donnerait 2^(nombre de checkbox) variations sur la requete d’ajout.
  • Etant donné qu’un codeur est sensé être une feignasse et limiter son code au maxi (ce qui limite aussi le risque d’erreurs)

Cela ne te parait pas un peu parano de controler aussi les checkbox? Connaitrais-tu un cas où un checkbox pourrait representer un danger pour la stabilité du site?

Quoi qu’il en soit, merci infiniment pour tes conseils.

a+[/quote]

N’oublie pas qu’une personne mal intentionnée peux tout a fait envoyer les parametres à la main, et pas du tout ceux prévus à l’origine.

Tu peux toujours creer des fonctions pour verifier les données postées, par exemple (bon c’est un peu bourrin) mais dire que chaque checkbox commence par ch-, donc dans ta fonction, tu prends le tableau de POST en argument (ou pas en fait puisqu’il est super global), puis tu teste chaque ch-* pour voir s’il a bien une valeur conforme.

Mon dieu que le monde est cruel !!

Bon, ce truc ne m’a l’air applicable que dans des conditions specifiques (droits sur le drop, etc) mais ça donne quand même froid dans le dos.

Je m’en vais de ce pas blinder mes checkbox…merci à vous deux.

[quote=“Boolean, post:6, topic: 33788”]Mon dieu que le monde est cruel !!

Bon, ce truc ne m’a l’air applicable que dans des conditions specifiques (droits sur le drop, etc) mais ça donne quand même froid dans le dos.

Je m’en vais de ce pas blinder mes checkbox…merci à vous deux.[/quote]

Oui hein, et quand on sait que c’est souvent les gens les plus intelligents qui trouvent ce genre de chose à l’origine. Enfin bref, en plus de ces SQL Injections, j’en profite pour attirer ton attention sur les Cross Scripting, qui utilisent toutes les deux la manipulation d’urls.

Comme le dis très bien CCM sur une de ces pages, pour faire sécurisé, tout ce qui provient de l’utilisateur doit être considéré comme non fiable. Bienvenue dans le monde des parano

[quote=“bishop, post:7, topic: 33788”]j’en profite pour attirer ton attention sur les Cross Scripting, qui utilisent toutes les deux la manipulation d’urls.

Comme le dis très bien CCM sur une de ces pages, pour faire sécurisé, tout ce qui provient de l’utilisateur doit être considéré comme non fiable. Bienvenue dans le monde des parano[/quote]

Euh…, t’est sûr que c’est pas toi qui est en train de pourrir mon site ? B)
On pourrait presque être nostalgique des bonnes vieilles pages statiques; En tout cas, il va serieusement falloir que je revois mon agenda.

Non, je plaisante, ces liens sont super instructifs, vais potasser tout ça. Merci encore.

is_empty() != isset()

Je te laisse regarder la doc de php pour comprendre B)

je profite du poste d’azera pour introduire ma ptite méthode (fin, celle que j’utilise quoi, je me revendique pas comme étant son géniteur)

function plouf($argument = false) { // Si l'argument est pas "false", donc s'il y a un argument, on rentre. if($argument) echo htmlspecialchars($argument); else echo 'Pas d\'argument.'; }

Moi, j’en étais arrivé à quelque chose du genre:

[code]<?php

//RECUPERE LES VALEURS DU GET
$var1=$_GET[‘valeur1’];
$var2=$_GET[‘valeur2’];
$check=$_GET[‘checkbox1’],

//CONTROLE DES $var

//CONTROLE DU CHECKBOX
if($check==“oui”)
{
$sup1=",Nom_Du_Champ_Checkbox";
$sup2=",’".$check."’";
}

//CREATION DE LA REQUETE
$sql=“INSERT INTO tb_test (champ1, champ2”.$sup1.") VALUES (’$var1’,’$var2’".$sup2.");";

//EXECUTION DE LA REQUETE

?>[/code]

Mais ça fait un peu bricolo…vais voir ce qu’ implique vos propositions.

Merci.

EDIT=syntaxe code