Php: Stack Overflow   September 1st, 2008

En php, comme dans la plupart des langages, lorsque nous effectuons des fonctions récursives (s’appelant elle même) on arrive vite à un dépassement de la pile. Dans un langage tel que le C ce n’est pas très important, on peut très facilement éviter/prévoire cela. Dans une application en PHP aussi c’est facile d’éviter les fonctions récursives s’appelant elle même des dizaines de milliers de fois.

Cependant, dans le cas d’un hébergement vous ne pouvez évidement pas vérifier tous les scripts de votre serveur. Le problème est que certains membres pourraient s’en servir pour causer un déni de service. En effet lorsque PHP est utilisé comme module apache, en effectuant un dépassement de la pile, il se produit une faute de segmentation et cela tue le processus entier. Si c’est un serveur multithreader alors tout le serveur meurt, si c’est en prefork alors le fils meurt et éventuellement le serveur au complet pourrait mourrir dans le cas d’une attaque répété. Même si vous n’êtes pas hébergeur, avec un script tel que phpmyadmin ou peu importe il est facile d’envoyer des milliers de variables POST qui sont lue récursivement par PHP (magic_quotes, etc) !

Je n’entrerai pas dans les explications de bas niveaux, je vais plutôt vous expliquer comment produire un crash de PHP :)   et éventuellement comment le corriger.

En C vous pouvez essayer un code du genre:

#include <stdio.h>

void a(int i){
printf(“Stack: %d\n”,i);
i++;
a(i);
}

int main( int argc, char **argv ) {
a(0);
}

Lorsque la pile va être pleine, vous allez avoir une faute de segmentation. Le nombre d’appels récursif dépend de votre système (surtout de la grosseur du programme en mémoire), dans mon cas ça tourne aux alentours de 392200 à 392940. Vous pouvez évidement utiliser un autre type qu’un entier, mais vous allez arriver au même résultat.

En php pour produire une faute de segmentation il suffit de faire ceci:

function a($i) {

echo “$i\n”;

$i++;

a($i);

}

a(0);

Pour php 5.2.6 sous linux 2.6.25 le dépassement de la pile se produit entre 23354 et 39291 appels.

Comment s’en protéger ?

Read the rest of this entry »

PhpSysInfo est un script permettant de générer un résumé de l’état et des périphériques du serveur.

Je vais garder cet article court afin de ne pas vous décourager (les derniers paragraphes sont complémentaires, pas besoin de les lires ;) ) . C’est pourquoi je n’aborderai pas les pour/contre d’une chroot ou d’une bsd jail, je vais simplement expliquer plusieurs méthodes pour faire fonctionner phpsysinfo à l’intérieur d’une prison.

Read the rest of this entry »

Pour ceux d’entre vous qui font du PHP le moindrement sérieusement, vous avez sans doute remarqué que PHP manque quelque chose du coté de la POO.

C, Visual Basic, C#, et plusieurs autres langages ont la capacité d’avoir des variables publiques en lecture seule dans une classe. C’est à dire que la variable peut être modifié à l’intérieur de la classe, mais à l’extérieur on ne peut que la lire !
Prenons l’exemple suivant:

J’ai une classe qui s’appelle utilisateur et qui gère une session utilisateur:

Class utilisateur {

[....]

public $id = 0;

public $nom = ”;

[....]

}

Admettons que les valeurs de $nom et $id proviennent d’une base de données, il serait fort probablement utile de pouvoir y accéder depuis l’extérieur de la classe! Bref j’aimerais pouvoir lire $nom et $id mais je ne veux pas qu’elles puissent être modifier à l’extérieur de la classe (cela pourrait causer des erreurs, des problèmes de sécurité, des problèmes de conception, etc).

Read the rest of this entry »

J’ai récemment fait l’acquisition d’un nouvel ordinateur portable équipée d’un processeur Core 2 Duo d’intel (architecture Santa Rosa Refresh). Après quelques jours d’utilisation sur l’alimentation secteur je décide de le débrancher afin de tester les limites de mon réseau sans fil. C’est à ce moment que le drame se produisit: Un petit sifflement (comme des milliers de beeps très rapides; un peu comme du code morse accéléré) venait de l’ordinateur !

Au début je n’y faisait pas trop attention, étant habitué à des cartes graphiques haut de gamme je savais très bien que du matériel informatique pouvait émettre un léger sifflement lorsqu’il est chargé, mais ça devint très vite agaçant. Le sifflement était présent seulement lorsque l’ordinateur fonctionnait sur la batterie et lorsque qu’il ne travaillait pas (idle ou presque). J’ai aussi remarqué que lorsqu’un périphérique usb était branché le cillement diminuait nettement. Sachant que Windows désactive les modes de veille profonde pour le CPU (C3 et C4) (correction: à vrai dire non il ne les désactive pas, mais plutôt il n’arrête jamais vraiment le cpu) lorsqu’un périphérique usb est présent, j’en ai donc déduit que c’était un problème au niveau de la gestion de l’énergie. Read the rest of this entry »

Aide mémoire iptables   May 6th, 2008

Pour un débutant, iptables peut être extrêment difficle à maitriser puisqu’il implique soit: de bien connaitre les différentes couches d’un réseau et les techniques de routage de base, soit de connaitre les arguments par coeur sans forcément les comprendres.

Je vais donc rassembler ici des petits exemples de commandes qui pourraient éventuellement vous être utiles. Si vous essayez de faire une règle de routage, de rebond, de redirection ou de dénie qui ne se trouve pas dans la liste, dites le moi et si j’ai le temps j’essayerai de l’écrire pour vous, et de l’ajouter dans cette liste.

C’est quoi Iptables ?

Iptables est une application en ligne de commande qui sert à configurer les règles du filtre de paquets du kernel de Linux (depuis 2.4). Il peut être utilisé autant comme firewall(plutot pour appliqué les règles du firewall) que pour configuré les NAT (Network Address Translation: la réécriture des headers des paquets et le réacheminement de ceux-ci. Du routage quoi.)

Read the rest of this entry »