|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Membre du Club
![]() kiddy asp Inscription : avril 2010 Messages : 180 ![]() |
Bonjour,
![]() J'ai un formulaire en PHP... Je vais le sécuriser maximum. ![]() Pour empêcher les injections de code malicieux, j'utilise htmlspecialchars : ainsi, les informations remplies dans les champs par les utilisateurs qui contiennent de balises HTML seront sans code HTML actif. Est-ce que c'est suffisant ? Sinon que je dois faire d'autres ? Merci et bonne journée Bonne année |
|
|
00
|
|
|
#2 |
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 991 ![]() |
Sécurise les insertions en base avec htmlspecialchar ou strip_tags et mysql_real_escape_string ou les requêtes préparées.
Sécurise la récupération d'informations avec les filtres http://php.net/manual/fr/book.filter.php Sécurise la sortie d'information avec les filtres également.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
|
10
|
|
|
#3 |
|
Membre expérimenté
![]() |
|
|
10
|
|
|
#4 |
|
Expert Confirmé
![]() Inscription : janvier 2010 Messages : 2 728 ![]() |
Salut
Tout dépend du degré que tu souhaite obtenir, mais comme tu parles de "maximum", ne pas oublier le SSL (https). Faire en sorte de générer un contenu HTML sécurisé c'est une chose, mais sans SSL les données transiteront "en clairs", donc elles peuvent toujours être interceptées voire modifiées en cours de route.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20 Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra] |
|
|
10
|
|
|
#5 |
|
Expert Confirmé
![]() Olivier Développeur Web Inscription : août 2003 Messages : 1 837 ![]() |
Je pense que c'est plus une question de philosophie mais je suis plus pour échapper les données à l'affichage et pas à l'insertion.
A l'insertion je filtre et protège des injections. C'est un peu plus gourmand en ressource car on échappe les données pour chaque utilisateur au lieu de le faire une fois à l'insertion, mais du coup c'est une protection "active" qui va échapper même des données ne venant pas de la bdd. Certain moteur de template ont d'ailleurs par défaut un échappement des données activé. Il faut également te protéger de ce que l'on appelle les failles CSRF (cross site request forgery ) qui consiste à venir attaquer une partie du site (un formualire dans ton cas) avec un autre site. Voici : http://fr.wikipedia.org/wiki/Cross-site_request_forgery pour plus de détail |
|
10
|
|
|
#6 | |||||||
|
Membre du Club
![]() kiddy asp Inscription : avril 2010 Messages : 180 ![]() |
Bonjour Benjamin Delespierre, amoiraud, RunCodePhp et grunk,
Je vais appliquer vos conseils étape par étape dans un formulaire fictif... Alors, voici la 1re serrure (1re étape) avec htmlspecialchars : Citation:
Code :
Code :
alors avec le code ci-dessus, j'obtiens l'enregistrement dans mon bd*: [<strong>toto] ![]() et je peux visionner cet enregistrement dans un autre fichier PPP (dans le code ci-dessous) comme cela*: (dans le code source : [<strong>toto] et l'affichage (interprétation de navigateur) : [<strong>toto] Code :
Est-ce que cette procédure par htmlspecialchars est suffisante au niveau de sécurité AU PREMIERE ÉTAPE? |
|||||||
|
|
00
|
|
|
#7 | |||
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 991 ![]() |
Mes commentaire dans le code:
Code :
Citation:
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
|||
|
10
|
|
|
#8 | |||
|
Membre du Club
![]() kiddy asp Inscription : avril 2010 Messages : 180 ![]() |
Bonjour Benjamin,
Super merci pour tes commentaire... Citation:
Code :
|
|||
|
|
00
|
|
|
#9 | ||
|
Expert Confirmé
![]() ![]() |
Bonsoir,
Citation:
Citation:
__________________
# Dans la Création, tout est permis mais tout n'est pas utile... |
||
|
20
|
|
|
#10 |
|
Membre Expert
![]() Inscription : septembre 2010 Messages : 1 245 ![]() |
Attention quand même de n'utiliser strip_tags qu'en connaissance de cause car cela limite les possibilités d'expression dans le formulaire (on ne pourra pas par exemple donner des exemples de code html ou php puisque les balises seront supprimées).
Comme grunk je déconseille l'utilisation de htmlspecialchars pour l'enregistrement en Bdd car sans parler de philosophie il y a des inconvénients pratiques : alourdi les tables avec des caractères inutiles et rend les données moins propres en cas d'exportation des tables sans traitement complémentaire. Ces inconvénients sont relativement limités avec htmlspecialchars. Le pire serait d'utiliser htmlentities car en plus d'accroitre considérablement les inconvénients ci-dessus, cela rendrait impossible des recherches insensibles aux caractères accentués (je veux dire qu'une recherche sur 'a' ne pourrait jamais trouver 'à'). Je réserve donc pour ma part ces fonctions uniquement pour l'affichage. EDIT : A bah tiens, le temps de poster je vois que rawsrc a déjà développé à peu près les mêmes arguments
__________________
- Réalisations - Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical. |
|
|
20
|
|
|
#11 |
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 991 ![]() |
Gaffe quand même, on a vite fait d'oublier d’échapper les données en sortie, c'est pour ça que je les nettoies toujours en entrée.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
|
20
|
|
|
#12 | ||||||
|
Membre du Club
![]() kiddy asp Inscription : avril 2010 Messages : 180 ![]() |
Bonjour tout le monde
Super merci les boys... ![]() Citation:
Citation:
Citation:
Citation:
Alors pour sécuriser les données en sortie, faut-il utiliser mysql_real_escape_string ? Code :
|
||||||
|
|
00
|
|
|
#13 | ||||
|
Expert Confirmé
![]() Olivier Développeur Web Inscription : août 2003 Messages : 1 837 ![]() |
Lit donc un peu les doc des fonctions dont on parle.
mysql_real_escape_stringdoit s'utiliser avant une requête pas sur le resultat de celle ci. Pour faire simple : Code :
Code :
|
||||
|
10
|
|
|
#14 |
|
Membre Expert
![]() Inscription : septembre 2010 Messages : 1 245 ![]() |
Oui donc y'a des fonctions spécifiques pour protéger les requêtes :
"mysql_real_escape_string" pour mysql ou "mysqli_real_escape_string" pour mysqli ou "quote" ou des requêtes préparées avec pdo Et des fonctions spécifiques pour protéger l'affichage : htmlentities ou htmlspecialchars Si tu confonds les deux c'est parce que dans de nombreux exemples, certains utilisent également des fonctions de protection pour l'affichage pour traiter les données avant de les enregistrer en bdd. L'avantage évident est décrit par Benjamin Delespierre : t'as pas de risque d'oublier la protection dans ton code d'affichage. Néanmoins ce confort et cette facilité n'est pas sans inconvénient et c'est ce dont nous parlions plus haut. Il est plus correct de ne pas mélanger les deux car cela procure une meilleure optimisation/utilisation des tables. En contre partie il faudra faire attention de ne pas oublier la protection dans ton code d'affichage.
__________________
- Réalisations - Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical. |
|
|
00
|
|
|
#15 |
|
Membre habitué
![]() Marc Ingénieur sécurité Inscription : novembre 2009 Messages : 142 ![]() |
Je suis pas vraiment d'accord avec nos amis, pour moi il faut de base échapper les données. C'est le principe de précaution en profondeur, si je me souvient bien d'une formation de l'OWASP, ils conseillent d'échapper les données à chaque entré et sortie, même entre partie truster.
https://www.owasp.org/index.php/Cate..._Guide_Project Évidemment cela peut représenter certains inconvénient que vous avez déjà présenté. Par contre : - Lourdeur, c'est pas les quelques slashs en plus qui vont ralentir ta base de données Mais cela présente l'énorme avantage d'éviter un oublie de traitement, ce qui est particulièrement vrai lorsque plusieurs travaillent en collaboration. |
|
|
00
|
|
|
#16 | ||
|
Expert Confirmé
![]() Inscription : janvier 2010 Messages : 2 728 ![]() |
Citation:
Il y a très longtemps de ça les développeurs de Php avaient eu la bonne mauvaises idées de créer cette directive magic_quotes_gpc. A savoir que cette directive existe toujours par conséquent ça peu ce faire encore. Mauvaise idée car cela a déboucher sur une quantité d'erreurs d’appréciations de celle ci ce qui à déboucher sur d’innombrables bugs, et ça même dans des projets très évolués (donc des codeurs expérimentés). Mais pire, cela a favoriser de véhiculer l'idée que les données étaient protégées, ce qui pour beaucoup ne faisaient pas (ou plus) grand chose sur la vérifications des données extérieurs tels que GET POST entre autre. Pleins de sites se sont fait piratés à cause de ça. Depuis pas mal d'années, des années je dis bien, la communauté de Php a reconnue que c'était une mauvaise idée, et incite depuis à désactiver cette directive (la mettre à Off), puis inciter d'échapper les données uniquement au moment où cela est nécessaire. Par ailleurs il est dit aussi qu'au niveau de la Base De donnée, l'échappement doit être fait par la base de donnée avec la méthode dédiée, et non par Php (comme addslashes). Depuis quelque temps, la communauté à annoncée que cette directive sera définitivement supprimer (Php6 apparemment). Si à ce niveau là il dit qu'il ne plus échapper systématiquement les données extérieurs, qu'il faut le faire juste là où c'est nécessaire et avec la méthode appropriée, il me semble qu'on peu leur faire confiances. Pourquoi donc véhiculer encore et encore ce genre d'idées ? Citation:
Sans compter qu'il sera difficile voir impossible d'utiliser la méthode d'échappement appropriée selon le contexte. Ca en devient absurde. On échappe une données QUE si c'est nécessaire, c'est largement plus simple, d'autant plus qu'avec PDO + requête préparée (pour exemple) ça le fait automatiquement, sans compter que ça le fait beaucoup mieux car adapté. A savoir que, ce que fait cette directive magic_quotes_gpc si elle est à on ou un addslashes n'est pas du tout équivalent à ce que fait PDO et mysql_real_escape_string(). Mais encore, si on observe les Soft Open sources de nos jours (genre FrameWork, CMS, etc ... plus ou moins évolués), il font tout l'inverses. C'est à dire que si la directive "magic_quotes_gpc" est à On (activée), ils suppriment systématiquement les quotes (stripslashes). Ce qui au bout obligera d'échapper lorsque cela est nécessaire, et avec la bonne méthode. Bref ... c'est une erreur à mon sens de rependre encore ce genre d'idées de nos jours.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20 Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra] |
||
|
|
20
|
|
|
#17 |
|
Membre du Club
![]() kiddy asp Inscription : avril 2010 Messages : 180 ![]() |
Bonjour,
Il y a quelque chose que je ne comprends pas : puisque je fais un enregistrement propre (filtrage, échappement du code, protection injection SQL, etc.) dans mon BDD, pourquoi dois-je utiliser une autre fonction pour l'affichage de cet enregistrement qui est propre ?Utiliser htmlspecialchars() ou htmlentities(), c'est pratique pour éviter des données directement fournies par les utilisateurs . Mais moi, je les prends par intermédiaire de mon BDD... Et si je dois utiliser htmlspecialchars() ou htmlentities() à l'affichage de données, je peux avoir des mauvaises surprises : Exemple : Utilisateur entre dans input : [Je m'appelle André] je les enregistre dans ma BDD : [Je m& # 39;appelle André] Lorsque je l'affiche dans un autre écran : [Je m'appelle Andrà ©] ou : [Je m& # 39;appelle Andr à ©] Même si j'utilise : Code :
header('Content-Type: text/html; charset=UTF-8'); Code :
header('Content-Type: text/html; charset=iso-8859-15'); Code :
header('Content-Type: text/html; charset=iso-8859-1'); avec toutes les possibilités : Code :
$prenom_engregistre= htmlspecialchars($row[0], ENT_QUOTES); Code :
$prenom_engregistre= htmlspecialchars($row[0]); Code :
$prenom_engregistre= htmlentities($row[0], ENT_QUOTES); Code :
$prenom_engregistre= htmlentities($row[0]); Code :
$prenom_engregistre= htmlentities($row[0], ENT_SUBSTITUTE); Code :
$prenom_engregistre= htmlentities($row[0], ENT_DISALLOWED); |
|
|
00
|
|
|
#18 |
|
Membre Expert
![]() Inscription : septembre 2010 Messages : 1 245 ![]() |
Utilises de préférence htmlspecialchars() plutôt que htmlentities().
D'une part c'est suffisant et d'autre part si tu travaille en utf-8 il n'est pas indispensable d'indiquer le charset comme paramètre dans la fonction avec htmlspecialchars alors que c'est indispensable avec htmlentities() (tant que php est par défaut en iso) Faut pas mettre n'importe quel header pour indiquer le charset, faut mettre celui qui correspond à l'encodage que tu utilises. La norme actuelle est plutôt de travailler en utf-8 mais dans ce cas il faut ajouter une requête mysql avant de récupérer tes données pour indiquer à la bdd que tu travailles en utf-8. Il faut que tout ton code soit cohérent concernant l'encodage y compris la configuration de ton outil de travail. Si tu as besoin d'informations complémentaires sur l'encodage utf-8, google te donnera de bonnes réponses en rentrant "tuto utf-8". Les fonctions qui protègent les chaines de caractères à l'entrée en bdd sont de nature différentes de celles qui protègent l'affichage et elles ne protègent pas des mêmes problèmes : mysql_real_escape_string (and co) c'est pour protéger des injections sql, quant à htmlspecialchars (and co) c'est pour éviter que l'on puisse par exemple injecter du code javascript dans ta page ex: echo '<script type="text/javascript">code js</script>' directement ou par l'intermédiaire d'une bdd.
__________________
- Réalisations - Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical. |
|
|
10
|
|
|
#19 | |||
|
Membre du Club
![]() kiddy asp Inscription : avril 2010 Messages : 180 ![]() |
Bonjour tout le monde et bonne semaine,
Citation:
Code :
dans mon deuxième fichier où je mets cette information dans la BDD, il y a mon header*: Code :
header('Content-Type: text/html; charset=UTF-8'); Donc dans ma table l'enregistrement c'est comme cela*: Je m& # 39;appelle (sans espace & # 39;!!!!) Alors mon fichier qui affiche les données de mon BDD a aussi header('Content-Type: text/html; charset=UTF-8'); Donc il y a toujours le même header et c'est UTF-8 avec htmlspecialchars [$prenom_engregistre= htmlspecialchars($row[0], ENT_QUOTES);] j'arrive afficher "Je m& # 39;appelle André" au lieu de "Je m'appelle André" C'est normal parce que l'on utilise "htmlspecialcahrs" pour convertit les caractères spéciaux comme ['] ou ["]... Alors dans ce cas-là, comment je peux convertir [& # 39;](sans espace & # 39;!!!!) en ['] pour arriver au bon affichage : Je m'appelle André |
|||
|
|
00
|
|
|
#20 | ||
|
Expert Confirmé
![]() ![]() |
Citation:
Voici ce que j'ai dit plus haut : Citation:
__________________
# Dans la Création, tout est permis mais tout n'est pas utile... |
||
|
10
|
Copyright © 2000-2012 - www.developpez.com