Securiser vos applications Rails avec un CAPTCHA

By lbois

Depuis quelques annees on a vu apparaitre le CAPTCHA (”Completely Automatic Public Turing Test to Tell Computers and Humans Apart”) sur tous les sites comportant une page d’enregistrement d’un nouvel utilisateur.

Le CAPTCHA permet d’eviter de se faire spammer une page de registration d’un nouvel utilisateur par des robots (programmes). Pour resumer, une image cote serveur est generee dynamiquement, affichant un texte aleatoire sur un fond avec bruit (quadrillage, pixellisation, bruit). Cette image est affichee dans la page en bas de formulaire, associee a un champs texte, dans lequel l’utilisateur devra recopier ce qu’il voit a l’ecran.
A la validation sont compares le texte saisi par l’utilisateur et celui ayant servi a generer l’image: si ils matchent, la sauvegarde du nouveau compte peut s’operer.

Un module (plugin) CAPTCHA pour Rails est disponible sur RubyForge. Il s’appuie egalement sur RMagick (gem), un binding Ruby de ImageMagick pour la generation dynamique de l’image.

Installer ImageMagick :
Sur Mac OS X Tiger, j’ai un peu galere. J’ai essaye plusieurs methodes : les binaires de ImageMagick, en passant par Fink. Sans succes.

Finalement je suis revenu aux ’sources’ : Installer tout manuellement depuis le source. Une bonne adresse de la manip est sur Hivelogic

En gros installer freetype, libpng, jpeg, tiff ainsi:

Creer un repertoire delete_later dans votre repertoire home (mkdir ~/delete_later) pour tous les sources et compilations

cd ~/delete_later
curl -O http://download.savannah.gnu.org/releases/freetype/freetype-2.1.10.tar.gz
tar xzvf freetype-2.1.10.tar.gz
cd freetype-2.1.10
./configure –prefix=/usr/local
make
sudo make install

cd ~/delete_later
curl -O http://superb-west.dl.sourceforge.net/sourceforge/libpng/libpng-1.2.10.tar.bz2
bzip2 -dc libpng-1.2.10.tar.bz2 | tar xv
cd libpng-1.2.10
./configure –prefix=/usr/local
make
sudo make install

cd ~/delete_later
curl -O ftp://ftp.uu.net/graphics/jpeg/jpegsrc.v6b.tar.gz
tar xzvf jpegsrc.v6b.tar.gz
cd jpeg-6b
ln -s `which glibtool` ./libtool
export MACOSX_DEPLOYMENT_TARGET=10.4
./configure –enable-shared –prefix=/usr/local
make
sudo make install

cd ~/delete_later
curl -O ftp://ftp.remotesensing.org/libtiff/tiff-3.8.2.tar.gz
tar xzvf tiff-3.8.2.tar.gz
cd tiff-3.8.2
./configure –prefix=/usr/local
make
sudo make install

Enfin ImageMagick 6.3.0:

cd ~/delete_later
curl -O http://easynews.dl.sourceforge.net/sourceforge/imagemagick/ImageMagick-6.3.0-6.tar.gz
tar xzvf ImageMagick-6.3.0-6.tar.gz
cd ImageMagick-6.3.0
./configure –prefix=/usr/local
make
sudo make install

Sur Mac OS X, Ruby 1.8.2 est preinstalle. Apres moult soucis a l’install de RMagick, il m’a ete conseille (Thanks Tim Hunter), de rebasculer sur 1.8.5. Un excellente ressource a suivre sur HiveLogic.

Pour Ruby:
Modifier le .bash_profile et ajouter en debut de PATH : /usr/local/bin/src:/usr/local/bin:/usr/local/sbin

Preinstaller readline (necessaire a Ruby)

cd ~/delete_later
curl -O ftp://ftp.gnu.org/gnu/readline/readline-5.1.tar.gz
tar xzvf readline-5.1.tar.gz
cd readline-5.1
./configure –prefix=/usr/local
make
sudo make install

Installer Ruby 1.8.5

cd ~/delete_later
curl -O ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.5.tar.gz
tar xzvf ruby-1.8.5.tar.gz
cd ruby-1.8.5
./configure –prefix=/usr/local –enable-pthread –with-readline-dir=/usr/local
make
sudo make install
sudo make install-doc

Installer RubyGems 0.9
cd ~/delete_later
curl -O http://rubyforge.iasi.roedu.net/files/rubygems/rubygems-0.9.0.tgz
tar xzvf rubygems-0.9.0.tgz
cd rubygems-0.9.0
sudo /usr/local/bin/ruby setup.rb

Installer RMagick 1.14.1 :

cd ~/delete_later
curl -O http://rubyforge.rubyuser.de/rmagick/RMagick-1.14.1.tar.gz
tar xvf RMagick-1.14.1.tar.gz
cd RMagick-1.14.1
./configure
make
sudo make install

Reinstaller Rails 1.1.6 (pour Ruby 1.8.5 situe dans /usr/local):

sudo gem install rails –include-dependencies

Installer le plugin CAPTCHA:
Dans votre application Rails, a la racine, executer la commande :

script/plugin install http://svn.2750flesk.com/plugins/trunk/validates_captcha

Preparer votre application pour CAPTCHA :

Creer le repertoire (var/data) a la racine de votre application, dans lequel un fichier PStore (contenant le mot de l’image, ou CAPTCHA challenge) sera stocke. Executer la commande :

script/generate captcha store_directory

Creer le repertoire ou seront stockees les images (public/images/captcha) avec la commande:
script/generate captcha image_directory

Une fois l’application prete, ne vous reste plus qu’a inclure le CAPTCHA dans votre signup page.

Supposons, comme moi, que vous avez un model User. Ajouter dans app/models/user.rb la ligne :

class User > ActiveRecord::Base

validates_captcha


end

Ajouter dans le formulaire de votre signup page :

<% c = prepare_captcha :type => :image -%>
<%= captcha_hidden_field c, ‘user’ %>
<%= captcha_image_tag c %>
<%= captcha_label ‘user’, ‘Type in the text from the image above’ %>
<%= captcha_text_field ‘user’ %>

A la racine de votre application, demarrer WebRICK:
script/server

Tester

Leave a Reply