C4ptch@

De temps à autre, il m’arrive de regarder un peu sous le capot des sites web que je visite, de plonger dans le code pour m’intéresser à l’un ou l’autre composant du site. Dernièrement, j’ai donc été attiré par la partie captcha de l’un d’eux.

captchaDès le premier coup d’œil, je pressens une faille. Quelques actualisations de page plus tard, ma première impression se confirme, le nom donné aux images représentant les différents chiffres du captcha ne changent pas. Il suffit donc d’établir la correspondance entre nom d’image et chiffre et nous devenons capable de déterminer le captcha automatiquement.

En regardant d’un peu plus près l’identifiant de chaque image, je m’aperçois également que celui-ci fait 32 caractères de long. Résumons: 32 caractères, lettres minuscules de a à z et chiffres de 0 à 9. Qui a dit md5? Un petit test pour s’en convaincre. L’image correspondant au 0 a pour identifiant cfcd208495d565ef66e7dff9f98764da, ce qui correspond bien au hash md5 de 0.

Cette constatation m’a donc fait réfléchir à la question suivante: si il est possible de casser un captcha en apprenant la règle spécifique à un programme, ce mécanisme de captcha est-il toujours valable, au sens où il a fallu une intervention humaine pour écrire la règle?

Revenons donc sur la définition d’un captcha par Wikipédia: « A CAPTCHA (an acronym for « Completely Automated Public Turing test to tell Computers and Humans Apart ») is a type of challenge-response test used in computing to determine whether or not the user is human. ». On y apprend qu’un captcha doit permettre de déterminer si un utilisateur est humain ou non. Donc, le mécanisme de captcha étudié n’est pas valable, puisqu’un programme relativement simple est capable de résoudre le défi. Bien entendu, il aura fallu qu’un humain écrive la façon de résoudre ce captcha en particulier (,mais après tout, il y a un humain derrière chaque ligne de code). De plus, on peut très bien écrire un programme capable de reconnaître lorsqu’un site utilise ce type de captcha et ainsi s’affranchir d’une intervention humaine pour chaque site utilisant ce mécanisme de captcha.

Pour terminer, j’ai continué mes recherches et avec les bons mot-clés, j’ai donc constaté que ce type de captcha utilisant un hash md5 comme identifiant d’image se retrouve sur quelques sites mais ne semble pas être trop répandu. On peut néanmoins déplorer que la page sur laquelle j’ai découvert ce captcha soit celle de contact d’une commune française de taille moyenne.

Astuces ezPDF PHP

Si vous lisez ceci… vous êtes surement entrain de galérer à afficher des accents ou caractères spéciaux avec un éditeur de PDF en PHP (ici ezPDF).

  • La première astuce est pour l’affichage du sigle €.

Essayez cette ligne :

$euro = iconv("UTF-8", "CP1252", "€");

La variable euro contiendra votre sigle euro affichable correctement sur le PDF ;)

 

  • La deuxième astuce est pour tout vos accents, sigles, etc :
$coeur = iconv("UTF-8", "CP1252", "œ");

$texte = "N°9: Ô mage aztèque, l'écuyer vêtu d'un kit hawaïen et de bijoux reçut au c".$coeur."ur l'âcre piqûre, de l'île où arrive son frêle canoë.");";

$bizarrerie = array('é', 'à', "'", 'ê', 'è', '°', 'Ô', 'ï', 'ç', 'â', 'û', 'î', 'ù', 'ë');

$remplacementBizzarerie = array(utf8_decode('é'),utf8_decode('à'),utf8_decode("'"),utf8_decode('ê'),utf8_decode('è'), utf8_decode('°'), utf8_decode('Ô'), utf8_decode('ï'), utf8_decode('ç'), utf8_decode('â'), utf8_decode('û'), utf8_decode('î'), utf8_decode('ù'), utf8_decode('ë'));

$texte = str_replace($bizarrerie , $remplacementBizzarerie , $texte);

Affichez votre texte sur le PDF et admirez :)

$texteSource

 

Easily deploy a local MongoDB cluster

When working with MongoDB, it surely comes a time when you want to try to make it scale. First, by adding replica set, then sharding and at least mix it together to create a simple cluster with replication on each shard. Then, you might want to test monitoring or other functionality, so you will need to launch your cluster, configure it.

If everything goes right, you’ll only need to start all your MongoDB instances. Not a big deal, easy to do it at each restart of your computer, just copy paste the right commands. But what if I need a fresh clean cluster to make my test? To answer this question, I wrote a simple script to easily deploy a local mongo cluster composed of one query router, three configuration routers and two shards, each being a replica set composed of one primary mongod and two secondary mongod.

This simple project is on my Github under the name simple-mongo-cluster. The readme describes on which port you’ll find which mongo. The script provides 5 operations: {init|start|configure|stop|clean}. I will quickly describe each of it.

The init operation creates all directories needed to store logs and data. All mongo instances will be started with the start parameter. To configure the cluster, use configure. For the cluster to be configured, you might need to call configure twice, because of shards sometimes not being added at first call. The stop operation is just about shutting down the whole cluster. At last, clean deletes all directories containing the cluster configuration files, data and logs so that you can start a fresh new cluster.

I hope it will help other developers who want to easily test and discover MongoDB cluster possibilities in a local environment as it helps me. If you have any suggestions, just let me know or fork the project, add your script and send me a pull request.

12 lines proxy with Node.js and Request

Easy and simple http proxy using Node.js and request.

var request = require('request')
  , http = require('http')
  , port = 8888
  , host = 'localhost'
  , proxy = http.createServer(function (req, res) {
    var x = request(req.url)
    req.pipe(x)
    x.pipe(res)
  })
proxy.listen(port, host, function () {
  console.log('Proxy running on port ' + port);
})

Code available on Github: node-simple-proxy.

It would be great to support https. And of course, you can do it without request.