Noplay >>Développement


Niveau: Débutant
Licence de l’article: Free Documentation License

version imprimable

Bonnes pratiques de développement en PHP

le samedi 30 avril 2005 par
Noplay

sommaire

Activez toutes les erreurs
Coupez les erreurs
Les short tags
Les register globals
Nommez les sessions
include_once et require_once
La sécurité
N’utilisez jamais de variable utilisateur dans un include ou un fopen
Protéger vos requêtes SQL
Échappez le HTML et le PHP
Faites un hash des mots de passes
Changer l’id de session
Vérifiez le retour des fonctions systèmes
Style de dévellopement
Remerciements




Le but de cet article est de lister un certains nombre de points important auxquels il faut songer lors du développement en PHP. PHP est tellement simple à apprendre que la majorité des développeurs sont autodidactes et ont parfois pris de (très) mauvaises habitudes.

Activez toutes les erreurs

Lors de la phase de développement il est préférable d’activer tous les warnings : cela vous permettra notamment de connaître les variables non déclarées (ca simplifera le développement).


error_reporting(E_ALL);
 

Coupez les erreurs

Par contre sur un site en production il est recommandé de couper les Warnings afin de ne pas fournir aux pirates de précieuses informations : de plus cela est du plus mauvais effet pour les visiteurs.

Une bonne pratique peut-être de mettre en place un systèmes pour être alerté en cas de soucis. Comme par exemple une notification des erreurs par mail : Un exemple chez Zend

Les short tags

Lorsque vous voulez insérer du code php dans une page n’utilisez pas les short tags :

<?

mais

<?php

. Cela pourrait créer des conflits avec d’autres langages (comme le XML) et l’option est désactivée par défaut.

Les register globals

Avant la version 4.2 de PHP il était possible d’accéder directement aux variables de l’url ou d’un formulaire juste en utilisant leur nom. Pour des raisons de sécurité cette option est désormais coupée par défaut. Mais cette option est toujours activée chez de nombreux hébergeur afin de rester compatible avec les anciens scripts.

Ainsi pour accéder à la variable test de :

http://www.noplay.net/index.php?test=tata

Utilisez $_GET[’test’] plutôt que $test.

Plus d’informations sur phpdebutant

Nommez les sessions

Lors de l’utilisation des sessions avant de faire un session_start utilisez session_name afin de mettre un nom de session propre à votre site ce qui vous évitera de mauvaises surprises sur certains serveur.

session_name

include_once et require_once

Lorsque vous incluez un fichier contenant des classes et des fonctions utilisez include_once si le fichier doit-être inclus de façon conditionnelle et require_once si il doit toujours être inclus.

La seul différence entre require et include est leur comportement en cas d’echec : require provoquera une FATAL ERROR alors que include affichera juste un WARNING.

Les versions once de include et require évite que le fichier soit inclus deux fois ce qui vous permet de ne pas redéfinir les fonctions.

L’explication sur PEAR

La sécurité

Les conseils qui suivent concernent la sécurité de vos scripts ; en effet en PHP l’apprentissage est tellement simple que l’aspect sécurité est souvent négligé.

Je vous recommande les articles de http://www.phpsecure.info (en français pour ne rien gacher :D).

Vous devez toujours garder à l’esprit qu’il ne faut jamais faire confiance à l’utilisateur.

N’utilisez jamais de variable utilisateur dans un include ou un fopen

Ne faites jamais :


include $_GET['page'];
 

En effet un pirate pourrait détourner votre inclusion vers un autre fichier sur votre serveur ou sur un autre. Pour faire ce genre chose, effectuez un controle auparavant comme par exemple :


if ($_GET['page'] == 'forum' || $_GET['page'] == 'news') {
  include $_GET['page'];
}
 

Évidemment vous pouvez faire plus propre.

Protéger vos requêtes SQL

Afin de vous prémunir de l’injection SQL vous devez protéger les variables que vous utilisez dans vos requêtes SQL.

Il est possible d’utiliser pour cela addslashes mais si vous devez insérer des données binaires dans MySQL il vaut mieux utiliser : mysql_real_escape_string.

Note : il est possible que la directive magic_quote de PHP soit activée et protége automatiquement les variables utilisateurs, mais cette option est de plus en plus souvent désactivée pour des raisons de performance. Vous pouvez tester si cette option est activée avec get_magic_quotes_gpc.

Exemple d’utilisation de addslashes :


if (!get_magic_quotes_gpc()) {
    $nom = addslashes($_POST['nom']);
}
else {
    $nom = $_POST['nom'];
}
 

Échappez le HTML et le PHP

Comme pour les requêtes SQL pensez à supprimer le code PHP et HTML afin de vous prémunir contre le Cross Site Scripting, cela peut-être fait avec la fonction htmlspecialchars ou stript_tags. La différence entre stript_tags et htmlspecialchars vient du faite que la première supprime le contenu alors que la seconde le remplace par des caractères protégés.

Lorsque vous utilisez htmlspecialchars faite attention à utiliser le bon charset. Le charset par défaut étant iso-8859-1.

Faites un hash des mots de passes

Ne stockez jamais un mot de passe en clair, en effet si quelqu’un parvenait à s’introduire sur votre site web il aurait directement accés à tous les mots de passe des utilisateurs. Les utilisateurs utilisant bien souvent le même mot de passe partout, les conséquences pourraient être très graves.

Appliquez plutôt une fonction de hashage sur le mot de passe. Celle ci va calculer une chaine de taille fixe à partir du mot de passe avec laquelle il est impossible techniquement de revenir en arrière.

Lorsque l’utilisateur voudra se connecter vous n’aurez qu’à comparer le hash du mot de passe soumis avec celui que vous aviez stocké.

SHA1 MD5

Changer l’id de session

Utilisez la fonction session_regenerate_id afin de changer l’id de session lorsque un utilisateur se connecte. Cela permet de limiter le vol de session.

Vérifiez le retour des fonctions systèmes

Vérifiez toujours le retour de toutes les fonctions systèmes, notament fopen, obstart...

Style de dévellopement

Je vous recommande de lire sur les conventions de codage de PEAR afin d’écrire du code propre et lisible par le plus grand nombre.

http://pear.php.net/manual/fr/stand...

Remerciements

Je tiens à remercier Darzee, Snowcat et Stem pour leurs remarques sur cet article.



commentaires (33 message(s))

Bonnes pratiques de développement en PHP
le 13 juin , par Janny:

All people make mistakes. Even if they write college essay. They must be careful for avoiding them.



Bonnes pratiques de développement en PHP
le 10 juin , par HUIK:

We all love shoes. But I really love shoes. If you’re a woman, that’s to be expected. But I really dig shoes the way most girls do(no homo) ! I’m an Air Jordan addict-slash-Nike Air Force 1 fiend.Supra For Sale These "kicks" can be expensive as most of us know. And frankly since I am so addicted to these kicks I like to try and buy at least 2 pairs a week, no B.S. It’s crazy I know, but you can never have too many shoes (unless they start to distort the foundation of your house) !



Bonnes pratiques de développement en PHP
le 7 juin , par :

En passant je voulais que vous sachiez que j’ai trouvé ce site est vraiment de bonne qualitée | maigrir du ventre



Buy Famvir Online
le 7 juin , par samuelfosss:

I would like to thank you for the efforts you have made while writing this post. I am hoping for the best work of the same from you in future.

Buy Generic Drugs | Buy Aldara Online | Buy Famvir Online



Buy Generic Soma
le 7 juin , par ozonemattew:

Thanks for a nice share you have given to us with such an large collection of information. Great work you have done by sharing them to all. simply superb

Generic Soma Online | Ladies Panties



Bonnes pratiques de développement en PHP
le 5 juin , par star09:

article est de lister un certains nombre de points important auxquels il faut songer lors du développement en PHP and change

police supply



Bonnes pratiques de développement en PHP
le 5 juin , par star09:

e de mettre en place un systèmes pour être alerté en c

police supply



Bonnes pratiques de développement en PHP
le 2 juin , par gasho22:

Cet article provient de ces العاب articles est très beau et utile, ainsi que de parler de Bonnes Pratiques de Développement PHP en c’est vraiment un excellent article



Bonnes pratiques de développement en PHP
le 25 mai , par dfgdsgdf:

That’s great, I never thought about how much wine should you buy for a party like that before.

Risk Management



Bonnes pratiques de développement en PHP
le 21 mai , par xenical:

As can to diet puberty, lots old available treating. xenical 120 This Healthy a skin.ppFollow these be used you taking. acheter xenical



Bonnes pratiques de développement en PHP
le 16 mai , par Andrew123:

Resources like the one you mentioned here will be very useful to me ! I will post a link to this page on my blog. I am sure my visitors will find that very useful. SEO Agency India



Bonnes pratiques de développement en PHP
le 16 mai , par lkm:

about exam9A0-145 exam all you have to do9A0-161 exam is go through them.9A0-147 exam promises you



Bonnes pratiques de développement en PHP
le 22 avril , par Rox:

Thanks for sharing such a useful stuff ! help do my essay



Bonnes pratiques de développement en PHP
le 20 avril , par :

Je viens d’enregistrer cet article dans mes favoris. | croisière pas chère



Bonnes pratiques de développement en PHP
le 16 avril , par dfdsf:

but it may also be great as a full time income. Not all people are going to do well,free article content son articlesfish but keep your head up and stick to it and you may just find great success in the online business.



Bonnes pratiques de développement en PHP
le 12 avril , par :

Excellent read, I just passed this onto a colleague who was doing a little research on that. And he actually bought me lunch because I found it for him smile So let me rephrase that : Thanks for lunch ! The Krup Law Group



Bonnes pratiques de développement en PHP
le 23 mars , par samdy:

There are many online stores having Cheap mbt footwear, i believe you gonna like it ! Yesterday, my friend bought a Mbt shoe for salewhich is so beautiful, i am surprised by the design and style.Do you have a pair of Mbt online now ? if not, go to online store and have one, it is so amazing !!!11111111



Bonnes pratiques de développement en PHP
le 22 mars , par bob:

You made certain fine points there. I did a search on the topic and found mainly folks will consent with your blog. Roll Assemblies



Bonnes pratiques de développement en PHP
le 22 mars , par bob:

This can be a great article thanks for sharing this informative information.. I will visit your weblog regularly for some latest post Roll Shells



Bonnes pratiques de développement en PHP
le 16 mars , par TonyAllen:

Shop new Prada arrivals online. Enjoy the affordable price and top quality. Our Prada Outlet offers varieties of colorful Prada Shoes for men ,Prada Sunglasses and other Prada accessories. Don’t hesitate to miss the surprise.



Bonnes pratiques de développement en PHP
le 14 mars , par thomas sabo:

Silver together with ravenscroft crystal charms, Thomas Sabo bracelets, engagement diamond rings together with Thomas Sabo Charms is the most desirable layout gold traits designed for cold weather In 2010.In Inspiring Commons Driver’s license : Attribution Any history for gold traits will depend on when a big selection of has an effect on which unfortunately unite that will model that which is then simply established for obtaining Thomas Sabo Bracelet



Bonnes pratiques de développement en PHP
le 28 janvier , par adopteunmec:

si j’avais su !!! adopteunmec



Bonnes pratiques de développement en PHP
le 28 janvier , par adopteunmec:

ah ouais j’adore !!!



iXYXFEZNFbCFNkxDeeL
le 15 janvier , par buy tramadol online:

RVNOcI not sure if its like that, BUY LOW PRICE TRAMADOL ONLINE, [url="http://www.lgspace.org.uk/forum/vie..."]BUY LOW PRICE TRAMADOL ONLINE[/url], http://www.lgspace.org.uk/forum/vie... BUY LOW PRICE TRAMADOL ONLINE, 8)),



Bonnes pratiques de développement en PHP
le 9 avril , par thanhnguyen:

xxxxxxxxxxxetwqertgeqr



hashage cryptographique
le 2 août , par Krunch:

Stocker le hash est mieux que stocker le mdp en clair mais moins bien que de stocker un hash "salé" (HMAC) comme pour les mdp stockés par Apache notamment. Voir par exemple : http://www.ietf.org/rfc/rfc2104.txt http://lasecwww.epfl.ch/php_code/pu... Et pour une petite introduction à la cryptographie orientée programmation web : http://www.linux-mag.com/content/vi...



> Bonnes pratiques de développement en php
le 18 juin , par microtom:

>error_reporting(E_ALL) ;

Préciser que ceci est bien pour PHP4, car pour PHP5 il y a mieux tel que error_reporting = E_STRICT | E_ALL

De plus, activer les rapports d’erreur c’est bien, mais ça ne sert à rien si display_errors = Off :)

voilà

microtom



> Bonnes pratiques de développement en php
le 2 mai , par Frédéric Bouchery:

A part les hébergeurs gratuits, la plupart du temps, il est possible de changer le error_log avec une directive .htaccess

Une solution assez séduisante peut-être de surcharger le errorHandler avec une version pour le développement qui affiche l’erreur mais également plein d’infos comme le debugbacktrace, le contenu de la session, ...etc. et en production, ces même infos sont placées dans un fichier avec une alerte envoyée par email.

En tout cas, placer le error_reporting à "0", c’est une grossière erreur car il ne devient plus possible de savoir s’il y a eu des erreurs graves. Généralement, la génération de ces erreurs graves peut venir d’une utilisation anormale de l’application que l’on n’avait pas testé, et pour cause, un pirate fait certainement "joujou".



Petite erreur ...
le 2 mai , par Max:

Dans le chappitre "Les register globals" vous avez croisez le nom du paramètre et sa valeur.

C’est $_GET[’test’] ou $test qui fonctionnent mais pas $_GET[’tata’] $tata

... http://www.noplay.net/index.php?tes...

Utilisez $_GET[’tata’] plutôt que $tata.



> Bonnes pratiques de développement en php
le 1er mai , par Frédéric Bouchery:

hummm ... en production, je laisserai le error_reporting à E_ALL, mais je désactiverai le display_errors et j’activerai le log_errors !

De même, je déconseille l’utilisation de strip_tags, car cette fonction peut avoir un comportement inattendu pour certains utilisateurs qui utilise le symbole "<". Il est préférable d’utiliser htmlspecialchars.




Webmaster Noplay