Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Problème avec MathJaX #1310

Closed
pierre-24 opened this issue Jul 28, 2014 · 40 comments
Closed

Problème avec MathJaX #1310

pierre-24 opened this issue Jul 28, 2014 · 40 comments
Labels
C-Back Concerne le back-end Django S-BUG Corrige un problème
Milestone

Comments

@pierre-24
Copy link
Member

MathJaX est l'outil qui permet à ZdS de donner un rendu correct aux formules mathématiques données par les membres. Récemment, sur un sujet qui a un peu dérapé, nous nous sommes rendu compte que MathJaX permetait l'usage de la commande \newcommand et surtout \renewcommand. Pour ceux qui ne connaissent pas LaTeX, il s'agit de commande pour en créer d'autre. La seconde est plus problématique, puisqu'elle permet de redéfinir des commandes internes à LaTeX lui-même.

Ce qui pose plusieurs problèmes

  • Ces commandes sont actives de posts en posts sur une même page. Ce qui signifie que si je (re)défini au début d'un topic une commande, je fous en l'air toute présentation mathématique sur la page
  • Pire encore (!), on peut placer ces commandes dans la signature. Ou comment planter durablement MathJaX un peu partout.
  • Par contre (!) ces commandes seraient très utiles dans le cadre d'un tutoriel mathématique, ce pourquoi avant une possibilité de suppression, je voudrait qu'on discute un peu de ça.

Je ne sais pas du tout ce que MathJaX propose comme option pour limiter ces comportements. Si on doit en arriver à une interdiction, ben ... Faudra bien.

@Eskimon Eskimon modified the milestone: Version 1.0 Jul 28, 2014
@SpaceFox SpaceFox added this to the Version 1.0 milestone Jul 29, 2014
@SpaceFox
Copy link
Contributor

  1. Quelles sont les implications exactes en terme de sécurité ?
  2. Quelles mesures peut-on prendre pour corriger tout ça ?

En fonction des réponses, on pourra prioriser la correction. En attendant les réponses sont à apporter le plus rapidement possible.

@Alex-D
Copy link
Contributor

Alex-D commented Jul 29, 2014

Quelles mesures peut-on prendre pour corriger tout ça ?

Il faudrait arriver à scoper MathJax par blocs (genre par message sur les forums, par tuto, etc) et je pense que le problème serait résolu. Seulement, j'ignore si c'est possible. Si cette solution est possible c'est du coup du front. Sinon c'est au back de filtrer les commandes pour les limiter.

@Eskimon
Copy link
Contributor

Eskimon commented Jul 29, 2014

Faudrait voir avec adri1 qui connait bien markdown

@pierre-24
Copy link
Member Author

Quelles sont les implications exactes en terme de sécurité ?

Dégommer le rendu math de toute une page donnée sur le forum si l'utilisateur place ce genre de chose dans sa signature et intervient tôt dans un topic (la définition prend usage après, et non rétro-activement). Un exemple tout con et qui parlera plus serait qu'un utilisateur pourrait remplacer tout les sin() par cos() sans l'ombre d'une trace, ce qui invalide tout développement mathématique ultérieur.

En ce qui concerne les solution, adri1 en avait proposé une à base de blocs qui enferment l'effet de ces commandes. Le problème, c'est que ça demande une évaluation sur à peu près tout les posts, et il est pas impossible de la contourner, à moins d'interdire les chaines de caractère suivantes :

  • \newcommand{\endgroup}
  • \renewcommand{\endgroup}
  • \def\endgroup

(et à mon avis j'en oublie)

... parce que MathJaX possède un défaut qui n'existe pas réelement en LaTeX, c'est qu'il est possible de redéfinir les commandes avec plus que \renewcommand.

La conclusion à laquelle ont en était arrivé, c'était que tant pis, il fallait désactiver ces commandes ... Ou bien instaurer cette histoire de bloc et être très vigilant sur le comportement de l'édition (signature comprise). Bref, beaucoup de choses pour rien.

@amorison
Copy link

Le problème avec les group, c'est aussi qu'il faut bêtement empêcher l'user de fermer un groupe, faire des définitions malicieuses et rouvrir un group.

Donc en gros, virer toute occurrence de \begingroup, \engroup dans les messages et englober chaque message dans un group. C'est malheureusement la seule solution de limiter le scope de Mathjax, j'ai l'impression.

Le plus simple reste donc effectivement d'empêcher purement et simplement toute définition. Il faut donc interdire la chargement automatique de newcommand.js et son chargement manuel via require.

Quelques infos:
http://docs.mathjax.org/en/latest/tex.html?highlight=newcommand#tex-and-latex-extensions
http://docs.mathjax.org/en/latest/options/Safe.html?highlight=newcommand

@pierre-24
Copy link
Member Author

Merci adri1, je l'aurais pas mieux dit.

[hs]Par contre, on peut en profiter pour activer le package mhchem, je serai le mec le plus heureux du monde, vraiment.[/hs]

@SpaceFox
Copy link
Contributor

OK, donc c'est bien du "v1.0"

@SpaceFox SpaceFox removed the Question label Jul 29, 2014
@Alex-D
Copy link
Contributor

Alex-D commented Jul 29, 2014

Pour le package mhchem, fais une issue séparée. C'est très facilement faisable et c'est pas lié aux bugs de cette issue.

@pierre-24
Copy link
Member Author

@amorison : j'ai tenter de corriger le tout avec la config suivante (en ayant chargé Safe, bien entendu)

        MathJax.Hub.Config({
            Safe: {
                allow: {
                    URLs: "safe",
                    classes: "safe",
                    cssIDs: "safe",
                    styles: "safe",
                    fontsize: "all",
                    require: "safe"
                },
                safeRequire: {
                      "autoload-all": false,
                      newcommand: false,
                }
            },
            tex2jax: {
                inlineMath: [['$', '$']],
                displayMath: [['$$','$$']],
                processEscapes: true,
            },
            TeX: { 
                extensions: [
                    "color.js", 
                    "cancel.js", 
                    "enclose.js", 
                    "bbox.js", 
                    "mathchoice.js",
                    "verb.js", 
                    "unicode.js", 
                    "autobold.js"
                ] 
            },
            messageStyle: "none",
        });

Rien n'y fait, je peux toujours employer \newcommand comme je veux --"

@amorison
Copy link

amorison commented Aug 6, 2014

Hmmm, bizarre. Là, comme ça, je vois pas ce qui manque. Je fouillerais ça demain.

@pierre-24
Copy link
Member Author

ceci dit, ça marche, je peux pas charger mhchem si j'ai interdit sont chargement dans safeRequire. À noter que je peux toujours employer \newcommand si je mets carrément require: "none" (mais alors, on peut plus rien charger)

@amorison
Copy link

amorison commented Aug 7, 2014

Je viens de fouiller la doc Mathjax, et la seule chose qui me semble possible, c'est qu'une des extensions qu'on charge utilise newcommand. Si tu mets aucune extension, est ce que tu peux toujours faire \newcommand ? Si oui, c'est quand même incompréhensible, il n'y a rien sur le web à ce sujet (ou je suis passé à côté).

@pierre-24
Copy link
Member Author

On est deux à être passé à coté. Si je ne charge aucune extension, je peux quand même faire un \newcommand. Je soupconne le chargement par défaut de MathJax ([...]/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML) de déjà charger des extentsions avec le TeX-AMS-machin-chose et tout ça, je vais essayer de voir si il n'y a pas moyen de s'en passer ...

@amorison
Copy link

amorison commented Aug 7, 2014

J'ai déjà regardé le code, il n'y a pas de chargement de newcommand, apparemment. M'enfin, sait on jamais... :-°

@pierre-24
Copy link
Member Author

Qui ne tente rien n'as rien ^^

@cgabard
Copy link
Contributor

cgabard commented Aug 7, 2014

Pour les signatures de toute façon mathjax va y être banni donc ça ne devrait pas poser de problèmes.

@pierre-24
Copy link
Member Author

@cgabard : tant mieux, ça enlevera déjà une épine du pied :)

@pierre-24
Copy link
Member Author

@amorison : j'ai été demander direct sur le google group de mathjax, il semblerait qu'il s'agisse d'un bug : https://groups.google.com/forum/#!topic/mathjax-users/tt7IsB538yU

@amorison
Copy link

amorison commented Aug 9, 2014

Ah d'accord. Bon, ben on se contentera de modérer en cas de problème, ça reste jouable.

@pierre-24
Copy link
Member Author

Ok. Pour l'issue, on considère comme réglé, ou on pousse ça plus loin pour y revenir d'ici quelques semaines/mois ?

(ping @SpaceFox )

@amorison
Copy link

amorison commented Aug 9, 2014

À la limite, ce qu'on peut faire, je pense, c'est garder quand même ces commandes (sans ébruiter leur existence of course) et se contenter de modérer les abus. Et on reviendra sur la décision si ça devient ingérable et que le problème est réglé côté Mathjax.

@SpaceFox
Copy link
Contributor

SpaceFox commented Aug 9, 2014

Je ne suis pas sûr de ce qui qui se passe ici en fait. Du coup je vais jouer au chef de projet noob en technique et demander à quelqu'un qui a suivi le ticket de répondre à ces deux questions :

  1. Quelles sont les implications exactes en terme de sécurité ?
  2. Quelles mesures peut-on prendre pour corriger tout ça ?

Ce serait absolument génial de votre part :)

@amorison
Copy link

  1. Si un mec redéfinit dans un message une commande très utilisée genre \frac pour la remplacer par un gros carré rouge, toutes les fractions suivantes sur la même page seront remplacées par un gros carré rouge. Donc il est très simple de bousiller le rendu MathJax en postant parmi les premiers messages.
  2. MathJax présente visiblement un bug empêchant de désactiver les commandes de définitions (c'est ce qu'a tenté Pierre). Il reste donc :
  • modérer en virant à la main les définitions (ça semble jouable tant qu'on a pas de boulets qui trouvent intelligents de poster partout) ;
  • attendre que le bug MathJax soit réglé pour désactiver la possibilité de définir des commandes (je connais pas la réactivité des dev du module) ;
  • englober chaque message dans un group (en virant les redéfinitions des commandes de groupes et ouvertures/fermetures de groupes dans les message), ce qui est le seul moyen de limiter le scope des redéfinitions, mais c'est juste super lourd pour le visiteur (et un peu délicat à mettre en place) ;
  • redéfinir dans la config de MathJax les commandes de définitions pour les rendre inoffensives (peut être ce qu'on a de mieux pour l'instant).

@pierre-24
Copy link
Member Author

  1. Dégommer l'affichage mathématique d'une page donnée d'un topic ou d'un tutoriel. La commande prend effet juste après son utilisation, ce qui était avant n'était pas impacté. Pour te donner un équivalent, c'est comme si quelqu'un venait à modifier la commande print de python pour qu'à chaque fois qu'on l'emplois par la suite, elle renvois 'bug'. C'est à peu près équivalent.
  2. Rien, en l'occurence, parce que du coup, on a débusqué un bug coté MathJaX qui empêchait d'empêcher l'utilisation de la commande incriminée. Donc pour le moment, du paliatif : empêcher mathjax dans les signature me semble un point très important, et modérer assez finement.

[je viens de me faire griller en puissance par aMorisson]

@amorison
Copy link

Je viens de me rappeler d'un point (que j'ai ajouté dans mon message du coup), on peut redéfinir les commandes de définitions dans la conf de MathJax. Il suffit de les remplacer par un petit texte humoristique, par exemple. Il faut donc redéfinir def, newcommand, renewcommand , newenvironment, renewenvironment, let.

http://docs.mathjax.org/en/latest/tex.html#defining-tex-macros

@pierre-24
Copy link
Member Author

Pas bête non plus. Je vais regarder si ça fout pas en l'air le chargement de packages éventuels, mais ça peut être une solution. Tant que je t'ai sous la main, une liste de paquets à interdire autre que ceux déjà interdit par Safe ? (je garde bien entendu l'interdiction sur newcommand)

@amorison
Copy link

Non, ça doit être pas mal avec ce qui est interdit.

@SpaceFox
Copy link
Contributor

OK, donc je laisse ouvert pour que @amorison puisse regarder la faisabilité de son idée.

En attendant, si certains jouent avec, on modèrera.

@Alex-D
Copy link
Contributor

Alex-D commented Aug 10, 2014

Personnellement, je préfère la solution qui consiste à scoper les messages. Ca permet aux auteurs de tutoriels de faire leur popote comme ils veulent.

Tu as des infos (lien) au niveau de group ?

@amorison
Copy link

Dans l'absolu, ouais, c'est cool. Mais le gros inconvénient est que ça alourdi pas mal pour pas grand chose, au final...

http://meta.math.stackexchange.com/questions/4130/the-scope-of-newcommand-is-the-entire-page

@Alex-D
Copy link
Contributor

Alex-D commented Aug 10, 2014

Ca me semble assez léger, au contraire : il n'y a que deux templates à toucher, une dépendance à rajouter et le problème est résolu proprement.

@amorison
Copy link

C'est pas si simple.

Si un mec poste le message :
$\endgroup$
$\newcommand\frac{2+2=4}$
$\begingroup$

Ou pire:
$\newcommand\endgroup\text{lol}$

Ton simple template équivaut à ne rien faire du tout. Il faut donc aussi bannir toute occurrence de \begingroup et de \endgroup , mais aussi de trucs vicieux dans le genre :
$\newcommand\pouet{ingroup}\beg\pouet$

Fin bref, c'est une galère pas possible.

@Alex-D
Copy link
Contributor

Alex-D commented Aug 10, 2014

Là on rentre dans le hack, alors que moi je vois le côté pratique de la chose, en ce sens où certains auraient le problème par mégarde.

Aussi, en interdisant les redéfinition tu vas faire chier nombre d'auteurs "scientifiques" qui utilisent ces expressions à tour de bras.

@amorison
Copy link

Sauf que les définitions faites par les scientifiques ne nous posent aucun problème. Cette issue est justement là pour savoir comment combler cette faille béante.

@cgabard
Copy link
Contributor

cgabard commented Aug 11, 2014

Si c'est un bug de mathjax, autant modérer les abus en attendant que ce
soit réparé. Ainsi les auteurs peuvent faire ce qu'ils veulent et on
prendra une décision plus ferme si on remarque trop d'abus
Le 11 août 2014 00:29, "aMorison" notifications@github.com a écrit :

Sauf que les définitions faites par les scientifiques ne nous posent aucun
problème. Cette PR est justement là pour savoir comment combler cette
faille béante.


Reply to this email directly or view it on GitHub
#1310 (comment)
.

@pierre-24
Copy link
Member Author

Bon, ça discute ferme là bas : mathjax/MathJax#888 ... Mais en gros, ça dit que c'est pas un bug mais une fonctionnalité et que la solution, c'est bel et bien la redéfinition comme l'avais pré-senti @amorison ...

@SpaceFox
Copy link
Contributor

Du coup ? On peut faire quelque chose ?

@amorison
Copy link

Bah on a deux possibilités :

  • laisser en l'état et modérer les petits malins qui font n'importe quoi ;
  • redéfinir les commandes de définitions dans la conf de MathJax.

Dans l'idéal, on pourrait faire confiance un minimum à ceux qui utiliseront ces commandes et penser que ce sera gérable. L'inconvénient si on part sur le premier point, c'est surtout que si on se rend compte qu'il faut empêcher les définitions parce qu'il y a trop d'abus, il faudra repasser sur tout le contenu qui utilise des définitions.

@pierre-24
Copy link
Member Author

Je serait également pour la première solution. À noter que c'est également le cas sur le SdZ et qu'ils n'ont jamais eu d'ennuis en 2 ans, avec plus d’utilisateurs ...

@SpaceFox
Copy link
Contributor

OK ; on est partis pour la première solution. Donc je ferme ici :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
C-Back Concerne le back-end Django S-BUG Corrige un problème
Projects
None yet
Development

No branches or pull requests

6 participants