Project

General

Profile

Anomalie #4574

Authentification AJAX non fonctionnelle lorsque mode parano actif

Added by Guillaume Fahrner 6 months ago. Updated about 2 months ago.

Status:
Fermé
Priority:
Normal
Assignee:
-
Category:
-
Target version:
Start date:
10/15/2020
Due date:
% Done:

0%

Resolution:
fixed
Navigateur:

Description

L'activation du mode parano casse l'authentification via AJAX, le JSON retourné par la page informer_auteur.html n'est plus valide : erreur javascript lors du parsing JSON -> hash calculé faux -> erreur de login

Une surcharge vide de formulaires/inc-logo_auteur.html permet de contourner ce problème (le logo n’apparaîtra plus bien évidemment).

Une autre solution (plus propre, sûr ?) consiste à désactiver les traitement de sécurité globaux dans informer_auteur.html en utilisant ** :

[(#DATE**|informer_auteur)]

Il faut par contre modifier la fonction informer_auteur() pour filtrer var_login avant de le retourner :

function informer_auteur($bof) {
    include_spip('inc/json');
    include_spip('formulaires/login');
    include_spip('inc/auth');
    $login = strval(_request('var_login'));
    $row = auth_informer_login($login);
    if ($row and is_array($row) and isset($row['id_auteur'])) {
        unset($row['id_auteur']);
    } else {
        $row['login'] = safehtml($login);
    }

    return json_export($row);
}

SPIP 3.2.8 à jour

History

#1 Updated by cedric - 2 months ago

  • Target version set to 3.3

il me semble pas que passer safehtml sur le login soit safe, ça va casser possiblement des logins et empecher de se loger, non?
Bref à creuser, mais pas forcément si simple...

#2 Updated by cedric - about 2 months ago

je rebondis là dessus car je me suis posé la question sur #4167 mais qu'est ce que tu appelles le mode parano ?
Pour moi c'est la config $GLOBALS['filtrer_javascript']=-1 mais pour le coup ça change uniquement dans l'espace privé par rapport au réglage par défaut, et rien dans l'espace public.

Donc comment est-ce que ça casserait l'authentification ajax ? Ce serait pas plutôt, au hasard, ton plugin htmlpurifier qui du coup intervient partout dans ce mode de fonctionnement, et ça en effet on le supporte pas du tout (et surtout il faudrait l'expliquer plus clairement dans les tickets cas là on cherche à côté de la plaque...)

#3 Updated by Guillaume Fahrner about 2 months ago

  • Status changed from Nouveau to Fermé

cedric - a écrit :

je rebondis là dessus car je me suis posé la question sur #4167 mais qu'est ce que tu appelles le mode parano ?
Pour moi c'est la config $GLOBALS['filtrer_javascript']=-1 mais pour le coup ça change uniquement dans l'espace privé par rapport au réglage par défaut, et rien dans l'espace public.

Oui on parle bien de la même chose. Je viens de tester sans htmlpurifier (mode parano actif) je n'ai plus le problème, le JSON retourné par informer_auteur est correctement formaté. Du coup pardon pour le bruit, je vais essayer de plus reproduire.

Par contre, le mode parano est cassé en l'état, si je me souviens bien :

- on ne peut pas utiliser < code > a cause du fonctionnement de propre() (surchargé dans le plugin),
- les wheels anti_xss par défaut sont trop permissives (blacklist) (surchargé avec une whitelist)

Le plugin htmlpurifier n'arrive dans ce cas pas à s'en sortir car la page retourne du JSON incluant un bout de HTML, il normalise le HTML du logo et casse le JSON :

{"login":"webmestre","cnx":"0","logo":"<img class='spip_logo spip_logos' alt=\"\" src=\"local\/cache-gd2\/8d\/51dd4485e534b88a2091ec6a124b0f.jpg?1613643312\" width='48' height='48' \/>","alea_actuel":"1445264374602e37ef7e3fa7.71246900","alea_futur":"220460295602e3e095fec53.44583686"}

devient
{"login":"webmestre","cnx":"0","logo":"<img class="spip_logo spip_logos" alt="\&quot;\&quot;" src="%5C" width="48" height="48">","alea_actuel":"64897279602e37aec43e89.49510242","alea_futur":"1445264374602e37ef7e3fa7.71246900"}

#4 Updated by b b about 2 months ago

  • Resolution set to invalid

#5 Updated by Guillaume Fahrner about 2 months ago

L'utilisation des constantes suivantes permet de rendre l'export JSON "plus robuste" dans informer_login.html :

JSON_HEX_TAG : Tous les caractères < et > sont convertis en séquences \u003C et \u003E. Disponible à partir de PHP 5.3.0.
JSON_HEX_AMP : Tous les caractères & sont convertis en \u0026. Disponible à partir de PHP 5.3.0.
JSON_HEX_APOS : Tous les guillemets ' sont convertis en \u0027. Disponible à partir de PHP 5.3.0.
JSON_HEX_QUOT : Tous les guillemets doubles " sont convertis en \u0022. Disponible à partir de PHP 5.3.0.

Dans informer_auteur() peut on imaginer remplacer le call a json_export() par
return json_encode($row, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP);

? Avec cette adaption cela fonctionne sans/avec htmlPurifier.

(si je me demande comment faire vraiment propre, il faudrait ama uniquement transmettre l URL du logo et pas le HTML, puis construire l'img coté JS)

#6 Updated by cedric - about 2 months ago

  • Resolution changed from invalid to fixed

Also available in: Atom PDF