« Certains de mes champs POST sont ignorés par PHP ! »

J’ai eu ce genre de message plusieurs fois de la part de clients ces derniers temps, et je pense que cela peut concerner beaucoup de monde donc je vous donne les explications.

Le symptôme est simple : « Les X premiers champs envoyés en POST sont bien lus par PHP, mais à partir d’une certaine limite ceux-ci ne sont plus disponibles. » Ou formulé autrement : « il me manque une partie des champs POST ».

Le plus curieux dans cette histoire, c’est que votre code PHP fonctionnait très bien il y a quelques semaines, et là d’un seul coup, plus rien. Que s’est-il passé ?

Vous n’êtes pas en tord, et pourtant il va vous falloir faire des modifications sur la config de PHP 🙂 Le coupable ? Un trou de sécurité dans PHP assez sérieux, qu’il a fallu corriger rapidement et donc … de manière un peu abrupte. Les curieux pourront lire le rapport de sécurité ici :  http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2011-4885

 Pour résumer en quelques mots : il s’agit d’une attaque par amplification. Une personne avec de mauvaises intentions peux envoyer un formulaire avec un certain formatage à votre serveur web, et PHP va mettre plusieurs minutes à la traiter … Multipliez ça par quelques centaines, et voilà votre hébergement dans les choux pour plusieurs heures. Je ne vous expliquerais pas dans cet article comment exploiter cette faille 😉

Pour limiter le champs de l’attaque, l’équipe de développement PHP a mis en place une limite simple : A partir de 1000 champs POST (d’ailleurs, c’est la même limite sur des cookies ou GET), PHP ignore tous les champs suivants. Donc si vous avez un très grand formulaire avec des milliers de champs, il va vous en manquer un bout.

Normalement, PHP vous prévient qu’il a dû tailler dans le vif avec ce message d’erreur : Input variables exceeded 1000. To increase the limit change max_input_vars in php.ini.

Cela vous explicite donc le correctif : il suffit de modifier (ou plutôt ajouter, car je doute que vous l’ayez déjà) la variable max_input_vars dans votre fichier de configuration php.ini (qui se trouve généralement dans /etc sous Linux) et de lui mettre une grande valeur qui permettra à votre formulaire de fonctionner.

Et c’est tout ?

Oui, mais prenez garde : cette limitation était une limite de sécurité. Donc augmenter la limite vous expose à l’attaque initiale. D’expérience, vous pouvez monter à 5000 ou 10000 si vous avez des configurations relativement récentes. Au delà, c’est à vos risques et périls.

2 réflexions sur « « Certains de mes champs POST sont ignorés par PHP ! » »

  1. Bonjour et Merci pour l’info, je cherchais justement sur le web comment augmenter max_input_vars. J’utilise wampserver pour créer mon site internet avec Prestashop et pour traduire un module je rencontre le problème suivant dont le message est "Attention, votre fournisseur d’accès limite le nombre de champs que l’on peut envoyer via un formulaire
    1000 Pour max_input_vars. Demandez à votre hébergeur d’augmenter les limites post et request à 1733 au moins." moi je suis en interne et sous windows, avez vous une idée de savoir comment je peux augmenter max_input_var ? Merci…..

  2. Bonjour Jog,

    Il faut modifier votre fichier "php.ini" comme expliqué dans mon article et relancer le service (icône Wamp > PHP > Redémarrer le service). Fouille dans le menu de Wamp pour voir comment éditer ce fichier.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *