Bug de phpThumb seulement sous Firefox

lambi521

WRInaute passionné
Bonjour à tous,

J'ai identifié un bug de phpThumb qui arrive seulement si on navigue sous Firefox

Je n'ai pas trouvé de solution pour corriger cela et je ne sais pas de quoi ça vient, un peu d'aide serait la bienvenue

Voici la page de démo de phpThumb :
http://phpthumb.sourceforge.net/demo/demo/phpThumb.demo.demo.php

Si vous visitez cette page avec IE ou Chrome, normalement toutes les images s'affichent
Si vous la visitez avec Firefox, les images ayant le paramètre "fltr" s'affichent en erreur (ctrl F + fltr pour les trouver)

Note: Je suis sous FF 35.0.1 + windows 7
 

lambi521

WRInaute passionné
Donc ça viendrais de la nouvelle version de Firefox... Une idée pour corriger cela ? J'ai cherché sur le net mais personne n'en parle, pourtant phpThumb est très utilisé sur beaucoup de sites et de CMS

J'ai testé sous Safari et les images fonctionnent. Par contre avec Chrome sur une tablette Android, même erreur qu'avec FF 35.0.1 :(

Si il existe un autre système similaire à phpThumb je suis preneur... En plus je suis pas fan des URLs de phpThumb, on peut facilement retrouver l'image d'origine sans le watermark
 

loubet

WRInaute impliqué
possible que cela demande trop d'images au serveur en même temps, et le serveur est configuré pour renvoyer une erreur 403 pour éviter la surcharge. cela fonctionnerait donc avec un seul appel.
 

zeb

WRInaute accro
loubet a dit:
cela fonctionnerait donc avec un seul appel.
Vu la page remplie d'image et le temps de chargement c'est ce que je me suis dit aussi donc j'ai attendu que la page soit finie de charger, j'ai copié l'url d'une image plantée en mode debug et je l'ai collé dans un autre onglet.
Résultat nada même avec Ctrl + F5 plusieurs fois.
 

lambi521

WRInaute passionné
Non non ça marche très bien, j'ai affiché mes 7000 images sur une même page en PHP sous Chrome :lol:

Après avoir pas mal galéré j'ai isolé le problème : utilisation du filtre sous FF = image d'erreur (avec erreur 403 effectivement)

D'ailleurs ces erreurs 403 son répertoriées dans mon GWT, ce qui veut dire que GGbot a le même problème que FF

Autre chose étrange, ça marche impec avec Chrome sur PC mais pas sur Android...
 

lambi521

WRInaute passionné
Bien sûr Zeb :)

D'ailleurs en parlant de cache: Lors du 1er appel de l'image, phpThumb la génère et la met en cache dans un dossier sur le serveur. Etant donné que j'ai tout généré sous Chrome, toutes les images ont donc été mises en cache.

Dans ce cas, pourquoi lorsque je fais le même appel depuis FF, il essaye de me "re-générer" l'image (ce qui provoque l'erreur 403) plutôt que de me servir l'image déjà créée ?
 

Blount

WRInaute impliqué
Je pense que c'est un souci au niveau de la génération de la page qui liste toutes les images.
En examinant les adresses URL de FF 35 et FF 29, on voit une différence entre les deux :
Firefox 35 a dit:
http://phpthumb.sourceforge.net/demo/phpThumb.php?src=images/disk.jpg&w=300&fltr%5B%5D=wmi|images/watermark.png|BL&hash=72812f0bb6582d12c7c03ea9fcf32633
Firefox 29 a dit:
http://phpthumb.sourceforge.net/demo/phpThumb.php?src=images/disk.jpg&w=300&fltr[]=wmi|images/watermark.png|BL&hash=72812f0bb6582d12c7c03ea9fcf32633

On peut voir que sous Firefox 35, les crochets sont transformés en entité html.
Au niveau PHP, on ne récupère donc plus "fltr" sous forme de tableau.

D'un autre coté, dans FF 35 on voir bien l'entête passer correctement avec les [], ce qui annulerait mon analyse ^^

Ce qu'il faudrait surtout, c'est voir les logs au niveau serveur.
 

noren

WRInaute accro
Alors ce topic est intéressant car j'ai également détecté un problème avec les images et firefox mais qui date a mon avis depuis 1 ou 2 MAJ antérieurs et qui ne semble pas résolu.

Sur mon site je crée les thumbs a la volée en utilisant les fonctions GD (je ne sais pas si c’est le cas de phpThumb), si le thumb n'existe pas .Chose étrange firefox met un certain temps avant de m'afficher correctement les images nouvellement créées.
Un coup il les affiche, un coup non (pourtant dans le code html ca pointe bien vers le thumb et celui-ci existe bien), et il faut plusieurs refraiche avant que ça se stabilise et que l'image apparaisse bien et définitivement sur le site.

Je ne sais pas si le problème est lié mais c’est peut être une piste.
PS: j'ai évidemment vidé ma cache :wink: et testé avec chrome et IE (oui oui IE)
 

Blount

WRInaute impliqué
J'ai la flemme de chercher mais existe t-il un bout de code que je pourrai tester sur mon serveur ? Ce serait plus pratique pour regarder ce qu'il se passe.
 

lambi521

WRInaute passionné
Super les mecs, je ne suis plus seul :D

@Blount: Ta piste est TRES intéressante. Si ça se trouve, le nouvelle version de FF "encode" les crochets et du coup, le hash présent dans l'URL de l'image n'est plus bon, et donc phpThumb renvoie l'image d'erreur en 403. J'ai regardé quand était renvoyée l'erreur 403 dans le code, et c'est en cas d'erreur de hash ou d'image source inexistante (chemin incorrect etc). Du coup ça pourrait collé, je vais creuser !

@noren : Effectivement phpThumb fonctionne exactement de la même façon et utilise GD, j'ai même installé ImageMagick sur notre Apache pour que ce soit plus rapide. Ton problème ressemble plus à un problème de mémoire, image source trop grande, serveur trop faible :?: Ou alors ton cache est plein ou mal paramétré ? Avec phpThumb, j'ai un fichier de config où je peux mettre une taille d'image max pour empêcher que le serveur plante, car le traitement d'image à la volée consomme bcp de mémoire. J'ai également des fonctions pour paramétrer le cache en fonction de l'espace disque, du nombre d'images etc...
 

noren

WRInaute accro
@lambi521 : Les images que je redimensionne font rarement plus de 100ko à la base et environ 20-30 ko une fois redimensionnée. même lorsque je redimensionne une seule image j'ai ce soucis, et il est présent qu'avec firefox.
Pour la cache j'ai essayé en la vidant complètement. Je ne fais (ferais) pas plus de 4-5 redimensionnements par jour, donc a la base rien d'impressionnant et d'insurmontable pour n'importe quel serveur et pour la cache. Je suis pour le moment en local avec une très bonne machine :wink:
Pour moi c’est un réel mystère d'autant plus que ça touche que Firefox.Possible qu'il n'y ai aucun lien avec ton problème, mais ces 2 problèmes avec les images redimensionnées et firefox sont quand même étonnant.
 

zeb

WRInaute accro
noren a dit:
Un coup il les affiche, un coup non (pourtant dans le code html ca pointe bien vers le thumb et celui-ci existe bien), et il faut plusieurs refraiche avant que ça se stabilise et que l'image apparaisse bien et définitivement sur le site.
Oui ça c'est normal et ça date de la nuit des temps j'ai aussi ce souci qui n'en est pas franchement un. Ce n'est pas lié a GD ou autre techno vu que je le constate avec un script de miniature perso qui utilise imagick direct depuis le shell.

Firefox se comporte comme si une ressource (image dans ce cas) non délivrée dans une temps "acceptable" est ignorée. Perso je génère les miniatures par 10 ou 15 et si le script répond pas tout de suite bah firefox ignore l'affichage. en revanche si "bouton de droite" je fais "actualiser l'image" ça passe elle apparait. si avant cela je regarde sur le serveur pour voir si la miniature a été créée je la vois bien a sa place.

Le truc c'est qu'avec le refresh si tu impose le rechargement des ressources elles finissent par arriver puisque une fois le cache généré, ou la miniature créée, le serveur met moins de temps a répondre.
 

noren

WRInaute accro
Merci pour ta réponse ça me rassure, après je verrais bien ce que ca donne en prod et si ça pose problème.
 

lambi521

WRInaute passionné
@Blount : J'ai regardé mes erreurs 403 dans GWT et les crochets sont encodés comme tu l'indiques. Pas de doute que l'erreur vienne de là.

Quand je regarde le code source de ma page sous FF, le lien vers l'image comporte bien les crochets non encodés. Mais si je fais clique droit + copier l'adresse du lien, et que je le colle dans la barre d'adresse (ou même dans un fichier texte), le lien a les crochets encodés "fltr%5B%5D=wmi".

Si je fais la même manip sous Chrome, les crochets sont affichés normalement fltr[]=wmi.

Bug identifié, reste plus qu'à le corriger... Une idée ?
 

zeb

WRInaute accro
Si le bug est produit par firefox tu n'as aucune chance de le corriger. Et même si tu l'identifiait sur les src de FF et que tu recompilais tu serait le seul a ne pas l'avoir.

Après quand on ne peut pas toucher au bub on peut peut être le contourner en récrivant ce type d'url ...
 

Blount

WRInaute impliqué
En fait, je ne pense pas que cela vienne des crochets.
En installant chez moi, je vois dans les 2 cas les mêmes données dans $_GET.

Par contre, chose intéressante, j'ai aussi le 403 en utilisant WGET.

J'ai été malade plusieurs jours, je n'ai donc pas pu y regarder plus sérieusement que ça.
 

Blount

WRInaute impliqué
Ça y est, j'ai percé le mystère. Comme quoi, quand on est en forme, ça change tout. J'ai trouvé en quelques minutes ^^
En fin de compte, ce sont bien les crochets les coupables.

Pour commencer, j'ai installé le tout sur ma machine, plus simple pour déboguer.
Ensuite, activation du mode debug dans phpThumb.config.php :
PHP:
<span class="syntaxdefault">$PHPTHUMB_CONFIG</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'disable_debug'</span><span class="syntaxkeyword">]</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> false</span><span class="syntaxkeyword">;</span><span class="syntaxdefault"> </span><span class="syntaxcomment">// ligne 42, passer de true à false          &nbsp;</span><span class="syntaxdefault"></span>

Ensuite, on se rend à l'URL de l'image qui plante. Dans mon cas, j'ai pris la #6.
Là, plein de truc s'affiche à l'écran. Pour Firefox 35, on a ceci :
Firefox 35 a dit:
ERROR: invalid hash in file "phpthumb.class.php" on line 4070
Au moins, ça confirme une erreur, car cette partie n'est pas présente dans Firefox 29.
Inutile d'aller à la ligne 4070, il n'y a rien à voir :D

Je fais par contre une recherche sur "ERROR: invalid hash" pour trouver l'origine de l'erreur. Résultat, il faut aller dans phpThumb.php à la ligne 205 :
PHP:
<span class="syntaxdefault"><br />if </span><span class="syntaxkeyword">(!empty(</span><span class="syntaxdefault">$phpThumb</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">config_high_security_enabled</span><span class="syntaxkeyword">))</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">{<br /></span><span class="syntaxdefault">    if </span><span class="syntaxkeyword">(empty(</span><span class="syntaxdefault">$_GET</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'hash'</span><span class="syntaxkeyword">]))</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">{<br /></span><span class="syntaxdefault">        $phpThumb</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">config_disable_debug </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> false</span><span class="syntaxkeyword">;</span><span class="syntaxdefault"> </span><span class="syntaxcomment">// otherwise error message won't print<br /></span><span class="syntaxdefault">        $phpThumb</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">ErrorImage</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'ERROR: missing hash'</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">    </span><span class="syntaxkeyword">}</span><span class="syntaxdefault"> elseif </span><span class="syntaxkeyword">(</span><span class="syntaxdefault">PasswordStrength</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$phpThumb</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">config_high_security_password</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span><span class="syntaxkeyword"><</span><span class="syntaxdefault"> 20</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">{<br /></span><span class="syntaxdefault">        $phpThumb</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">config_disable_debug </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> false</span><span class="syntaxkeyword">;</span><span class="syntaxdefault"> </span><span class="syntaxcomment">// otherwise error message won't print<br /></span><span class="syntaxdefault">        $phpThumb</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">ErrorImage</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'ERROR: $PHPTHUMB_CONFIG[high_security_password] is not complex enough'</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">    </span><span class="syntaxkeyword">}</span><span class="syntaxdefault"> elseif </span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$_GET</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'hash'</span><span class="syntaxkeyword">]</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">!=</span><span class="syntaxdefault"> md5</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">str_replace</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$phpThumb</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">config_high_security_url_separator</span><span class="syntaxkeyword">.</span><span class="syntaxstring">'hash='</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">$_GET</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'hash'</span><span class="syntaxkeyword">],</span><span class="syntaxdefault"> </span><span class="syntaxstring">''</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> urldecode</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$_SERVER</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'QUERY_STRING'</span><span class="syntaxkeyword">])).</span><span class="syntaxdefault">$phpThumb</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">config_high_security_password</span><span class="syntaxkeyword">))</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">{<br /></span><span class="syntaxdefault">        header</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'HTTP/1.0 403 Forbidden'</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">        sleep</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">10</span><span class="syntaxkeyword">);</span><span class="syntaxdefault"> </span><span class="syntaxcomment">// deliberate delay to discourage password-guessing<br /></span><span class="syntaxdefault">        $phpThumb</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">ErrorImage</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'ERROR: invalid hash'</span><span class="syntaxkeyword">);</span><span class="syntaxdefault"> </span><span class="syntaxcomment">// ELLE EST ICI LA LEVÉ D'ERREUR<br /></span><span class="syntaxdefault">    </span><span class="syntaxkeyword">}<br />}<br /></span><span class="syntaxdefault"> </span>
On voit aussi le sleep(10), je me demandai pourquoi l'affichage prenait autant de temps, je comprend …

On voit dans le 3ème IF un contrôle sur le HASH. L'erreur se trouve dans $_SERVER['QUERY_STRING'] qui contient les query string sous forme de chaîne de caractères (ex: truc=machin&bidule=1).
FF 35 indique les crochets encodés (%5B%5D) alors que FF 29 les passe sous leur forme normale ([]).
Contenu pour chaque version :
#FF 29
src=images/disk.jpg&w=300&fltr[]=wmi|images/watermark.png|BL&hash=3cf31984753e1d0f637a8df3787a061d

#FF 35
src=images/disk.jpg&w=300&fltr%5B%5D=wmi|images/watermark.png|BL&hash=3cf31984753e1d0f637a8df3787a061d

En mettant : urldecode($_SERVER['QUERY_STRING'])
L'erreur disparait et les images s'affichent ;)

L'autre "solution" est de mettre high_security_enabled à false, mais ce n'est pas conseillé d'après les commentaires du fichier config.

Par contre, dans $_GET, on retrouve les bonnes données, donc PHP sait traiter les deux formats.

Je ne sais pas qui est en tord dans cette histoire, mais j'ai eu le même souci avec WGET. Je pense qu'il faut ajouter urldecode dans phpThumb car $_SERVER['QUERY_STRING'] contient le format brut des paramètres d'URL, comme $_SERVER['REQUEST_URI'].
 

lambi521

WRInaute passionné
Blount, tu es mon sauveur !

J'étais en train de mettre en place un système d'URL rewriting pour ne pas avoir ces crochets, mais du coup j'ai mis en place ta solution et ça marche impec !

De plus, ça corrige un problème similaire que j'avais identifié : les images avec un espace dans le nom du fichier ne s'affichait pas. J'avais mis la fonction str_replace(' ', '%20', $src) pour corriger cela mais avec ta solution, plus besoin de le faire !

Merci beaucoup je n'y aurais pas pensé sans toi. Il faudrait reporté cette solution sur la contrib officielle
 

Discussions similaires

Haut