Journal Justabot le bot XMPP ٩(͡๏̯͡๏)۶

Posté par . Licence CC by-sa
7
22
mar.
2013

Écrit en python, Justabot est un robot inventé en mai 2012 pour le salon de support XMPP Devosi (support@conference.devosi.org). C'est un automate client d'un serveur XMPP (Jabber). Il offre des services d'envoi de données (push), ou de contrôle à distance. Il répond donc à vos demandes dans le salon où il a été installé dans la limite de ses connaissances, et de façon plus ou moins comique. Le mieux est encore d'essayer de lui parler.

Utilisation

Il se connecte en tant que client. La commande !help en message privé vous donnera la liste des commandes disponibles. Il est possible de lui donner des commandes en privé comme en public (certaines commandes étant restreintes à l’un ou l’autre). Il répond aussi lorsque son pseudonyme est écrit en public ou pour toute ligne en privé.

Documentation

La documentation de Justabot est disponible sur le WikiDevosi à cette adresse :

Téléchargement

Le code source originel est disponible à cette adresse : Justabot

▂ ▃ ▅ ▆ █ Amusez vous bien !! █ ▆ ▅ ▃ ▂

  • # Autre bot

    Posté par (page perso) . Évalué à 4.

    Je profite de ce journal pour parler d'un bot que j'avais codé il y a un certain temps déjà pour mes propres besoins. J'avais essayé à l'époque de faire quelque chose de très modulaire donc il y a une notion de modules qui sont chargeables ou déchargeables à chaud sur tel ou tel salon. Et puis du coup, il est très facile de rajouter un nouveau module.

    Vous pouvez récupérer les sources ici : https://github.com/MaximeCheramy/pyAnna

    N'hésitez pas à me forker puisque je n'y touche plus depuis un long moment.

    • [^] # Re: Autre bot

      Posté par . Évalué à 3.

      Tiens on est revenu 15 ans en arrière ? Les bots reviennent à la mode ?

      Autrement vu ton module calc l' article suivant n'a jamais été aussi vrai…

      • [^] # Re: Autre bot

        Posté par (page perso) . Évalué à 3.

        Mouhaha, merci :D.

        D'ailleurs pour l'histoire, j'avais à la base codé le calcul à la main : https://github.com/MaximeCheramy/pyAnna/blob/104ea5b636dc01ea43940afb5a8b1d45d2d2ed5e/modules/calc.py
        Et puis quelqu'un m'a dit : tu t'es fait chier pour rien, utilise eval !
        Là j'ai utilisé eval et rapidement je me suis dit : oh mais attends, c'est une grosse connerie, c'est pas secure. Et là je pense qu'on peut raisonnablement enchaîner sur ton article : j'ai googlé 10s pour trouver une solution :).

        • [^] # Re: Autre bot

          Posté par (page perso) . Évalué à 2. Dernière modification le 23/03/13 à 10:44.

          Je viens d'essayer :

           calc("[t for t in (1).__class__.__bases__[-1].__subclasses__() if t.__name__ == 'file'][0]('/etc/passwd').read()")
          Traceback (most recent call last):
            File "<stdin>", line 1, in <module>
            File "<stdin>", line 6, in calc
            File "<string>", line 1, in <module>
          IOError: file() constructor not accessible in restricted mode
          
          

          Pourtant avec eval, ça marche. Qui a un exemple de faille pour ce bout de code :

          def calc(expression):
              #make a list of safe functions
              safe_list = ['math','acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'cosh', 'degrees', 'e', 'exp', 'fabs', 'floor', 'fmod', 'frexp', 'hypot', 'ldexp', 'log',
          'log10', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh']
              #use the list to filter the local namespace
              safe_dict = dict([ (k, locals().get(k, None)) for k in safe_list ])
              return eval(expression, {"__builtins__":None},safe_dict)
          
          
          • [^] # Re: Autre bot

            Posté par (page perso) . Évalué à 3.

            Bon finalement, j'ai regooglé rapidement et je suis tombé sur ça : http://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html et l'exemple fait bien planter l'interpréteur.

            • [^] # Re: Autre bot

              Posté par . Évalué à 2.

              haypo a écrit une pysandbox.

              • [^] # Re: Autre bot

                Posté par . Évalué à 5.

                On en revient exactement à ce dont parle l'article.

                Pour faire ton module calc tu as le choix entre deux options:

                • Écrire, ou utiliser, un parser dédié. C'est un projet que n'importe quel étudiant à fait, et qui se boucle en quelques heures. Tu es 100% sur de la sécu, au pire il va manquer des fonctionalités que tu pourras rajouter par la suite.

                • Utiliser quelque chose qui repose sur de l'éxecution de code de ton langage. Que ca soit eval que tu essais de sécuriser ou une sandbox ca revient en gros au même. Au moindre problème, faille, ou chose imprévue tu t'exposes à des catastrophe. Pour rien. La surface d'attaque est importante et les conséquences (DOS, faille, fuite d'info) sont très nombreuses.

                Un poil de bouteille devrait te faire toujours rester très loin de la deuxième solution sauf excellente raison.

                Ca s'applique à de nombreuses choses. Au fur et à mesure tu apprends à détecter les choses qui vont inexorablement poser problème et exploser en vol dans une semaine ou cinq ans et que des choix rationnels auraient évité.

                • [^] # Re: Autre bot

                  Posté par (page perso) . Évalué à 1.

                  • [^] # Re: Autre bot

                    Posté par . Évalué à 3.

                    Je suis pas sur qu'on était en train de chercher une solution qui ne sert à rien ;) La discussion me semblait bien plus générale: savoir sentir les cas foireux, les mauvais usages, les mauvais designs. Remplacer un eval par un python sandboxé pour faire une calculette, c'est persister dans son erreur.

                    Maintenant tu vas pas aller bien loin avec literal_eval qui comme son nom l'indique n'évalue que des literaux… Cool tu peux parser des int et des float. Le reste est à faire, tu vas donc basculer sur ast.walk en faisant gaffe à pas faire de conneries. Retour plus ou moins à la case départ. Mais au fait avec literal_eval; ton calculteur tu voulais vraiment lui laisser parser des dicts ?

                    Maintenant le mec qui veut se coder sa calculatrice. Il va définir son cahier des charges (quelles constructions sont autorisées, quels impacts niveau CPU et mémoire etc.), et il va soit utiliser un des 1000 projets qui doivent faire ca. Soit se coder son parseur en une aprèm si il veut quelque chose de très précis. Là encore soit à l'ancienne type premier projet de compil, soit en utilisant un lib de parsing comme il en existe tant. Bref on s'en fou un peu en fait.

      • [^] # Re: Autre bot

        Posté par . Évalué à 1. Dernière modification le 23/03/13 à 10:49.

        L'article est intéressant, mais la comparaison avec son chat est très douteuse, à moins qu'il ne considère son chat comme un outil ou un Nabaztag.

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.