Petit pb de code...
Auteur Sujet

Post 
Bonjour,

Je développe un petit module pour mon site (pn 0764) et je rencontre un bête problème de requète Mysql :

J'ai une liste d'images à afficher selon des critères définis par un bouton select. Ma requète est du genre :
  1. $requete="select * from koi where couleur='rouge'"; 
ou koi est une table et couleur un champs "varchar(50)".

Losque cette requete est écrite en dur dans le code, tout va bien, les images souhaitées s'affichent.

Maintenant, lorsque je remplace par :

  1. $requete="select * from koi where couleur='$couleur'"; 


ma variable venant du select :
  1. echo'<select name="couleur" > 
  2. <option value="orange">orange</option> 
  3. <option value="rouge">rouge</option> 
  4.   </select> 



Tout va bien également, les images souhaitées s'affichent aussi (patience, j'y arrive... icon_wink )

Là où ça se complique pour moi, c'est que souhaitant avoir plusieurs critères et donc plusieurs variables, j'ai imaginé affecter au sélection des valeurs plus complexes :

  1. $requete="select * from koi where $couleur"; 


ou ma variable prend la valeur :
  1. <option value="couleur=\'rouge\'">rouge</option> 


Lorsque je valide le formulaire, aucune image ne s'affiche, et pourtant, si j'affiche ma requete sur ma page, j'obtiens bien :

select * from koi where couleur='rouge'

Pourquoi cette requète ne fonctionne pas alors qu'à priori, la syntaxe est exactement la même que la requète "en dur" ?

Voilà, j'espère avoir été clair. Je vous remercie d'avance de votre aide, vous l'aurez compris, je ne suis pas un pro du code...


Eric, le webmaster aquatique
Données personnelles

Post 
Il faut que tu obtiennes ça
  1. <option value="couleur=\'rouge\'">rouge</option> 

ou ça :
  1. <option value="rouge">rouge</option> 


La 1ere ligne de code pour moi parraitrait abérante (syntaxiquement parlant), mais bon je ne suis pas un dieu aussi niveau code ^^ ...
Données personnelles Accueil

Post 
miko09 a écrit :
Il faut que tu obtiennes ça
  1. <option value="couleur=\'rouge\'">rouge</option> 

ou ça :
  1. <option value="rouge">rouge</option> 


La 1ere ligne de code pour moi parraitrait abérante (syntaxiquement parlant), mais bon je ne suis pas un dieu aussi niveau code ^^ ...


La deuxième est la bonne... la première fait peur... icon_lol

Dans tous les cas, jeter un oeil sur le module Example:

Les valeurs where devraient toujours passer comme ceci:

  1. .... WHERE couleur = '".pnVarPrepForStore($couleur)."'"; 


Et à l'affichage, j'ai l'impression que ce n'est pas par un template et donc, faudrait d'autant plus faire:

  1. echo '<option value="'.pnVarPrepForDisplay($couleur).'">'.pnVarPrepForDisplay($couleur).'</option>'; 


Plus la peine quand on utilise un template car il me semble que la variable est vérifiée lors de son assignation:

  1. $pnRender->Assign('couleur', $couleur); 

  1. <option value="<!--[$couleur]-->"><!--[$couleur]--></option> 

sinon
  1. <option value="<!--[$couleur|pnvarprepfordisplay]-->"><!--[$couleur|pnvarprepfordisplay]--></option> 


Bonne chance icon_wink

(en passant, quelqu'un dans les parages a son email qui déconne... à vérifier svp, merci.)


Chestnut !
Administrateur
Aucun Support par message privé...
Même en cas de pensée suicidaire !
Règles à suivre
Données personnelles Accueil

Post 
En fait, c'était bien la 2ème syntaxe que je recherchais afin de renvoyer directement par le bouton select un bout de ma requète et non pas juste la valeur d'une variable. C'était certes un peu bizare, mais bon...

Depuis j'ai changé de stratégie pour revenir à quelque chose de plus classique.

Merci de m'avoir répondu.

Quand à la syntaxe :
  1. .... WHERE couleur = '".pnVarPrepForStore($couleur)."'";  


J'avoue ne pas l'utiliser (en fait, je ne la connaissait même pas... icon_eek ) car j'écris un petit module en php qui va venir s'insérer dans mon pn mais sans s'intégrer parfaitement à l'ensemble du site (désolé...).

A priori, il fonctionne maintenant.

Encore merci icon_wink

Eric, le webmaster aquatique
Données personnelles

Post 
icon_lol Je mettais pas tromper alors ! icon_lol Je suis pas le seul à avoir pris peur icon_razz
Bonne chance Eric :)
Aparement tu as trouvé une meilleur solution ! icon_smile
Données personnelles Accueil

Post 
petit passage rapide aussi...
attention aussi dans le cas de ce formulaire de protéger contre les injections sql... je ferai un petit topo pour compléter quand je pourrais mais vous pouvez déjà vous documenter là dessus !

++


Gilles  ><>°
Données personnelles Accueil

Post 
Pour revenir à l'injection SQL, le risque de tout site est qu'un pirate vienne (ne dites pas qu'il y en a pas sur votre site, ils sont de partout) et dans un formulaire envoie à la suite d'une commande d'autre informations.
Imagine que tu envoie à ton fomulaire
  1. <select name="couleur"><option value="couleur=\'red\'">rouge</option></select> 

le formulaire va donner index.php...&select=couleur%xx%yyred%yy ou les %xx et %yy sont l'encodage d'url
dans l'appel, il n'y aurait pas de vérification celà donnerai
  1. $sql="SELECT * FROM tt WHERE $couleur" 


Le hackeur n'aurai qu'a rajouter à l'url le code à insérer:
index.php...&select=couleur%xx%yyred%yy;DELETE*FROM tt

et le vidage de la table se ferait comme par magie...

Tout ca pour vous dire de vien vérifier que les paramètres insérés sont validés et protégés !

++


Gilles  ><>°
Données personnelles Accueil

Post 
On parle beaucoup de l'SQL Injection mais on explique rarement comment l'éviter c'est bien dommage...

Je ne protège jamais mes select, etc. je ne faisais attention qu'aux variables que j'enregistrais dans ma bdd, mais en effet il suffirait d'ajouter un ";DELETE * FROM table" dans l'url derrière la variable passée en get pour le select afin de vider la table. icon_eek Que faudrait-il appliquer à la variable alors avant de l'utiliser pour un select ?

Voici ce que je fais lorsque j'enregistre une donné dans sql pour la protéger :
  1. f(get_magic_quotes_gpc()) { 
  2.       $titrelinkval = stripslashes($_POST['titrelinkval']); 
  3.     } else { 
  4.       $titrelinkval = $_POST['titrelinkval']; 
  5.     } 
  6.     $titrelinkval=mysql_real_escape_string(htmlentities($titrelinkval, ENT_QUOTES)); 


Je test si magic_quotes_gpc est actif ou non et j'applique mysql_real_escape_string à la variable. Petit plus, je traduis les caractères en html.

-------------------------------------------
...n'oubliez pas que l'outil Recherche est votre ami !
...bien souvent il répond à nos questions avant même que l'on ne se les pose ! ^^
Données personnelles Accueil

Post 
Tout ça est déjà vérifier ou étudié par les fonctions fourni par l'API PostNuke:

pnVarCleanFromInput (pour les variables passées par un formulaire ou l'url)
et
pnVarPrepForStore (lors de l'enregistrement dans la base)...

et d'autres encore.

C'est pourquoi il est obligatoire (je dis obligatoire car si on n'utilise pas ces fonctions, vous vous mettez à risque), de TOUJOURS récupérer les valeurs d'un formulaire ou de l'url via:

  1. $valeur = pnVarCleanFromInput('valeur'); 


Et lors de l'enregistrement dans une table:

  1. ... valeur = '".pnVarPrepForStore($valeur)."' ... 


Si on sait que la valeur doit être un entier, une petite assurance:

  1. ... valeur = '".(int)pnVarPrepForStore($valeur)."' ... 


etc...
icon_wink


Chestnut !
Administrateur
Aucun Support par message privé...
Même en cas de pensée suicidaire !
Règles à suivre
Données personnelles Accueil

Post 
Merci pour ces judicieux conseils, mais j'ai besoin d'aide pour les mettre en oeuvre...

Dans mon code , je recupère toutes mes variables avec ceci :
  1. if (isset($_REQUEST["couleur"])) $couleur = htmlentities($_REQUEST["couleur"],ENT_QUOTES); 


couleur étant le nom de mon bouton select et également le nom d'un champ de ma table.

Est-ce à la place de cette ligne que je dois mettre :

  1. $couleur = pnVarCleanFromInput('couleur');  
?

J'utilise la syntaxe précédente notamment du fait que j'utilise du texte avec des caractères spéciaux (accents, apostrophes, etc...) et qu'ils sont codés dans ma base.
.
Est-ce que cette nouvelle syntaxe va également se charger de ce pb ?

Merci d'avance icon_wink

Eric, le webmaster aquatique
Données personnelles
Post 
Oui, je pense que ca doit être bon... mais ... a tester !!

++


Gilles  ><>°
Données personnelles Accueil