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