|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Expert Confirmé
![]() Olivier Développeur Web Inscription : août 2003 Messages : 1 837 ![]() |
Bonjour à tous,
J'ai une classe me permettant de générer des "token" pour sécurisé divers appel à des formulaire ou des appels ajax. Je n'avais jusqu'à maintenant jamais eu de problème. Or je viens de tester la classe sur un hébergement mutualisé et là c'est le drame ! Le concept : On arrive sur un formulaire , un token est généré, stocké en session puis plaer dans un input hidden. Après soumission du formulaire , je vérifie si le token en session est équivalent à celui passé dans le formulaire. Le problème : La valeur en session est modifiée entre le clic sur le bouton d'envoi et l'apparition de la page du coup le token n'est jamais le bon. J'ai retourné le code dans tous les sens mais rien à faire. Un petit exemple simplifié ou je rencontre le problème : Token.class.php Code :
Code :
Note : En local je n'ai pas de problème avec ce code... |
||||
|
00
|
|
|
#2 |
|
Expert Confirmé
![]() Inscription : janvier 2010 Messages : 2 706 ![]() |
Salut
D'abord, je n'est pas de solution, je ne vois pas trop la raison ![]() Ca commence mal Est ce que code que tu donne est un code simplifié de ce que tu as où est-ce réellement ce code que tu as ? Il y a un truc où il me semble intéressant de confirmer, c'est est ce que lors de la création du token et de son affichage dans le champ caché les dates sont vraiment identiques ? Ce qui laisserait supposer que ce serait vraiment lors de la récupération de celui-ci qui cause problème (le session_start). Après ça, une idée comme ça pour débugger (donc provisoirement), il n'y aurait il pas moyen de rajouter un code dans la méthode genToken() qui écrirait dans un fichier par exemple afin de savoir l'heure exacte de chaque appel, mais surtout savoir combien de fois il y a eu d'appel. Sait on jamais, cette méthode est peut être appelée 2 fois soit à une intervalle d'une seconde (qui modifierait sa valeur). Un simple appel à error_log('une date') suffirait dans un tel cas. Disons que, il serait bon d'avoir la certitude que c'est lors de l'appel à session_start() où le décalage à lieu. Si décalage il y a, donc qu'au départ c'est bon puis après c'est plus bon, il y a forcément "écrasement" de cette valeur à un moment donné, non ? (faut même souhaité que ce soit le cas, sinon c'est THE big bug, la grosse tuile même Je me dis que dans tel cas, il faudrait repérer qui modifie cette variable "token" de session, voir la session elle même (le fichier). Je me suis jamais trop posé ce genre de question, mais il y a t-il quelque part une trace (un log) de tout accès à un fichier, surtout s'il est modifié, comme entre autre les fichiers de sessions ? (Apache, Php, etc ... ?) Puis à 200% au pif : As tu essayé de changer les valeurs des clés (csrf_protect, token) ? Plutôt surprenant ce décalage, et particulièrement que ça marche en local et pas sur un mutualisé.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20 Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra] |
|
|
00
|
|
|
#3 | |||||||||
|
Expert Confirmé
![]() Olivier Développeur Web Inscription : août 2003 Messages : 1 837 ![]() |
Citation:
Comme tu le préconisais j'ai fait un trace dans un fichier texte. Code utilisé : Token.class.php Code :
Code :
En local et sur un dédié (Php 5.3.3) Mon fichier texte contient bien le résultat attendu : Citation:
Citation:
J'avoue ne pas comprendre. Edit --- Testé sur un mutu 1and1 et le problème est présent également. LA seule différence entre les mutu et mon poste locale/serveur dédié c'est l'os (Linux pour les mutu , windows pour les dédiés) Edit2 ---- Même le code suivant : Code :
|
|||||||||
|
00
|
|
|
#4 |
|
Expert Confirmé
![]() Inscription : janvier 2010 Messages : 2 706 ![]() |
C'est clairement bizarre.
![]() Il y un truc où je n'ai pas de réel explication, mais cette condition me chiffonne un peu : C'est peut être pas du tout le problème, mais pour exemple, de mon coté j'ai plutôt créé une méthode Session::isStarted() (true/false) qui me permets de vérifier si la session a bien démarrée. Aussi, tu avais évoqué Ajax dans ton 1er post. Du coup, n'y aurait il pas justement une vérification via Ajax des données saisie du formulaire, qui théoriquement initialiserait/démarrerait la session ? Si tel est le cas, il y a peut être quelque chose de particulier (Ajax c'est déjà particulier). Puis coté traçage (vu que je patauge aussi sur ce problème), personnellement je ferais en sorte d'y rajouter le nom de la page qui appel le script. Histoire d'être certain que c'est cette page (ou vue) formulaire. As tu relevé les logs coté Apache ? N'y aurait il pas des requêtes HTTP envoyées comme ça anormalement ? Vu que ça à l'air une question de version de Php, comme ça je me dis qu'il doit avoir une erreur pour cette version et pas sur celle en local. Cette erreur provoquerait donc ces 2 appels de trop. Mais alors quoi ??? Juste comme ça, je ne vois nulle par l'initialisation/déclaration de cette variable .ttl. Théoriquement ça devrait provoquer une erreur, non ? Je sais que ça n'a rien avoir, mais comme d'hab, sait on jamais. Toujours pas de solution, j'en sais fichetre rien
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20 Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra] |
|
|
00
|
|
|
#5 |
|
Expert Confirmé
![]() Inscription : janvier 2010 Messages : 2 706 ![]() |
Tiens donc ?
Ca me rappel quelque chose ça. L'URL est elle vraiment comme ça : index.php Essai de plutôt mettre comme ceci : /index.php, ou mettre une URL absolue complète. Je n'entrerais pas dans les détails, mais j'ai eu un bug franchement tordu (et bien prise de tête) en exploitant justement des URLs comme ça (index.php) alors qu'en mettant le slash avant, plus du tout de problème. Même crédo, sait on jamais.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20 Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra] |
|
|
00
|
|
|
#6 | ||||||
|
Expert Confirmé
![]() Olivier Développeur Web Inscription : août 2003 Messages : 1 837 ![]() |
Citation:
Citation:
Citation:
Citation:
Si jamais certains peuvent tester ce simple bout de code et vérifié qu'il ne produit pas 3 lignes mais bien une seule : Code :
|
||||||
|
00
|
|
|
#7 |
|
Expert Confirmé
![]() Olivier Développeur Web Inscription : août 2003 Messages : 1 837 ![]() |
HA !
Je viens de trouver. C'est Chrome qui pose problème. Avec IE et firefox aucun problème , le formulaire n'est soumis qu'une seule fois mais avec Chrome rien ne va plus et j'ai 3 soumissions. Reste à comprendre pourquoi c'est le cas en ligne et pas en local ... |
|
00
|
|
|
#8 | |||
|
Expert Confirmé
![]() Inscription : janvier 2010 Messages : 2 706 ![]() |
Citation:
Rien d'anormal, donc 1 seule soumission aussi bien sur FF que sur Chrome (8.0). Je n'ai pas la possibilité de faire des test sur un serveur distant, pour la bonne raison que je n'ai plus rien depuis 3 mois. ![]() Mais c'est pour mieux repartir. (mais tout ça n'a rien avoir Bref, je ne vois toujours pas la source de ton problème. Le seul truc, disons selon ma logique, si le problème se remarque selon le type de navigateur, c'est qu'à mon sens c'est lié au code HTML. Certains navigateurs anticiperaient une erreur (la corrigerait en gros) alors que d'autres ça les déboussolent, ce qui peu expliquer les requêtes HTTP successives. Ce qui m'interpelle, m'intrigue, c'est le nombre. Pourquoi 2 autres inutiles, pourquoi pas 4, 5, voir 10 autres ? Ce nombre de 2 serait forcément lié à des éléments dans cette page, ne crois tu pas ? Du coup, et en suivant cette logique, je vois ces 2 éléments là : Code :
D'ailleurs, le doctype est HTML4, et non du HTML4 transitional,. Le HTML4 ne serait il pas plus restrictif que du transitionnal ? Puis Chrome étant assez récent comme navigateur, peut être n'apprécie il pas ce doctype, va savoir. M'enfin, tout ça n'a peut être aucun rapport, c'est vraiment 100% au pif, d'autant plus que je ne suis pas parvenu à reproduire le phénomène. Disons que j'essaie de comprendre aussi. Il y a un autre truc quand même, c'est que la page n'a pas de <title>UN TITRE</title> Même crédo, au pif. Dernier point. As tu essayé de voir avec le plugin FireBug sur FF pour voir d'un peu plus près ce problème. Ca va peut être fournir une indication, une piste. Pour mon problème, ce plugin m'a bien aidé à le comprendre.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20 Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra] |
|||
|
|
00
|
|
|
#9 |
|
Expert Confirmé
![]() Olivier Développeur Web Inscription : août 2003 Messages : 1 837 ![]() |
Ca n'a plus grand chose à voir avec du php mais je détail un peu
J'ai investigué un peu et en partant d'une page web basique (en gros la structure de base avec un texte dans la balise body ). Aussi bien en Chrome 8 qu'en 9 j'ai un double appel de la page. Un premier tout à fait normal et un second fait apparemment en ajax. Dans mes messages précédents le 3ème appel était du au clic sur le bouton. Bref pour le moment pas réellement d'explication j'ai un autre pc avecun Chrome 6 qui n'a pas de problème mais la config matériel/ logiciel n'étant pas la même je peux pas déduire d'ou viens le problème. Pour ceux que ca intéresse ou qui on le même problème j'ai ouvert un ticke tde bug pour chromium : http://code.google.com/p/chromium/is...etail?id=69869 avec les extraits des entête http ainsi qu'une capture d'écran des requête réseau |
|
00
|
|
|
#10 |
|
Membre éprouvé
![]() Inscription : décembre 2005 Messages : 818 ![]() |
Salut Grunk,
Ce n'est pas lié à chrome, j'ai exactement le même problème sous FF, hors j'ai procédé à tous les tests possibles et inimaginable et je suis à 100% certains que ma méthode de création de session est bonne! Pas d'ajax, pas de double appel de page, tout semble normal et pourtant la session change alors qu'elle ne devrait pas! As-tu trouvé une explication finalement? |
|
00
|
|
|
#11 |
|
Membre éprouvé
![]() Inscription : décembre 2005 Messages : 818 ![]() |
Je peux également dire que la théorie des balises mal fermées, etc est à exclure car ma page est valide XHTML Strict et aucune erreur.
Pourtant l'erreur de token persiste... |
|
00
|
|
|
#12 |
|
Expert Confirmé
![]() Olivier Développeur Web Inscription : août 2003 Messages : 1 837 ![]() |
Non pas plus d'explication mais comme le problème ne semblait se produire que sur un hébergement particulier (1&1 de mémoire) j'ai fini par me dire que ça venait de là ... mais encore une fois ce n'est que supposition.
|
|
00
|
|
|
#13 |
|
Membre éprouvé
![]() Inscription : décembre 2005 Messages : 818 ![]() |
Il y a une explication, le tout c'est de la trouver...
|
|
00
|
|
|
#14 |
|
Membre éprouvé
![]() Inscription : décembre 2005 Messages : 818 ![]() |
Il n'y a pas un expert PHP susceptible d'apporter une solution à cette intrigant problème?
|
|
00
|
|
|
#15 | ||||
|
Membre éprouvé
![]() Inscription : décembre 2005 Messages : 818 ![]() |
Bon ça y est j'ai trouvé une demi heure de temps pour me pencher sur le problème.
Comme je ne savais pas d'où venait le problème, j'ai d'abord tester pour voir si il y avait des appels HTTP multiples à ma page via le script PHP suivant: Code :
Ce que j'ai fait, j'ai pris mon courage a deux mains et placé au début du fichier en parcourant petit à petit les profondeurs des includes jusqu'à ce que le code PHP ci-dessus m'écrive à la racine 2 fichiers, signe d'un bug... Et bien j'ai trouvé le bug! Vous saviez ce que c'était? Un appel à un fichier js qui n'était plus présent sur le répertoire du genre: Code :
Pourquoi ça fait ça? Je ne sais pas le dire! Mais c'est bien l'erreur produite! En espérant que ça en aide plus d'un!
|
||||
|
00
|
|
|
#16 |
|
Expert Confirmé
![]() Olivier Développeur Web Inscription : août 2003 Messages : 1 837 ![]() |
Bien vu !
|
|
00
|
Copyright © 2000-2012 - www.developpez.com