web-dev-qa-db-fra.com

Comment prévenir l'avertissement: POST Contenu-Longueur et taille de la mémoire

Actuellement, lorsque l'utilisateur télécharge une photo, la page indique "Avertissement: POST La longueur du contenu deXXXoctets dépasse la limite de 21000000 octets dans Unknown sur la ligne 0".

Je sais ce que cela signifie et je ne cherche PAS des solutions telles que l'augmentation des valeurs max_upload ou même memory_size_limit ... Parce que les utilisateurs peuvent et les utilisateurs vont télécharger des téraoctets de non-sens même si vous leur indiquez explicitement un maximum de 20 Mo de fichiers et seules les images sont autorisées.

Je cherche une solution sur:

  • Comment éviter que cet avertissement ne se produise?
    Ou au moins:
  • Comment empêcher l'affichage de cet avertissement?

EDIT: VEUILLEZ LIRE! - S'il vous plaît comprendre que bien sûr, je traite l'erreur/avertissement après (depuis la ligne 1), le problème est cela se produit sur une "ligne 0" virtuelle c'est pourquoi je dois masquer l'erreur ou la prévenir à relever - parce que je ne peux pas mettre de code avant l’endroit où l’erreur se produit. 

EDIT2: Finalement, après de très longues recherches et des recherches approfondies, j'ai eu une idée - cela a fonctionné - voyez ma propre réponse.

9
jave.web

Donc, après avoir cherché au lieu de travailler aujourd'hui, j'ai enfin eu une idée de la façon de résoudre ce problème. Cela a fonctionné et n'a même pas causé beaucoup de dégâts. Mais s'il vous plaît, comprenez d'abord ce que vous faites avant de le faire. :) Comme je l'ai suggéré dans l'un de mes commentaires, il est vraiment possible de désactiver les erreurs PHP dans .htacess - désactivez simplement les avertissements de démarrage PHP.

Avant d'appliquer la solution:

Notez que: après avoir inséré ce code dans votre .htaccess, vous ne pourrez plus voir any Erreur de démarrage

Notez également que: il y a plus d’erreurs de démarrage sur la ligne "0" que celle-ci.

Avant: Avant cela, vous devez préparer votre script de manière à vérifier la taille du contenu téléchargé et donner à l'utilisateur un message d'information approprié . Le fait que l'avertissement ne montre pas NE FAIT PAS signifie que vous ne devez rien faire à ce sujet. Cela signifie l'opposé EXACTE - vous devriez faire tout ce que vous pouvez pour faire quelque chose au moins presque égal à la relance de l'avertissement - vérifier, revérifier si vous le pouvez, gérer l'erreur et afficher votre propre message d'erreur.

Ajoutez ceci à votre .htaccess:

php_flag display_startup_errors off

Ce n'est pas si mal que cela semble être:

Veuillez noter que cela désactive les erreurs de démarrage only .
So tous les PHP erreurs/avertissements/avis réguliers restent activés :)

Même XAMPP PHP "lui-même" le recommande pour la production:

Le fichier php.ini dit littéralement:

; display_startup_errors
;   Default Value: Off
;   Development Value: On
;   Production Value: Off

PS: "erreur de démarrage" semble être ces erreurs avant PHP le script est exécuté lui-même - ces erreurs tentent généralement de vous "persuader" que ils sont sur la ligne 0 .

Merci à mon idée et à cette réponse: Comment désactiver la notification et l'avertissement dans PHP dans un fichier .htaccess?

EDIT: Comme il s’agit d’un paramètre php_flag, vous pouvez bien sûr le définir également par défaut dans votre php.ini si vous avez l’installation personnalisée de PHP :)

11
jave.web

La question est

Comment prévenir Warning: POST Content-Length

la réponse est, sans modifier aucune valeur de configuration, mettez ce code au tout début du fichier qui recevra le formulaire à traiter:

 <?php // here start your php file
 ob_get_contents();
 ob_end_clean();

C'est. Plus d'avertissement, plus rien de ce que vous ne voulez pas comme résultat sur votre page. Après, comme suggéré ailleurs, vous pouvez décider quoi faire avec:

if($_SERVER['REQUEST_METHOD'] == 'POST' && empty($_POST) && empty($_FILES) && $_SERVER['CONTENT_LENGTH'] > 0){ echo"WoW your file is too big!"; }

Peut-être aussi couper le fichier si, d’une autre manière, vous transmettez des valeurs correctes concernant le fichier à traiter par Php.

comme expliqué ici Attention: POST Contenu-Longueur ...

4
axew3

Voici la vraie solution pour éviter cette erreur correctement.

Définissez ces paramètres dans votre php.ini:

enable_post_data_reading = On
upload_max_size=0
post_max_size=0

Attention: assurez-vous d'avoir cette ligne dans votre formulaire

<input type="hidden" name="MAX_FILE_SIZE" value="2048576" />

ET LE PLUS IMPORTANT:

  • assurez-vous de vérifier les erreurs de code de $ _FILES ['fichier'] ['erreur']

  • assurez-vous également de vérifier la taille de votre téléchargement dans PHP

1
Romain GALVEZ

J'ai un problème similaire avec vous et je me demandais si vous aviez trouvé une solution satisfaisante. Actuellement, mon 'Avertissement PHP: POST Content-Length de 21010354 octets dépasse la limite de 8388608' se trouve dans le journal et je ne pense pas que je peux faire grand chose à ce sujet. 

Je travaille dans un framework Zend, et lorsqu'un utilisateur télécharge un fichier comme ci-dessus, il tue en principe toutes les analyses de données POST habituelles, de sorte que la réponse à getParams () ne contient aucun des fichiers habituels POST paramètres. Cela signifie que les utilisateurs reçoivent une erreur de validation, indiquant qu'un des champs est manquant, ce qui est trompeur. 

En faisant des recherches à ce sujet, j'ai trouvé quelques paramètres php_ini intéressants que vous pourriez souhaiter examiner, notamment enable_post_data_reading et always_populate_raw_post_data. Dans mon cas, je télécharge un fichier de 20M, avec un maximum de 8 millions de messages et un maximum de 10 millions de fichiers téléchargés, et le résultat de l'entrée php: // semble être un fichier complet sur 20 millions, même si les données du message sont maintenant vides. . 

Je vais donc vérifier manuellement si les données brutes dépassent la limite et supposer que tout échouait si c'était le cas (et sous caution). Je suggère que vous puissiez écrire votre propre code pour analyser les données brutes, pour renseigner les données $ _POST. Vous pouvez ensuite lancer votre code, à votre guise, et uniquement lorsque vous êtes prêt, vérifiez si l'utilisateur a téléchargé plus de données que la limite. C’est à vous de renvoyer une erreur avant de l’analyser, ou si cela vous convient, de l’analyser. Tant que vous définissez la limite de publication et de chargement de PHP au-dessus de votre limite d'utilisateurs, l'utilisateur doit pouvoir enfreindre les règles, permettant ainsi à votre code de détecter la culasse et de s'en plaindre. 

1
sibaz

Comme vous l'avez déjà constaté vous-même, il est impossible de le faire en PHP, car PHP ne peut intercepter les erreurs qu'à partir de la ligne 1.

Le seul moyen de contourner le problème serait de creuser dans le code source PHP, trouver où cette erreur est générée et supprimer cette partie des sources PHP avant de compiler la version PHP de votre costume.

Mais soyez averti que le message d'erreur est lancé pour une raison.

0
Alexander