tontof / kriss_feed

A simple and smart (or stupid) feed reader
281 stars 53 forks source link

Jeton de sécurité invalide - Wrong token [+/-RESOLU] #385

Closed Draleg closed 7 years ago

Draleg commented 7 years ago

Bonjour,

J'ai voulu installer KrissFeed pour son aspect sans DB, je télécharge le fichier index.php, je vérifie les dépenses(apt-get): install php-xml install php-mbstring install php-curl Les droits d'accès sont corrects, cependant j'ai un problème lorsque je veux créer mon utilisateur, j'ai quelque soit le login/mdp/langue une erreur de jeton.

Je dispose d'un pluxml/shaarli et je n'ai pas constaté de problème liée aux sessions comme j'ai pu le lire dans un post précédent.

Pour info j'ai effacé mes sessions sauvegardées, je suis rentré consécutivement sur mon blog/shaarli, ce qui m'a donné deux sessions. Je suis passer sur KrissFeed et la j'ai eu 9 sessions supplémentaires de créées, donc l'accès au chemin et les droits d'écritures sont correctes.

D'où peut provenir ce problème ?

D'avance merci, bonne journée.


ENGLISH VERSION (thank's google)

Hello,

I wanted to install KrissFeed because there is no DB, I download the file index.php, I check the dependency (apt-get): Install php-xml Install php-mbstring Install php-curl The access rights are corrects, however I have a problem when I want to create my user, I have either login / pass / language a token error.

I have a pluxml / shaarli and I have not noticed a problem related to the sessions like I saw in a previous post.

Just to know, I deleted my saved sessions, I came back consecutively on my blog / shaarli, which gave me two sessions. I'm going on KrissFeed and I had 9 extra sessions created, so access to the path and write permissions are correct.

Where can this problem come from?

Thank's in advance, have a nice day.

tontof commented 7 years ago

As-tu la possibilité de voir les logs associés à php pour voir s'il y a une erreur ? Je pense que le problème de jeton ne peut-être lié qu'à la perte d'identification (avec le cookie) entre ton navigateur et le serveur. As-tu essayé sur plusieurs navigateurs ? Passes-tu par un proxy ?

Draleg commented 7 years ago

J'ai bien essayé plusieurs navigateurs, mais le problème était toujours le même. J'étais au travail et la je passe par un proxy.

Du coup en rentrant chez moi et j'ai pu constater que mon temps de midi à tester n'a servi à rien et que tu as raison concernant l'hypothèse du proxy, car ici tout fonctionne aux petits oignons !

Merci.

Draleg commented 7 years ago

Et de retour au boulot, impossible de se connecter... je vais devoir passer en 3G pour actualiser mes flux :'(

tontof commented 7 years ago

Est-ce que tu peux essayer d'ajouter un '?view=expanded' ou '?view=list' à la fin de l'url quand tu accèdes à la page principale avant de te connecter. J'avais un soucis avec un proxy et une instance shaarli que j'arrivais à contourner en ajoutant un '?' à la fin de l'url.

Draleg commented 7 years ago

J'applique le ?view=expanded ou ?view=list , je constate le changement par apport à l'url sans le paramètre donc ok pour ça. Mais lorsque je me connecte toujours bad token...

Mes connaissances en programmation date de l'époque de scolaire, je vais donc proposer et non pouvoir résoudre :'( ... tu as utiliser un mécanisme de protection de vol de session sur un fingerprint spécifique qui ferait qu'au niveau de la transition des paquets j'ai une perte ce qui suggèrerais un vol de session ?

De toute facon c'est au boulot que ça coince... quelque chose doit être mal configuré... J'ai essayé une session sur TOR lol... mais ça n'a pas résolu le problème (qui ne tente rien n'a rien)...

tontof commented 7 years ago

Il y a effectivement une option pour le vol de session. Il faut modifier le fichier data/config.php à la fin, il devrait y avoir

$this->disableSessionProtection = '0';

à remplacer par

$this->disableSessionProtection = '1';
Draleg commented 7 years ago

Je vais voir ça, mais ça m'ennuie de désactiver une protection :'( ... Au delà de ça me serait-il possible via le serveur même en ssh de lancer une commande qui lance un all-update ou de créer une page qui génère la requête ?

tontof commented 7 years ago

Oui bien sûr, mais il te faut pouvoir accéder à ta page de configuration pour avoir le hash qui te permettra de mettre à jour par une url, du style https://url/kriss_feed/?update&cron=123456789abcdef

Tu peux juste essayer de désactiver temporairement l'option pour voir si ça vient effectivement de ça ?

Draleg commented 7 years ago

Bien sur c'est ce que je faisais ;-).

Mais pas de changement ...

Draleg commented 7 years ago

Alors la je sèche... en 3G même erreur ... J'ai alors cru à la redirection no-ip... Je suis passé directement via l'ip mais même erreur. La seule nuance qui reste c'est ma redirection de port qui n'est présente qu'à partir d'une connexion externe...

Draleg commented 7 years ago

L'idée du hash me tente bien mais vu que je n'ai pas accès, ce dernier est-il dans le fichier data/config.php ? car la j'en vois deux.

Draleg commented 7 years ago

Bon tout est contourné par une connexion SSH sur mon serveur, une petite navigation via lynx et un chargement des flux lolll...

tontof commented 7 years ago

Est-ce que tout fonctionne avec pluxml/shaarli de la même façon redirection/port ? Pour le hash, c'est un sha1 de la concaténation des 2 hash de config.

sha1($salt.$hash)
tontof commented 7 years ago

Et si dans le fichier index.php tu modifies la fonction getUrl

public static function getUrl() {
  return "url + port";
...
}
Draleg commented 7 years ago

Je teste ça ;-)

tontof commented 7 years ago

D'ailleurs tu dois pouvoir le vérifier facilement en regardant le code source du code html

<base href="...">
tontof commented 7 years ago

Oups mauvaise manip

Draleg commented 7 years ago

Alors je trouve bien la fonction public

static function getUrl() {

Tu as plusieurs initialisations de variables dedans, j'enlève le tout pour mettre tel que tu le propose ?

tontof commented 7 years ago

non tu laisses tout, juste tu ajoutes le return au tout début de la fonction pour qu'elle retourne la bonne url (si jamais ça vient de ça)

Draleg commented 7 years ago

Je n'avais pas vu le post de vérification <base href=" Je confirme que l'url et port sont ok, sans toucher à la fonction.

tontof commented 7 years ago

le http(s) aussi ? parce que sur ce post https://github.com/tontof/kriss_feed/issues/241 ça semblait venir de là. D'ailleurs le problème avait été résolu en ajoutant

$GLOBALS['BASE_URL'] = 'http://yoururl/kriss/feed/path';

dans un fichier de plugin

Draleg commented 7 years ago

Alors première modification proposée du public static function getUrl() { return "http://yoururl/kriss/feed/path:port" ... } Je test, page blanche alors que l'url et le port sont bon. Par curiosité, je test l'autre option en l'initialisant à la place du return donc public static function getUrl() { $GLOBALS['BASE_URL'] = 'http://yoururl/kriss/feed/path:port'; ... } La je n'ai plus le message bad token mais je retombe sur la page de login (sans être loguer j'ai vérifier en retournant à la racine).

tontof commented 7 years ago

oups pour le premier test, c'est peut-être parce qu'il manquait le ';' à la fin de la ligne (je l'avais oublié) pour le 2è normalement cette ligne il faut la mettre en haut du fichier index.php pas dans la fonction getUrl (mais normalement ça devrait marcher aussi dans la fonction)

Draleg commented 7 years ago

Honte à moi... j'ai refait ce premier test public static function getUrl() { return "http://yoururl/kriss/feed/path:port"; ... } Bad token.

Pour le second test si c'est comme je m'en souviens une variable globale si je la modifie la logiquement ça portée est bonne... mais si utilisée avant cette fonction alors ça posera problème.

Draleg commented 7 years ago

Pour contourner le problème au travail je me suis fait un raccourcis: ?update&cron=123456789abcdef et un autre ?read=all&cron=123456789abcdef

Les deux ont été.

tontof commented 7 years ago

Euh ? mais du coup tu les lis comment ? C'est vraiment bizarre, il faudrait pouvoir approfondir en affichant des var_dump($_SERVER) et var_dump($_SESSION) parce que là je ne comprends pas trop pourquoi il perd les tokens. Tu n'as pas vu d'erreurs dans les logs PHP ?

Draleg commented 7 years ago

Non justement aucune erreur... J'ai même parsé par acquis de conscience tout le /var/log avec un grep et en string kriss,feed,token (c'est aller à la pêche mais bon...) aucun résultat sauf des get 200 dans l'acces_log ... Moi pas de problème pour ces deux affichage mais je dois le faire sur une session en cours je rajoute ça à la fin d'index.php peut-être ?

Draleg commented 7 years ago

Maintenant je pense savoir où est le problème... Il faut savoir que mon port_forwarding renvois d'un port X venant de l'extérieure vers un port Y dans mon réseau local. C'est juste pour moi une forme de sécurité que le port ouvert ne soit pas le port direct d'écoute dans mon LAN. A mon avis c'est la que ça pose problème.

tontof commented 7 years ago

Dans un premier temps si tu ajoutes après session_start();

                      var_dump($_SESSION);
                      var_dump(session_id());

normalement tu devrais voir les tokens s'ajouter à chaque fois que tu actualises la page Il faut vérifier que le session_id() ne change pas.

De mon côté, ça donne quelque chose comme

array(7) {
  ["view"]=>
  string(8) "expanded"
  ["listFeeds"]=>
  string(4) "show"
  ["filter"]=>
  string(6) "unread"
  ["order"]=>
  string(10) "olderFirst"
  ["byPage"]=>
  string(1) "1"
  ["lang"]=>
  string(5) "en_US"
  ["tokens"]=>
  array(3) {
    int(1)
    ["8c47440faa2ae0588a620..."]=>
    int(1)
    ["95175f85a821b18a81698..."]=>
    int(1)
    ["9a13d77244aa3e58a11cf..."]=>
    int(1)
  }
}
string(32) "dc4eeb4d4e..."

Les sessions sont normalement gérées par PHP du coup, ce n'est pas sensé être grave que tu rediriges sur un autre port ?

Draleg commented 7 years ago

Logiquement non jsutement vu que c'est côté serveur, je n'ai jamais eu de problème avec le pluxml, le shaarli et avant le wordpress. Je fais le test.

Draleg commented 7 years ago

J'ai bien ajouté les deux lignes juste en dessous du session start. public static function init() ... session_start(); var_dump($_SESSION); var_dump(session_id()); ... Hors je n'a pas d'ajout mais une ligne qui change à chaque fois pour chaque actualisation sur la même page. Ici un exemple lors d'une tentative de connexion:

Oui je réagis tardivement sur ta question:

Euh ? mais du coup tu les lis comment ?

Je suis en mode d'usage hybride je n'ai plus le terme en tête... Le contenu est visible mais la modification n'est pas autorisée.

tontof commented 7 years ago

Bon ben on est sûr que c'est bien la session php qui ne fonctionne pas correctement...

Si tu ajoutes un session_start() au tout début du fichier index.php à la 2è ligne, juste après <?php

Draleg commented 7 years ago

Si je met le session_start(); au début de fichier index.php, résultat avec les deux fonctions: array(6) { ["view"]=> string(4) "list" ["listFeeds"]=> string(4) "show" ["filter"]=> string(6) "unread" ["order"]=> string(10) "newerFirst" ["byPage"]=> int(10) ["lang"]=> string(5) "en_US" } string(26) "8h5imm6drup27j...." Après actualisation l'id reste le même.

Je décide donc de me loguer... je rentre les bons identifiants et la retour à la page principale avec ceci: array(0) { } string(26) "8h5imm6drup27...." Mais je ne suis pas logué ...

tontof commented 7 years ago

Quand tu actualises tu n'as pas de variables tokens dans ton affichage qui apparaît ? (tu as bien réinitialisé entre chaque test que tu as fait ?)

Draleg commented 7 years ago

Quand tu actualises tu n'as pas de variables tokens dans ton affichage qui apparaît ?

Je précise que les deux fonctions de dump sont ajoutées en dessous du premier sessions_start() que j'ai ajouté. Non je n'ai pas de variables tokens.

(tu as bien réinitialisé entre chaque test que tu as fait ?)

Réinitialisé ? j'ai actualisé la page ça oui, veux-tu dire autre chose par réinitialisé?

tontof commented 7 years ago

Je voulais dire dans le fichier index.php quand tu faisais des tests tu reviens bien comme au début à chaque fois ?

tontof commented 7 years ago

Dans page de connexion si tu regardes le code source, t'as pas un truc qui ressemble à ça ?

<input type="hidden" name="token" value="09972fd368409b75...">
Draleg commented 7 years ago

Je voulais dire dans le fichier index.php quand tu faisais des tests tu reviens bien comme au début à chaque fois ?

Je confirme

Dans page de connexion si tu regardes le code source, t'as pas un truc qui ressemble à ça ?

<input type="hidden" name="token" value="d802be78f593c275da12a49f2e6e...">

Dump: array(7) { ["view"]=> string(4) "list" ["listFeeds"]=> string(4) "show" ["filter"]=> string(6) "unread" ["order"]=> string(10) "newerFirst" ["byPage"]=> int(10) ["lang"]=> string(5) "en_US" ["tokens"]=> array(1) { ["d5e1b7ac1947c21ec08858ff130cfcd10f765065"]=> int(1) } } string(26) "8h5imm6drup27j166hnk..."

Les deux sont différents est-ce normal ?

tontof commented 7 years ago

oui je pense que c'est normal et si tu actualises une autre fois, celui en cours devrait apparaître. (parce que l'ajout du token se fait après l'affichage) Mais du coup ça semble fonctionner. Je ne comprends pas pourquoi ça te vide la session quand tu te connectes. Est-ce que tu peux retester en désactivant le vol de session https://github.com/tontof/kriss_feed/issues/385#issuecomment-305700913 Tu as peut-être 2 problèmes différents

tontof commented 7 years ago

Dans les différences que j'ai vu avec shaarli sur la connexion, il y a

session_set_cookie_params($lifetime, $path, $domain, $secure);

J'ai ajouté le $secure, il faudrait voir si en enlevant ça, ça fonctionne mieux ou pas

session_set_cookie_params($lifetime, $path, $domain);
Draleg commented 7 years ago

Page principale vol de session désactivée: Page principale: array(7) { ["view"]=> string(4) "list" ["listFeeds"]=> string(4) "show" ["filter"]=> string(6) "unread" ["order"]=> string(10) "newerFirst" ["byPage"]=> int(10) ["lang"]=> string(5) "en_US" ["tokens"]=> array(2) { ["d5e1b7ac1947c21ec08858ff130cfcd1....."]=> int(1) ["d802be78f593c275da12a49f2e6e53....."]=> int(1) } } string(26) "8h5imm6drup27j166....." Page de login: array(7) { ["view"]=> string(4) "list" ["listFeeds"]=> string(4) "show" ["filter"]=> string(6) "unread" ["order"]=> string(10) "newerFirst" ["byPage"]=> int(10) ["lang"]=> string(5) "en_US" ["tokens"]=> array(2) { ["d5e1b7ac1947c21ec08858ff130cfcd10f..."]=> int(1) ["d802be78f593c275da12a49f2e6e53f36..."]=> int(1) } } string(26) "8h5imm6drup27j166hn..."

Lors du login, plus de bad token, retour à la page principal et le dump: array(0) { } string(26) "8h5imm6drup27j166hnk...."

J'ai ajouté le $secure, il faudrait voir si en enlevant ça, ça fonctionne mieux ou pas

Je teste vais tester sur cette fonction

tontof commented 7 years ago

Euh c'est quoi pour toi la différence entre Page principale et Page de login ?

Il reste à tester sans le $secure du cookie, mais après, je n'ai plus trop d'idée...

Draleg commented 7 years ago

Euh c'est quoi pour toi la différence entre Page principale et Page de login ?

C'est la meme page index.php c'est juste que je passe sur la génération du formulaire de login via ?login. Ma formulation peut effectivement prêter à confusion.

Je repasse a "0" le vol de session. Je retire le $secure. Je vais sur la page principale(index.php): array(6) { ["view"]=> string(4) "list" ["listFeeds"]=> string(4) "show" ["filter"]=> string(6) "unread" ["order"]=> string(10) "newerFirst" ["byPage"]=> int(10) ["lang"]=> string(5) "en_US" } string(26) "8h5imm6drup27j166hn..."

Clic sur login(index.php?login): array(6) { ["view"]=> string(4) "list" ["listFeeds"]=> string(4) "show" ["filter"]=> string(6) "unread" ["order"]=> string(10) "newerFirst" ["byPage"]=> int(10) ["lang"]=> string(5) "en_US" } string(26) "8h5imm6drup27j166hnko...."

Tentative de login, retour sur l'affichage principale(index.php) mais je ne suis pas logué. array(0) { } string(26) "8h5imm6drup27j166hn...."

Draleg commented 7 years ago

Même résultat sur le même test mais en ayant désactiver le vol de session.

tontof commented 7 years ago

Oh punaise, je viens de comprendre que tu utilisais KrISS feed en mode protected ou public et pas private ! Je n'avais pas eu de réponse à « Euh ? mais du coup tu les lis comment ? » c'est pour ça que je ne comprenais pas. https://github.com/tontof/kriss_feed/issues/385#issuecomment-305712864

Tu as moyen simple de me donner un accès pour que je fasse des tests, parce que par messages interposés c'est pas évident ?

Il faudrait ajouter des var_dump un peu partout pour essayer de comprendre...

Draleg commented 7 years ago

Oh punaise, je viens de comprendre que tu utilisais KrISS feed en mode protected ou public et pas private !

J'ai bien répondu tardivement mais entre plusieurs réponses #385 (comment) ;-) (j'ai d'ailleurs du faire une recherche par texte pour retrouver ma réponse lol).

Pour l'accès malheureusement non ce n'est pas possible... c'est de l'auto-hébergement que je ne diffuse pas sur le net... rien de bien secret juste que j'aime ma tranquillité et avoir accès à ce que je veux tout le temps :-p . Mais je comprends totalement que par flux interposés c'est vraiment compliqué.

Vu que de l'intérieur de mon réseau tout fonctionne (même sous Lynx c'est pour dire!!) Je présume vraiment que cette perte de session provient du port forwarding qui est la seule nuance qui reste présente entre ma connexion 3G et ma connexion/proxy du boulot. Car j'ai exclu la redirection DNS en pointant directement sur l'IP...

tontof commented 7 years ago

Ah oui effectivement, mais comme la réponse était directement à la suite de la citation, ça apparaissait tout en gris et je n'avais pas fait attention.

Bref, je comprends pour l'accès, c'est logique. Mais du coup, je vais préparer un fichier test index.php avec différents affichages pour voir s'il y a moyen de comprendre plus rapidement.

tontof commented 7 years ago

Pendant que j'étais en train de préparer le fichier index test je suis tombé sur ça http://php.net/manual/en/function.session-regenerate-id.php Du coup tu peux essayer de mettre en commentaire la ligne

session_regenerate_id(true);
//session_regenerate_id(true);
tontof commented 7 years ago

Et puis pour un autre test si le précédent n'est pas concluant

session_set_cookie_params($lifetime, $path, $domain, $secure);
//session_set_cookie_params($lifetime, $path, $domain, $secure);

Parce qu'effectivement ça peut poser problème en fonction de l'ordre des appels http://php.net/manual/en/function.session-set-cookie-params.php

Draleg commented 7 years ago

Moon github n'a pas affiché les notitications... Désolé du délais!!

Alors je reprends, je laisse le start_session du début, je laisse les deux fonctions de dump. Dans un premier temps je commente le session_regenerate_id et je fais les mêmes tests que tout à l'heure.

Si négatif, je retest sans le regeneration d'id mais en commentant session_set_cookie_params, au boulot!

(Pour le moment j'ai contourné le problème en générant des taches cron qui lance un script avec lynx qui regénère le flux tout les X temps et qui va le vider tout les jours à 00h... car me taper une veille de plusieurs jours c'est moyen de toute facon...)