Chargement ajax trop long

WRInaute occasionnel
Bonjour,

Je suis confronté à un problème dont je n'ai aucune idée de comment résoudre.
J'ai, comme beaucoup de monde, un formulaire d'upload image.
Je contrôle le poids, les extensions ect ect...Jusque là pas de problème.

Mon soucis se situe au niveau du chargement ajax, pour tester mon code, après avoir tester différente extension sans problème, j'ai envoyé une vidéo de 5go ( ben voyons !) , et là surprise : un temps d'attente énorme, qui fait planté accessoirement le site, et qui en plus renvoie au bout d'un moment deux erreurs : un forbidden et un time out.
Je pensais qu'en contrôlant le poids on éviter ce genre de phénomène et ben non !

Ma question : comment faire pour empêcher le chargement des fichiers volumineux ??
J'ai bien mis un
if ($_FILES['image']['size'] > 2097152 => oust, mais ça ne fonctionne pas.
J'ai aussi essayé de passer par filesize même résultat.

Disons que ce n'est pas que ça ne fonctionne pas, c'est surtout que le script va planté (et le site au passage) avant même d'avoir calculé, parce que le fichier est trop volumineux.

Avez-vous une idée de comment je peux résoudre ce problème ?
Merci :)
 
Nouveau WRInaute
T'attaquer au problème depuis php n'est peut-être pas la bonne méthode: pour que $_FILES[...] soit parsé, il faut que le fichier ait déjà été uploadé.

Donc tu peux attaquer le problème:
en client-side, depuis javascript:

Code:
<input name=fichier id=leFichier type=file>
[...]
$('#leFichier').bind('change', function() {
            alert('taille (en bytes): ' + this.files[0].size);
        });

--> si this.files[0].size dépasse ce que tu proposes, tu places un joli message et refuses l'upload

et en server-side, dans le php.ini
Code:
upload_max_filesize = 2M
(ou continuer à checker $_FILES si tu ne veux pas imposer une limite globale)
 
WRInaute accro
Salut

Normalement ce que tu as indiqué doit fonctionner :
Code:
if ($_FILES['image']['size'] > 2097152
Vérifie qu'il n'y a pas un autre problème dans ton script. Tu peux également ajouter (en plus) au début de ton formulaire la ligne suivante :

Code:
<input type="hidden" name="MAX_FILE_SIZE" value="2097152" />
cette dernière peut être facilement détournée par une personne mal intentionné, mais pas la première (normalement)

Tu dois bien contrôler la taille de tes fichiers pour éviter un deny de service. Après j'imagine que tu vérifies bien le type de fichiers? Ne surtout pas se baser uniquement sur l'extension (pathinfo) mais utiliser de préférence fileinfo (depuis php 5.3)

Code:
http://php.net/manual/fr/book.fileinfo.php

pour les images tu peux également faire un combo avec "getimagesize" :wink:
 
WRInaute accro
cduray a dit:
Donc tu peux attaquer le problème:
en client-side, depuis javascript

MAX_FILE_SIZE semble plus simple à utiliser. De toute façon ces 2 méthodes sont facilement détournables.

Mais j'avais pas pensé à ca, si une personne malveillante outre passe le test javascript et MAX_FILE_SIZE et envoi à la chaine plusieurs fichiers de taille élevée, ca risque de poser de sérieux problème non? Il est impossible d'éviter le téléchargement de ces fichiers sur le serveur dans le dossier tmp? même si ensuite on les traite pas
 
WRInaute accro
WRInaute accro
noren a dit:
ca risque de poser de sérieux problème non?
Oui et non, oui pour toi si c'est toi qui envoie car ça va planter mais pour le serveur il sortira d'une façon ou d'une autre avec un débordement mémoire ce qui va ralentir 30s le serveur ou simplement un plantage 500, mais ça n'affecte pas ("forcement") tout le monde.

Pour mémoire aucune vérification côté client ne dois exclure une vérification côté serveur. Les solutions client-side, ne sont là que pour cadrer l'utilisateur légitime afin de rendre l'interface plus soft mais ça n'empêche rien vue que c'est sous le contrôle de l'utilisateur.
 
WRInaute accro
ok mais si une personne malintentionné passe le contrôle de la taille côté client et envoi en boucle ne risque t'-on pas le deny de service et plantage serveur ou saturation de la mémoire?

quelle est la différence entre MAX_FILE_SIZE et vos scripts javascript?

MAX_FILE_SIZE ne contrôle t-il pas la taille déjà côté client?
 
WRInaute occasionnel
Oulà, je m'attendais pas à ce que ce soit autant réactif aussi rapidement :).
Merci pour toutes vos solutions, je pense que je vais mettre le max_file_size déjà, parce que effectivement ça se fait directement sur la machine du client, et ça filtrera déjà un petit monde.
Bien sur comme il y a toujours des malhonnêtes, je vais ajouter un autre contrôle avec javascript.=> Merci cduray, concombre et zeb pour vos solution. Je regarde ça de plus prés.
ça filtrera aussi un peu de monde.

zeb a dit:
Pour mémoire aucune vérification côté client ne dois exclure une vérification côté serveur. Les solutions client-side, ne sont là que pour cadrer l'utilisateur légitime afin de rendre l'interface plus soft mais ça n'empêche rien vue que c'est sous le contrôle de l'utilisateur.
Et bien techniquement c'est censé ne pas passer, puisque je fais un contrôle en ajax, pour avoir la prévisualisation de l'image ( et donc obligé d'ulpload l'image) et ensuite je fais un deuxième contrôle avant d'envoyer le formulaire complet.
Je me suis fait une classe pour ça, je n'ai jamais rencontrer le moindre problème jusqu'à ce que je teste avec ce fameux fichier volumineux.

Donc concrètement, il n'y a pas vraiment de solution si ce n'est un blocage html, suivi d'un js qui peuvent tout deux être détourné. Donc si le mec en a vraiment après moi c'est retour au point de départ.
 
WRInaute accro
noren a dit:
ok mais si une personne malintentionné passe le contrôle de la taille côté client et envoi en boucle ne risque t'-on pas le deny de service et plantage serveur ou saturation de la mémoire?
pas besoin de se prendre la tête avec un truc aussi tordu pour arriver là sur un serveur.
noren a dit:
quelle est la différence entre MAX_FILE_SIZE et vos scripts javascript?
Connaître le poids du fichier et pourvoir proposer des actions correctives ou incitatives car le poids important n'est pas l'unique souci, un quidam qui t'envoie une photo d'illustration en 100px par 100px c'est du temps perdu et direct poubelle.
L'input dont tu parle ne fixe qu'une limite il n'informe pas (sans parler de sécurité car il est notoirement plus facile a manipuler qu'un script mais a ce niveau c'est pas différent, si tu veux tu peux).
 
WRInaute accro
freestyle83 a dit:
Donc concrètement, il n'y a pas vraiment de solution si ce n'est un blocage html, suivi d'un js qui peuvent tout deux être détourné. Donc si le mec en a vraiment après moi c'est retour au point de départ.
Non pas vraiment car avec un Ctrl a priori en JS tu sais que théoriquement ce qui te parviens est dans une fourchette précise que tu connais. Hors si avec le Ctrl a posteriori tu te rend compte que tu est au dessus de la fourchette c'est qu'un branquignole fait joujou donc tu peux ban l'ip (si par hasard tu gère les exceptions ou si le serveur passe quand même le fichier) :wink:
 
WRInaute occasionnel
ah j'aurais pas pensé à bannir l'ip... bonne idée !

Et oui en effet je gère les erreurs. Je me suis fait un système de log, comme ça je sais ou ça merde, par qui pourquoi comment :) bienvenue chez moi :D
Mais ce n'est pas automatique, le mec qui fait joujou il va faire joujou jusqu'à temps que je m'en rend compte.

Peut-être que je devrais mettre un niveau de critique dans mes logs et m'envoyer un mail pour les niveau les plus hauts. J'y songe mais pas le temps pour le moment.
 
WRInaute impliqué
ne pas oublier non plus, que l'on peut désactiver son javascript, en plus de modifier la valeur de MAX_FILE_SIZE
 
Discussions similaires
Haut