Quick Tip – Les “includes” et les “require” de PHP

Avez-vous déjà utilisé les includes et les require de PHP ?

Si oui, vous êtes peut-être déjà tombés sur le problème suivant : lorsque l’on utilise un include, le caractère “null” coupe l’inclusion du fichier.

Le problème est principalement posé lors de l’inclusion dynamique d’un fichier. Imaginez un simple sur le site example.com :

  1. <?php include $_GET['file'].'.php'; ?>

Il suffit d’utiliser l’URL http://example.com/?file=.htaccess%00 pour accéder au contenu du fichier .htaccess, et éventuellement bien pire !

Pour résoudre le problème ? Vérifier que le fichier inclus est bien un fichier que l’on autorise à l’inclusion, avec éventuellement un tableau des fichiers autorisés, tester que le fichier est bien un fichier PHP (et donc que le contenu sera interprété), et toute autre vérification, qui bien entendu ne sera pas superflue.

Mais évidement, vous faites déjà les vérifications nécessaires ;)

Statsy v2 – Quelques ajouts

Stoyan Stefanov à présenté Stasty, un bookmarklet qui permet d’obtenir très rapidement des informations notamment sur les style et script présents en inline sur une page.

Cependant, il manque sur ce script quelques informations importantes, facilement récupérables.

J’ai donc créé un nouveau bookmarklet avec des infomations un peu plus complètes :

Statsy 2
  1. (function(){
  2.     var jsattribs = [
  3.         'onbeforeunload',
  4.         'onclick',
  5.         'ondblclick',
  6.         'onerror'
  7.         'onload',
  8.         'onmousedown',
  9.         'onmousemove',
  10.         'onmouseout',
  11.         'onmouseover',
  12.         'onmouseup',
  13.         'onunload',
  14.     ],
  15.     cssattribs = [
  16.         'style'
  17.     ];
  18.  
  19.     var all_elems = document.getElementsByTagName('*');
  20.  
  21.     function getAttribsSize(attribs) {
  22.         var value = '',
  23.             attr = '',
  24.             cnt = 0;
  25.  
  26.         for (var i = 0; i &lt; all_elems.length; i++) {
  27.             for (var j = 0; j &lt; attribs.length; j++) {
  28.                 attr = attribs[j];
  29.                 value = all_elems[i].getAttribute(attr);
  30.                 if (value &amp;&amp; typeof value === 'string') {
  31.                     cnt += attr.length;
  32.                     cnt += 3; // ="…"
  33.                     cnt += value.length;
  34.                 }
  35.             }
  36.         }
  37.         return cnt;
  38.     }
  39.  
  40.     function getInlineSize(tag) {
  41.         var s = 0,
  42.             all = document.getElementsByTagName(tag);
  43.         for (var i = 0; i &lt; all.length; i++) {
  44.             s += all[i].innerHTML.length;
  45.         }
  46.         return s;
  47.     }
  48.  
  49.     var jsatt = getAttribsSize(jsattribs);
  50.     var cssatt = getAttribsSize(cssattribs);
  51.  
  52.     var msg = [];
  53.     msg.push('JS in HTML attributes: '+jsatt+' bytes');
  54.     msg.push('CSS in HTML attributes: '+cssatt+' bytes');
  55.     msg.push('JS in SCRIPT tag: '+getInlineSize('script')+' bytes');
  56.     msg.push('CSS in STYLE tag: '+getInlineSize('style')+' bytes');
  57.     msg.push('All innerHTML: '+document.documentElement.innerHTML.length+' bytes');
  58.     msg.push('# SCRIPT tag: '+document.getElementsByTagName('script').length);
  59.     msg.push('# STYLE tag: '+document.getElementsByTagName('style').length);
  60.     msg.push('# DOM elements: '+all_elems.length);
  61.     msg.push('Cookie size: '+document.cookie.length+' bytes');
  62.  
  63.     alert(msg.join("\n"));
  64. })();

Vous pouvez directement récupérer le bookmarklet ici :

Statsy 2

N’hésitez pas à faire vos suggestions !

UPDATE 30/11/2010

Suite à la demande de jpvincent, petit explicatif des différentes informations remontées :

JS in HTML attributes : Cette information remonte tout le code JavaScript présent directement dans les balises HTML en tant qu’attribut. Par exemple, une page qui contiendrait <h1 onmouseover=”alert(‘H1′);”></h1> ajouterait 26 bits à JS in HTML attributes

CSS in HTML attributes : Même procédé que pour les JavaScript détaillés un peu plus haut, en utilisant cette fois le contenu des attributs style (ex. style=”color:#f00;”)

JS in SCRIPT tag : Cette information remonte le nombre de bits du code JavaScript présent au sein de balises <script></script>

JCSS in STYLE tag : Même principe que la propriété précédente, cette information remonte le nombre de bits du code CSS présent au sein de balises <style></style>

# SCRIPT tag : Compte le nombre d’occurrence d’utilisation des balises <script> au sein de la page

# STYLE tag : Compte le nombre d’occurrence d’utilisation des balises <style> au sein de la page

# DOM elements : Compte le nombre d’éléments DOM au sein de la page

Cookie size : Retourne la taille en bit des cookies présent sur le fichier HTML, et donc probablement sur tout les fichiers statiques s’ils ne sont pas sur un domaine externe

Décompression de fichiers sous Linux

Les formats de décompressions sous Linux sont assez compliqués à retenir, surtout étant donné le nombre de formats de compression existants.

Dans un de ses tweets, @zeroload pose ce problème.
J’utilise personnellement un script pour effectuer le travail. Celui-ci, récupéré il y a longtemps sur Internet et ajusté à mes besoins, il choisi son mode de décompression en fonction des formats du fichier, et exécute la commande associée.

Pour l’utiliser, il suffit de placer les lignes suivantes dans le fichier .bashrc :

extract () {
  1.  if [ -f $1 ] ; then
  2.   case $1 in
  3.    *.7z) 7z x $1 ;;
  4.    *.bz2) bunzip2 $1 ;;
  5.    *.gz) gunzip $1 ;;
  6.    *.rar) rar x $1 ;;
  7.    *.tar) tar xvf $1 ;;
  8.    *.tar.bz2) tar xvjf $1 ;;
  9.    *.tar.gz) tar xvzf $1 ;;
  10.    *.tbz2) tar xvjf $1 ;;
  11.    *.tgz) tar xvzf $1 ;;
  12.    *.Z) uncompress $1 ;;
  13.    *.zip) unzip $1 ;;
  14.    *) echo "Le format de compression de '$1' n'est pas supporté…" ;;
  15.   esac
  16.  else
  17.   echo "'$1' n'est pas un fichier !"
  18.  fi
  19. }

On peut bien entendu ajouter très facilement un nouveau format géré par le script, et pourquoi pas créer une autre fonction pour gérer la compression suivant plusieurs formats !

NB: Pour recharger le fichier .bashrc, il suffit de se reconnecter au compte, ou de faire :

  1. cd
  2. . .bashrc