|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Inscrit
Inscription : juin 2006 Messages : 531 ![]() |
Bonjour,
Je dois sécuriser un formulaire. Pour certains champs je sais le type de données attendues, donc c'est très bien j'utilise les expregs. Mais pour le textarea, je ne sais pas ce que l'on peut m'envoyer et je ne peux pas interdire de caractères. Donc comment le filtrer au mieux ? Je peux faire ça : Code :
htmlentities(mysql_real_escape_string($textarea)) Merci de votre aide |
|
|
00
|
|
|
#2 |
|
Membre du Club
![]() Inscription : janvier 2006 Messages : 79 ![]() |
Salut,
tu veux le sécuriser contre quoi (certains mots,...) ? |
|
|
00
|
|
|
#3 |
|
Inscrit
Inscription : juin 2006 Messages : 531 ![]() |
Non contre les attaques xss, injections sql et autres joyeusetés. Les mots doivent rester libres et je ne peux pas bloquer les caractères spéciaux.
|
|
|
00
|
|
|
#4 |
|
Membre Expert
![]() ![]() Inscription : janvier 2004 Messages : 1 238 ![]() |
alors...
si tu veux faire un bon filtrage : 1) * Verifier en php le reglage des magicquotes (avec get_magic_quotes_gpc()) * Si activé alors stripslashes sur la variable => Tu obtiens dorenavant un champ qui correspond exactement a ce que l'utilisateur a tapé !! Ensuite, le traitement a faire depend de l'utilisation : 2) * pour inserer dans une base de données : mysql_real_escape_string * pour afficher sous forme de texte : htmlentities * pour afficher dans un value de formulaire ou un autre attribut d'une balise html : addslashes Ensuite, ton traitement est sécurisé... a condition que : * dans toutes les requetes qui travaillent sur le champs utilisé pour stocker l'info tu utilise des quotes autour du champs : SELECT ... champ = '$champ', etc... * chaque fois que tu récupere l'info depuis la base, tu dois refaire le traitement en fonction de l'utilisation a partir du point 2 Dans la pratique, je te conseille de tester TOUT tes champs avec le crash test suivant : si cette chaine se réaffiche exactement telle qu'elle a été tapée partout sans faire aucune erreur, il y a de grande chance que ton code soit a peu pres correct ;o) (et quand je dis exactement, c'est exactement ! pas de \ en trop, pas de \ en moins, pas de "a" en gras ou de retour chariot interprété avec <br>, et les tests sont a faire en affichage, creation, modification et suppression de ton objet) Je crois que j'ai fait le tour, j'ai oublié qqchose ? ;o))
__________________
PHP : Regle n°1 : mysql_query(...), mysql_connect(...) et mysq_select_db(...) doivent EN DEBUG etre suivies de or die(mysql_error()); (mais jamais en production) Regle n°2 : Mieux encore : mysql_query($requete) or die("$requete<br/>".mysql_error()); Regle n°3 : echo '<pre>';var_dump($var);echo '</pre>'; affiche le contenu et le type d'une variable. Publiez vos textes de fantasy et de science-fiction sur http://www.cercledefaeries.com/concours/ |
|
|
00
|
|
|
#5 | ||
|
Inscrit
Inscription : juin 2006 Messages : 531 ![]() |
salut Fladnag, merci pour cette réponse complète.
Alors une question déjà : Citation:
ça revient au même, qu'est ce que t'en pense ? Et au fait, pourquoi les quotes sont un support contre les injections sql ? Sur un autre post, j'ai lu cette phrase : Citation:
|
||
|
|
00
|
|
|
#6 | |||
|
Membre Expert
![]() ![]() Inscription : janvier 2004 Messages : 1 238 ![]() |
Citation:
Code :
ta requete va construire : donc imaginons une requete : Code :
SELECT * FROM membres WHERE login=$login AND password=$password la requete devient : Code :
SELECT * FROM membres WHERE login=admin-- AND password=
Si tu met des quotes, tu obtient comme requete : Code :
SELECT * FROM membres WHERE login='admin--' AND password='' Ce n'est qu'un exemple de ce qui est possible. Si le sujet t'interesse, je te conseille de lire les articles sur l'injection sql disponible sur ce site : http://www.phpsecure.info/v2/zone/pArticle ce n'est pas un panel exhaustif de ce qui est possible, mais c'est une tres bonne introduction, et ca permet en principe de se rendre compte de la fragilité d'un script php mal codé ;o)
__________________
PHP : Regle n°1 : mysql_query(...), mysql_connect(...) et mysq_select_db(...) doivent EN DEBUG etre suivies de or die(mysql_error()); (mais jamais en production) Regle n°2 : Mieux encore : mysql_query($requete) or die("$requete<br/>".mysql_error()); Regle n°3 : echo '<pre>';var_dump($var);echo '</pre>'; affiche le contenu et le type d'une variable. Publiez vos textes de fantasy et de science-fiction sur http://www.cercledefaeries.com/concours/ |
|||
|
|
00
|
|
|
#7 |
|
Inscrit
Inscription : juin 2006 Messages : 531 ![]() |
Je vais voir ton lien, merci pour tes explications.
J'ai revérifié mon code, mes requêtes sont comme ça : Code :
$requete="SELECT descriptionFROM complements WHERE id = '".$id."' "; Aussi j'en ai une comme ça, et là je n'arrive pas à la placer entre '".."' : Code :
"SELECT libelle FROM definitions WHERE mot like '$lettre%' ";
En plus $lettre peut contenir des lettres ou le signe - donc au vu de ton exemple même une expreg, qui n'autorise que des lettres et le trait d'union, ne servirait à rien. |
|
|
00
|
|
|
#8 |
![]() ![]() Guillaume RossoliniDirecteur technique Inscription : février 2004 Messages : 13 720 ![]() |
@Fladnag : addslashes() n'est jamais utile car si tu envoies tes données dans une page HTML, alors il est préférable d'utiliser htmlentities() avec son deuxième paramètre ENT_QUOTES.
[Edit] Au passage : http://securite.developpez.com/faq/?..._sql_injection
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework) Ressources PHP - Ressources Zend Framework |
|
|
00
|
|
|
#9 | ||||
|
Inscrit
Inscription : juin 2006 Messages : 531 ![]() |
Bon dans le même genre parce que je ne vais pas ouvrir un sujet que pour ça, j'ai le problème ci-dessous :
Requête : Code :
Par contre : Code :
Donc pourquoi ça rate pour les deux autres (à tout hasard je précise que $debut et $fin sont des chiffres entier). |
||||
|
|
00
|
|
|
#10 |
|
Membre chevronné
![]() Inscription : mars 2005 Messages : 583 ![]() |
hello,
lorsque tu utilises des entiers dans tes requetes, les apostrophes sont inutiles (voir meme déconseillées, si quelqu'un peut confirmer ?) dans la clause LIMIT en l'occurence, elles font meme planter la requete. |
|
|
00
|
|
|
#11 |
|
Inscrit
Inscription : juin 2006 Messages : 531 ![]() |
Oui mais pourtant j'ai une autre requête où j'utilise un entier et ça ne foire pas en le placant comme suit :'".$entier."'
Dans mon exemple au dessus, ça ne viendrait pas de la clause LIMIT ? |
|
|
00
|
|
|
#12 |
![]() ![]() Guillaume RossoliniDirecteur technique Inscription : février 2004 Messages : 13 720 ![]() |
Petibidon vient de te dire que c'est le cas, en effet.
@Petibidon : Tout dépend... Si tu sais que tu protègeras toujours tes valeurs entières, alors il est préférable de ne pas mettre de quotes puisque cela permet au SGBD de traiter correctement le type de la donnée. Sinon, peut-être que les quotes sont un moindre mal (mais pas une solution).
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework) Ressources PHP - Ressources Zend Framework |
|
|
00
|
|
|
#13 | |||
|
Inscrit
Inscription : juin 2006 Messages : 531 ![]() |
Citation:
Bon dans la série des questions crétines, puisque ça semble être le jour, en voilà encore une : A réception des données de l'url je fais ça pour tester le masque : Code :
Code :
$definition=mysql_real_escape_string(htmlentities($definition)) |
|||
|
|
00
|
|
|
#14 |
![]() ![]() Guillaume RossoliniDirecteur technique Inscription : février 2004 Messages : 13 720 ![]() |
Peut-être suis-je également fatigué mais il me semble t'avoir déjà dit (et je ne suis pas le seul) que ces deux fonctions n'ont pas la même utilité. Il ne faut pas les utiliser conjointement car c'est une erreur de logique.
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework) Ressources PHP - Ressources Zend Framework |
|
|
00
|
|
|
#15 |
|
Inscrit
Inscription : juin 2006 Messages : 531 ![]() |
Bah la question portait pas sur ça, mais bon c'était une fausse question de toute façon. Je voulais savoir si le pirate pouvait modifier une variable en cours de scripts.
On va marquer résolu... Merci à tous |
|
|
00
|
|
|
#16 |
![]() ![]() Guillaume RossoliniDirecteur technique Inscription : février 2004 Messages : 13 720 ![]() |
En cours de script ? Bien sûr que non : chaque action de l'utilisateur déclenche une exécution de script mais l'utilisateur ne peut pas intervenir pendant ce procesus.
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework) Ressources PHP - Ressources Zend Framework |
|
|
00
|
|
|
#17 |
|
Inscrit
Inscription : juin 2006 Messages : 531 ![]() |
Donc je filtre une fois à réception de la variable $_GET['var'], et c'est bon pour toutes les requêtes de la page y compris celles situées dans des fichiers requires.
|
|
|
00
|
|
|
#18 |
![]() ![]() Guillaume RossoliniDirecteur technique Inscription : février 2004 Messages : 13 720 ![]() |
S'il s'agit d'une valeur numérique, il suffit de filtrer une fois au départ pour pouvoir utiliser la variable dans les requêtes et pour l'envoyer dans le HTML.
S'il s'agit d'une variable texte, il faut la filtrer pour chaque utilisation, avec la fonction qui va bien.
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework) Ressources PHP - Ressources Zend Framework |
|
|
00
|
|
|
#19 | ||||
|
Inscrit
Inscription : juin 2006 Messages : 531 ![]() |
Ton article sera le bienvenue Yogui, merci d'avance pour celui-ci.
Citation:
Citation:
Dans mon cas je reçois deux types de variables par l'URL, une numérique et une texte + tiret ou texte seul (exemple : "mot-nouveau" ou "mot" avec que des lettres dans les deux cas). J'ai donc ces deux preg_match pour vérifier le masque : Code :
Donc si je suis ce que tu dis dans ta dernière réponse, le gars pourrait trafiquer en cours de page $definition mais ne pourrait le faire avec $chiffre ? ![]() **edit** le coup du intval($chiffre) après avoir vérifié par expreg que l'on a des chiffres est un peu inutile... mais là je suis pas encore sur ça, c'est pas comme ça dans mon script. Et si on a qu'une lettre, est-ce tout de même du texte et qu'est-ce que ça change par rapport à la question qui nous préoccupe à savoir la modification des données en cours de page selon que la variable est numérique ou que sa valeur est un texte ? |
||||
|
|
00
|
|
|
#20 | ||
![]() ![]() Guillaume RossoliniDirecteur technique Inscription : février 2004 Messages : 13 720 ![]() |
Il faut bien voir que l'utilisateur fait simplement une demande de page Web identifée par une URI et contenant éventuellement des données en GET, POST et/ou COOKIE. Au-delà, l'utilisateur ne peut pas faire grand chose à part attendre la réponse du serveur.
Durant toute l'exécution du script, ton internaute n'a absolument aucun contrôle sur ce qu'il se passe. Du coup, à mon sens, il ne peut pas agir "au milieu" de l'exécution. De mon point de vue, toutes les variables soumises par l'utilisateur doivent être filtrées une première fois au départ du script puis, selon le cas, lors de leur utilisation. Chris Shiflett recommande l'utilisation de tableaux : Code :
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework) Ressources PHP - Ressources Zend Framework |
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com