Chargement ajax trop long

Discussion dans 'Développement d'un site Web ou d'une appli mobile' créé par freestyle83, 11 Février 2015.

  1. freestyle83
    freestyle83 WRInaute occasionnel
    Inscrit:
    19 Novembre 2011
    Messages:
    402
    J'aime reçus:
    16
    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 :)
     
  2. concombre
    concombre Nouveau WRInaute
    Inscrit:
    14 Juillet 2014
    Messages:
    41
    J'aime reçus:
    0
    Salut,
    Tu veux empêcher l'upload de fichiers volumineux, c'est ça ?

    En JS avant Upload : element.files[0].size
     
  3. cduray
    cduray Nouveau WRInaute
    Inscrit:
    7 Avril 2008
    Messages:
    38
    J'aime reçus:
    0
    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)
     
  4. noren
    noren WRInaute accro
    Inscrit:
    8 Avril 2011
    Messages:
    2 911
    J'aime reçus:
    15
    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:
     
  5. noren
    noren WRInaute accro
    Inscrit:
    8 Avril 2011
    Messages:
    2 911
    J'aime reçus:
    15
    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
     
  6. zeb
    zeb WRInaute accro
    Inscrit:
    5 Décembre 2004
    Messages:
    12 187
    J'aime reçus:
    1
  7. zeb
    zeb WRInaute accro
    Inscrit:
    5 Décembre 2004
    Messages:
    12 187
    J'aime reçus:
    1
    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.
     
  8. noren
    noren WRInaute accro
    Inscrit:
    8 Avril 2011
    Messages:
    2 911
    J'aime reçus:
    15
    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?
     
  9. freestyle83
    freestyle83 WRInaute occasionnel
    Inscrit:
    19 Novembre 2011
    Messages:
    402
    J'aime reçus:
    16
    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.

    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.
     
  10. zeb
    zeb WRInaute accro
    Inscrit:
    5 Décembre 2004
    Messages:
    12 187
    J'aime reçus:
    1
    pas besoin de se prendre la tête avec un truc aussi tordu pour arriver là sur un serveur.
    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).
     
  11. zeb
    zeb WRInaute accro
    Inscrit:
    5 Décembre 2004
    Messages:
    12 187
    J'aime reçus:
    1
    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:
     
  12. freestyle83
    freestyle83 WRInaute occasionnel
    Inscrit:
    19 Novembre 2011
    Messages:
    402
    J'aime reçus:
    16
    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.
     
  13. loubet
    loubet WRInaute impliqué
    Inscrit:
    19 Février 2003
    Messages:
    792
    J'aime reçus:
    0
    ne pas oublier non plus, que l'on peut désactiver son javascript, en plus de modifier la valeur de MAX_FILE_SIZE
     
Chargement...
Similar Threads - Chargement ajax long Forum Date
vitesse de chargement d'un site web Développement d'un site Web ou d'une appli mobile 9 Février 2021
Chargement composants par JS (fetch) - indexation dans Google Crawl et indexation Google, sitemaps 9 Octobre 2020
Search Console Problèmes chargements images Crawl et indexation Google, sitemaps 3 Septembre 2020
WordPress optimisation des temps de chargements Débuter en référencement 28 Juin 2020
Vitesse du site, temps de chargement etc Débuter en référencement 18 Février 2020
Chargement des pages, ton site tu optimiseras Référencement Google 27 Décembre 2019
Chrome va identifier les sites dont le chargement est lent Référencement Google 13 Novembre 2019
Test d'optimisation mobile : Problèmes de chargement de la page Débuter en référencement 10 Novembre 2019
KPI Temps de chargement moyen de la page Google Analytics Google Analytics 15 Octobre 2019
Search Console Temps de téléchargement d'une page Crawl et indexation Google, sitemaps 26 Août 2019