JCaptcha in Helma, bzw auf twoday.net

Manch einer mag bemerkt haben, dass wenn man sich neuerdings auf twoday.net registrieren will, dass man ein Bild wie folgendes entziffern muss:
Nicht ganz leicht für das menschliche Auge, aber noch viel viel schwieriger für einen Spam-Bot zu lesen! Und hier offenbart sich auch schon der Sinn dieses Bildchens. Automatisiert ablaufenden Skripts, welche sich in Massen bei Services registrieren um Spam-Kommentare zu hinterlassen, soll das Handwerk legt. Gottseidank sind wir hier bei twoday.net noch ein Land Dorf der Seeligen, und sind bisher weitestgehend verschont geblieben (bis auf die Referer-Spammer). Aber man kann nie vorsichtig genug sein. Vor allem wenn wir künftig auch anonymes Kommentieren (ohne vorherige Registrierung) hier erlauben wollen.

Nun denn, nun zum Technischen:
JCaptcha ist eine Java-Library, welche genau dafür gedacht ist, solche verzerrten Bilder zu generieren. Und dies macht diese Library auch sehr brav. Mit der API-Dokumentation selbst fangt man allerdings nicht viel an, und verflucht zu solchen Anlässen mal wieder die dutzenden Interfaces/Klassen-Verschachtelungen einer solchen, eigentlich simplen Library. Nachdem man aber nach paar Beispielen gegoogelt hat, stellt sich aber die Verwendung der Library doch als recht simpel heraus:

function modJCaptcha_action() {

   if (!app.data.modJCaptchaService) {
      app.data.modJCaptchaService = new Packages.com.octo.captcha.engine.image.gimpy.DefaultGimpyEngine();
   }

   session.data.modJCaptcha = app.data.modJCaptchaService.getNextCaptcha();
   var challenge = session.data.modJCaptcha.getImageChallenge();
   var jpegOutputStream = new java.io.ByteArrayOutputStream();
   var jpegEncoder = Packages.com.sun.image.codec.jpeg.JPEGCodec.createJPEGEncoder(jpegOutputStream);
   jpegEncoder.encode(challenge);
   var captchaChallengeAsJpeg = jpegOutputStream.toByteArray();
   res.contentType = "image/jpeg";
   res.writeBinary(jpegOutputStream.toByteArray());
   return;
}
Beim Registrieren selbst muss man dann nur noch abfragen, ob der eingegebene Text auch der Challenge entspricht:

   if (!session.data.modJCaptcha) {
      throw new Exception("modJCaptcha.noChallenge");
   }
   if (session.data.modJCaptcha.validateResponse(req.data.modJCaptchaAnswer) == false) {
      throw new Exception("modJCaptcha.wrongAnswer");
   }
   session.data.modJCaptcha = null;
That's it! So einfach kanns gehen, und so dankbar ist man dann dass man von Helma aus beliebige Java-Klassen ganz bequem scripten kann.

Will man jedoch die Höhe oder Breite des Bilds ändern, dann kann man nicht mehr die Default-Engine verwenden, und die Anzahl der Code-Zeilen verdoppelt sich dann gleich mal mit einem Schlag.

Nachtrag: Soeben wurde mir folgendes angezeigt..
usuck
Das geht ja dann doch wohl etwas zu weit. Vor allem wenn man sich gerade registrieren will :-)

Search

 

About michi

michi Michi a.k.a. 'Michael Platzer' is one of the Knallgraus, a Vienna-based New Media Agency, that deals more and more with 'stuff' that is commonly termed as Social Software.

Meet my fellow bloggers at Planet Knallgrau.

my delicious

Recent Updates

My Gadgets

Credits

Knallgrau New Media Solutions - Web Agentur f�r neue Medien

powered by Antville powered by Helma


Creative Commons License

xml version of this page
xml version of this page (summary)

twoday.net AGB

Counter



berufliches
blogosphaerisches
privates
spassiges
sportliches
technisches
trauriges
Profil
Logout
Subscribe Weblog