Intercepter le signal die

Le problème lorsque l’on développe du PERL sous Windows c’est que lors d’un die la console se referme. On peut bien sur lancer PERL via la console mais on n’y pense pas toujours.

C’est pour cela que j’ai décidé d’intercepter le signal die de PERL pour que lorsqu’une erreur intervient, le script attende que j’appuie sur une touche pour continuer.

Le code est très simple :

if ($^O eq "MSWin32") {
    $SIG{__DIE__* = \&win_die;
}

Tous d’abord nous commençons par tester si on est sous Windows (sous Unix je lance forcement mon script dans une console). Si c’est le cas on associe le signal DIE à la fonction win_die.

Voici le code de la fonction win_die:

sub	win_die {
    print "ERROR: ".$_[0];
    print "Press enter to continue\n";
    <STDIN>;
    exit(1);
}

La première ligne permet d’afficher le message d’erreur de die qui est passé en premier paramètre de la fonction, puis à la ligne 3 on attend de lire un retour à la ligne sur l’entrée standard avant de quitter.

Bonnes pratiques de développement en PHP

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.

error_reporting(0);

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->http://www.nexen.net/docs/php/annotee/function.addslashes.php] 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->http://www.nexen.net/docs/php/annotee/function.htmlspecialchars.php] 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/standards.php

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

Programmation shell avancée (If, While et For)

#IF La builtin if permet de tester la reussite d’une commande. Apres le if vous devez mettre un then, puis un fi a la fin de votre bloc. else permet d’utiliser un bloc alternatif au bloc then.

Mais un exemple est beaucoup plus clair :

#!/bin/sh
if cat noplay.txt
   then
      echo Le cat du fichier noplay.txt a reussi
elif cat test.txt
   then
      echo Le cat du fichier noplay.txt n a pas reussi mais le cat de test.txt a reussi
   else
      echo Le cat du fichier noplay.txt n a pas reussi
fi

Pour faire des comparaisons entre des variables vous devez utiliser la commande [ ou test ([ est un alias vers test).

if [ $test ]
then
   La variable test n'est pas vide
fi

if [$test = 2]
then
   La variable test est egale a deux
fi

Faite un man [ pour connaitre les possibilites de la commande [.

#WHILE while boucle tant qu’une condition est vraie.

while commande
do
commande à executer à chaque tour de boucle
done

#FOR Permet d’appliquer un traitement à une liste.

Par exemple pour afficher la liste des fichiers avec l’extension .jpg:

for file in *.jpg
do
  echo $file
done

Les fonctions en script shell

Pour creer une fonction il suffit de mettre le nom de la fonction suivi de () puis le code de la fonction.

mafonction()
*
   code de la fonction
*

L’appel à la fonction dans le code se fera en tapant:

mafonction argument1 argument2

#Les arguments La gestion des arguments se fait comme pour les arguments passe au script shell : on retrouve les parametres de notre fonction dans les variables $1, 2

#Retour d’une fonction Pour renvoyer une valeur depuis une fonction utilisez la commande return suivie de son code de retour.

Les fonctions ne peuvent retourner qu’un int ; si vous desirez recuperer une chaine, placez la dans une variable, en effet en shell toutes les variables sont globales vous pourrez donc la lire n’importe où dans votre code.

Pipes et redirections

Les pipes et les redirections sont des «commandes» très utiles à connaître lorsque l’on utilise un système UNIX. En effet ces «commandes» permettent par exemple de rediriger ce qu’affiche un programme à l’ecran vers un autre programme.

Il existe 4 redirections et un pipe dans les shells Unix.

#Rappel sur les sortie et entree standard

  • L’entrée standard est le clavier, ce que tape l’utilisateur.
  • La sortie standard est l’ecran.
  • La sortie d’erreur est l’ecran aussi mais est independante de la sortie standard.

#Les pipes Le pipe | permet de rediriger la sortie d’une commande vers une autre.

Par exemple si vous tapez:

ls /home | grep "test"

grep effectuera une recherche dans la sortie de ls (rappel: grep recherche ce qui lui est donnée en paramètre) et vous affichera toutes les lignes où il y a test.

#La redirection > La redirection > permet de rediriger la sortie standard d’une commande vers un fichier.

Par exemple:

ls > test

Va rediriger l’affichage de ls dans le fichier test.

#La redirection » Cette redirection marche exactement comme > sauf qu’elle ne vide pas le fichier avant d’écrire, mais elle écrit à la fin.

#La redirection < Cette redirection permet de lire un fichier et de rediriger son contenu sur l’entree standard du programme.

Par exemple:

grep "tmp" < test

Cette commande va faire une recherche de tmp dans le fichier test.

Si on avait utilisée les pipe on aurait pu écrire:

cat test | grep "tmp"

#La redirection « Cette redirection va stocker tous ce qui arrive sur l’entrée standard jusqu’à ce que la condition donnée en paramètre soit remplie.

cat << test

Si vous tapez cette commande vous verrez que votre shell ne fait rien, vous pouvez taper tout le texte que vous voulez et il n’affiche rien… Mais si vous tapez test il va brusquement afficher tout ce que vous avez tapée.