Ses comptes bancaires en ligne de commande

Ceux qui maintenant savent comment sortir son python pour draguer seront peut-être intéressé d'apprendre que j'ai réitéré l'expérience avec le site de la BNP Paribas.

En effet, las d'avoir à passer par Firefox pour aller sur un site lent et mal codé afin de savoir si je peux encore me permettre de sortir me bourrer la gueule, j'ai repris l'idée que j'avais eu pour AuM, et ai profité de mon arrêt maladie d'aujourd'hui pour écrire un petit programme dont le but est d'avoir une commande à lancer pour récupérer dans son terminal l'état de ses comptes :

$ ./bnporc.py -l 30141xxxxx list
Password:
  Compte                       Solde       À venir
+---------------------+--------------+-------------+
  Compte de chèques         xxx65.12       -160.18
  Livret Jeune              xxx71.86          0.00
  Prêt personnel            xxx46.39          0.00

Les 'x' sont placés à postériori dans l'unique but de maintenir ma vie privée.


Identification graphique

La particularité de ce site, c'est que pour s'identifier, il est nécessaire d'entrer son identifiant dans un champ texte, mais l'insertion de son mot de passe se fait graphiquement :

L'image est générée pour positionner les chiffres à des emplacements aléatoires. Lorsque l'utilisateur clique sur une partie de l'image, le navigateur va rajouter dans un champ caché la position de la case cochée. C'est le serveur qui a stocké l'équivalence et qui va être en mesure de vérifier la validité.

Ainsi que l'on peut le voir, la grille est assez triviale à analyser. BNPorc va donc se contenter de parcourir l'image avec des sauts hardcodés et vérifiera la couleur du pixel en haut à gauche de chaque case pour tout d'abord savoir si la case contient ou pas un chiffre (puisque les chiffres ont un fond gris). Il ajoute alors le contenu de la case dans un buffer, hash le tout et compare avec les valeurs enregistrées pour retrouver le chiffre auquel la case correspond.
Il est alors aisé, à partir du mot de passe numérique entrée au clavier par l'utilisateur de BNPorc, de retrouver les identifiants des cases à transférer au serveur.

Code HTML pourri

Une autre difficulté que j'ai rencontré, c'est la présence de code de merde. On trouve par exemple ceci :

<SCRIPT language=javascript>
if (navigator.appName != "Microsoft Internet Explorer") {
    document.write('<INPUT size="10" '); }
else {
    document.write('<INPUT size="10" ');
}
</SCRIPT>
maxlength="10" value="" name="ch1" type="text"&gt;

Allez savoir l'intérêt d'une telle manipulation, le problème que ça m'a posé c'est que, du coup, mechanize ne trouvait pas cette entrée là. Heureusement, après avoir cherché dans les tréfonds de la lib, ainsi que de ClientForm, il a été possible de rajouter à la main le champ.

BNP's Original Reporter Client

Ce petit outil est donc pour le moment limité au listing des comptes avec leur solde, mais il sera aisé de rajouter diverses informations, comme la liste de toutes les opérations à venir (notamment en ce qui concerne les achats effectués par carte bancaire).

Je pense qu'un tel outil apporte vraiment quelque chose, par exemple, on pourrait faire un indicateur dans la statusbar afin d'avoir le montant du compte, faire des stats sur ses achats (voir avec des regexp où part l'argent), rajouter un système d'alertes, etc.
L'inconvénient, par contre, c'est que je n'ai plus d'excuses pour faire attention à ne pas être à découvert.

Le code source peut être récupéré par git :

$ git clone git://git.symlink.me/pub/romain/bnporc.git

5 Responses to “Ses comptes bancaires en ligne de commande”


Leave a Reply