mmofacts.com

Captcha Prototyp (Bilder)

gepostet vor 14 Jahre, 11 Monate von Kallisti

Da ich ja nach wie vor der Meinung bin, dass ein Captcha für jedes Browsergame essentiell wichtig ist, das einen kompetativen Inhalt hat und nicht nur aus RPG und Zufall besteht, wenn man nicht totgebottet werden möchte, wollte ich hier mal einen kleinen Prototypen posten, wie ich es designen würde:

http://dicio.org:3000/captcha (ist nur mein Catalyst Testserver, also unperformant und wird regelmäßig neu gestartet wenn ich Code Edits einpflege, also net wundern)

Die Idee ist nicht neu, in der Umsetzung hab ich es aber noch nicht gesehen. Die Filter sind nur innerhalb von 20 Minuten zusammengeschustert und noch nicht gestackt, also nur einer je Bild. Die Datenbank ist mit 4x4 Bildern auch noch sehr gering, mit realen Daten wäre es wesentlich unwahrscheinlicher in einem View zweimal dasselbe Bild zu haben.

16:00 <*Kallisti> also ich hab versch. Kategorien von Bildern
16:00 <*Kallisti> in dem Fall nur 4 (Katzen, Hunde, Igel und Pandas)
16:00 <*Kallisti> jedes Bild ist 400x300 pixel groß
16:00 <*Kallisti> das script schneidet davon zufällig 320x240 aus -> randomness, vielleicht noch zu vergrößern
16:00 <*Kallisti> dann ist oben links das Original ohne filter
16:01 <*Kallisti> und über die drei andern (von denen immer eins aus derselben Kategorie ist wie das Original)
                  kommt 1 Filter
16:01 <*Kallisti> später würd ich da vielleicht noch filter kombinieren, die Werte ein wenig tunen und
                  wahrscheinlich Graustufen erzwingen
16:01 <*Kallisti> ist im Grunde simpelstes ImageMagick
16:01 <*Kallisti> Am Ende macht es aus den 4 Bildern eines
16:02 <*Kallisti> dann nur noch javascript das die Klickkoordinaten übermittelt und in der Session
                  speichern an welcher Posi das richtige Bild ist

Ich fürchte man kommt an Graustufen zumindest für die drei Auswahlbilder nicht vorbei, weil sonst ein Farbhistogramm kombiniert mit einem Sampledatensatz ein zu mächtiges Werkzeug wird. Das Ziel ist es ja, dem Angreifer nicht zu erlauben mit einer Beispieldatenbank die Menge der zu interpretierenden Eingabedaten endlich zu machen, sondern mit dynamischen Filtern etwas vorzutäuschen, das nur Menschen mit vertretbarem Aufwand analysieren können.

Danach loggt man einfach die Ergebnisse der Klicks. Normale Anwender dürften im Bereich 80-90% landen, ein Bot kommt eher auf 33-50%, sofern die Filter gut umgesetzt sind.

Denke das ist für die Userexperience weit angenehmer als die meisten anderen Captchas und gleichzeitig um einiges sicherer als der nicht geschlossene Kreis. :P

Code (würde man selbstverständlich später in Methoden gliedern und bischen schicker machen, ist ja nur nen prototype):

Code:

sub index :Path :Args(0) {
my ( $self, $c ) = @_;
my $path = "captcha";
my $stack = Image::Magick->new();
# the first pic's category
my $rand_cat = 1 + int(rand(4));
# which position will be of the same?
my $rand_hit = 1 + int(rand(3));
# load first picture
$stack->Read(($path."/src/".$rand_cat."-".(1+int(rand(4))).".jpg"));
# pick a random 320x240 slice from 400x300 pics
$stack->Crop(geometry => ('320x240+'.(int(rand(80))).'+'.(int(rand(60))).''));
$stack->Border(bordercolor => "lightgreen");
# 3 more to go
for(1..3) {
# this turns category
my $rand_turn;
# uh, this iteration is our hit, so display the right category
if($rand_hit == $_) {
$rand_turn = $rand_cat;
# a random hit, iterate until we get a category that does not match the target
} else {
do {
$rand_turn = 1 + int(rand(4));
} while ($rand_turn == $rand_cat);
}
# read the image, slice it
my $image = Image::Magick->new();
$image->Read(($path."/src/".$rand_turn."-".(1+int(rand(4))).".jpg"));
$image->Crop(geometry => ('320x240+'.(int(rand(80))).'+'.(int(rand(60))).''));
# apply some filters
my $effect = 1 + int(rand(10));
if($effect == 1) {
$image->Charcoal(radius => 3, sigma => 3);
} elsif ($effect == 2) {
$image->AddNoise(noise => 'Impulse');
} elsif ($effect == 3) {
$image->RadialBlur(angle => rand(20));
} elsif ($effect == 4) {
$image->Posterize(levels => 5);
} elsif ($effect == 5) {
$image->Sketch(radius => 3, sigma => 3, angle => 45);
} elsif ($effect == 6) {
$image->Spread(radius => 3);
} elsif ($effect == 7) {
$image->Solarize();
} elsif ($effect == 8) {
$image->Swirl(degrees => (80+rand(120)));
} elsif ($effect == 9) {
$image->Wave(amplitude => 6, wavelength => 60, interpolate => 'average');
} elsif ($effect == 10) {
$image->Wave(amplitude => 10, wavelength => 5, interpolate => 'average');
}
# apply more filters?
# runder Ausschnitt des Bildes in weisser Umrandung
#$image->Vignette();
#$image->Set(monochrome => 1);
#$image->Modulate(brightness => 100);
$image->Modulate(saturation => 80);
#$image->Modulate(hue => 100);
$image->Border(bordercolor => "grey");
# stack em all
push(@$stack, $image);
}
# put the 4 images together
$stack = $stack->Montage(geometry => '320x240+8+6', tile => '2x2', border => 2, shadow => 1);
$stack->Set(quality => 80);
# temporary file for output
my $th = File::Temp->new(DIR => "$path/temp", SUFFIX => ".jpg");
my $tname = $th->filename;
$stack->Write("jpg:$tname");
$c->response->content_type("image/jpg");
$c->response->body($th);
}
gepostet vor 14 Jahre, 11 Monate von TheUndeadable

Wo muss der User dann hinklicken?

Auf das passende Bild?

IMHO in wenigen Tagen geknackt. FFT vernichtet das Rauschen, der Rest ist nur noch eine Faltung.

gepostet vor 14 Jahre, 11 Monate von Kallisti

Auf eines der drei Bilder mit grauem Rahmen, das ein Motiv aus derselben Kategorie zeigt wie das Bild oben links.

Die Effekte sind ja nicht nur simples Rauschen, man müsste selbstverständlich random 2-3 Filter je Bild kombinieren.

Also wenn du mir ein Script zeigst, das bei meinem extrem simplen und schlechten Beispiel erkennt, welche Filter ich angewandt habe, diese reversed und davon auf das Originalbild schließt - Respekt! Ohne Farbhistogramm wohlbemerkt.

Es reden immer alle gern von Fourier Transformationen, neuronalen Netzen, Agentensystemen usw. Wie wäre es denn mit einem Proof of Concept? Für Textcaptchas hab ich so etwas gemacht, aber für etwas wie das hier? Na los!

gepostet vor 14 Jahre, 11 Monate von TheUndeadable

> Fourier Transformationen,

Dient nur zur Informationsvereinfachung/-reduktion um die von dir eingefügten Informationen wieder zu entfernen.

> neuronalen Netzen,

Halte ich persönlich nicht sonderlich viel davon, da sie schwer zu kalibrieren/anzulernen sind. In diesem Falle IMHO sogar unwirksam, da du wechselnde Effekte verwendest und die Anlernerei zu kompliziert ist.

> Agentensystemen

Buzzword... Siehe Hype-Zyklus

http://de.wikipedia.org/wiki/Hype-Zyklus

> Ohne Farbhistogramm wohlbemerkt.

Ist in meinen Augen nicht notwendig, da du mit Hilfe einer Farbverschiebung sowieso jedes Farbhistogramm vernichten kannst.

> http://de.wikipedia.org/wiki/Kreuzkorrelation

Könnte die Lösung sein.

Proof-Of-Konzept ermögliche ich anderen. Hab hier leider kein MATLAB mehr installiert...

http://www.springerlink.com/content/m318510010lp204v/

http://wapedia.mobi/de/Korrelation

Wenn du Rotation und/oder Skalierung einfügst, wird der Rechenbedarf für eine solche Kreuzkorrelation schon massiv ansteigen.

Dann muss man evtl zuerst mit einer FFT ermitteln inwieweit du skaliert hast. Das könnte aber zu einer Explosion der Rechenzeit führen.

gepostet vor 14 Jahre, 11 Monate von Kallisti

Rotation war geplant, Skalierung ist ein guter Punkt.

Ich stell in ein paar Wochen mal eine etwas fertigere Variante vor, sofern jemand diesen einfachen Prototypen knackt. ;-)

So oder so - es ist imho für die Anwender weit angenehmer und erfordert weit mehr Know-how es zu knacken als 95% der im Web angewandten Captchas.

gepostet vor 14 Jahre, 11 Monate von TheUndeadable

Vielleicht finde ich mal eine ruhige Stunde und kann dann berichten...

gepostet vor 14 Jahre, 11 Monate von Kallisti

Sehr gern, mich würde vor allem interessieren welche Filter mehr Kopfzerbrechen bereiten als andere bzw. worauf man bei der Auswahl achten sollte.

Habe wenig Erfahrung mit Bilderkennung im Detail, daher basieren die meisten meiner Annahmen auf Common Sense. ;) Die bisher verwendeten Filter sind btw. einfach nur die ersten zehn, die auf die Schnelle eine sichtbare Veränderung gezeigt haben, da steckt noch kein Plan hinter.

gepostet vor 14 Jahre, 11 Monate von Drezil

sehr sehr nett gemacht und besser zu lösen als dieses ständige 'tippe ab, was hier ganz verzerrt steht'.

gepostet vor 14 Jahre, 11 Monate von Dunedan

Ich halte diese Methode für sinnlos, da ich mir sicher bin, dass es Verfahren gibt, die auch die verzerrten Bilder relativ eindeutig dem Original zuordnen können, ohne sie vorher zu entzerren. Der Schwachpunkt ist wie üblich, dass hier auf ein Merkmal gesetzt wird, was für einen Computer genauso einfach zu erkennen ist, wie für einen Mensch.

Für sinnvoller halte ich da eher so Sachen wie: Man sieht neun Bilder. Acht mit Hunden, eins mit einer Katze. Der Nutzer muss nun das mit der Katze anklicken.

gepostet vor 14 Jahre, 11 Monate von Kallisti

Dir ist schon klar, dass das anzuklickbare Bild im Normalfall nicht dem "Original" entspricht (wahrscheinlich sollte man die Möglichkeit komplett rausnehmen, wobei so etwas natürlich durch eine lernende Datenbank abgefangen werden kann), sondern nur aus derselben Kategorie (z.B. Katzen) kommt? Die Überschneidungen kommen nur weil meine Eingabemenge 4x4 Bilder und nicht 20x200 sind. Und die Effekte werden ja später nicht so trivial sein, wie bisher. Ich vermute auch, dass ich das Originalbild bearbeiten muss und nicht wie bisher unverzerrt darstellen sollte. Das mit den Hunden ist dann eher noch viel einfacher.

Überleg du dir nen PoC wie man es knackt, ich überleg mir eine Methode wie man es besser macht und am Ende schauen wir wer gewinnt. :P

gepostet vor 14 Jahre, 11 Monate von cherry

Interessant.

Ich denke eine stärke von textbasierten Captchas ist, dass man ziemlich viele verschiedene Captchas generieren kann. Bei einer Datenmenge von 20x200 kann jemand der es ernst meint sich einen Nachmittag hinsetzen und alle Bilder per Hand einordnen. Die Filter rückgängig zu machen ist vermutlich ein geringeres Problem (eine Vermutung wohl gemerkt!). Mit Skalierung und Verzerrung wird es vielleicht schwieriger.

Ich denke aber die Komplexität des Captchas hängt von der Datenmenge ab. Es gibt ein Spiel, das mit Hilfe von Human Computation ganz viele Bilder klassifiziert. Wenn man diese Daten zugrunde legen könnte wäre das Captcha wohl relativ stark. Hier ist ein Paper dazu: http://www.cs.cmu.edu/~biglou/ESP.pdf

gepostet vor 14 Jahre, 11 Monate von Dunedan

Original von Kallisti

Dir ist schon klar, dass das anzuklickbare Bild im Normalfall nicht dem "Original" entspricht (wahrscheinlich sollte man die Möglichkeit komplett rausnehmen, wobei so etwas natürlich durch eine lernende Datenbank abgefangen werden kann), sondern nur aus derselben Kategorie (z.B. Katzen) kommt?

Nein, das war mir nicht klar. Deine Beispielbilder zum Zeitpunkt des Schreibens meines Beitrages waren da auch ein denkbar schlechtes Beispiel. Jetzt sieht's besser aus. Somit entspricht deine Methode der von mir vorgeschlagenen, mit dem Unterschied, dass du die Bilder noch verfälscht und statt Referenzwort ein Referenzbild nutzt. Wobei ich mich frage, wozu da noch das verfälschen gut sein soll?

gepostet vor 14 Jahre, 11 Monate von TheUndeadable

Als kleiner Hinweis:

Der IE 8 zeigt im Übrigen nur ein 'Datei speichern'-Dialog an. Mime-Typ vermutlich

gepostet vor 14 Jahre, 11 Monate von Kallisti

Original von Dunedan

Nein, das war mir nicht klar. Deine Beispielbilder zum Zeitpunkt des Schreibens meines Beitrages waren da auch ein denkbar schlechtes Beispiel. Jetzt sieht's besser aus. Somit entspricht deine Methode der von mir vorgeschlagenen, mit dem Unterschied, dass du die Bilder noch verfälscht und statt Referenzwort ein Referenzbild nutzt. Wobei ich mich frage, wozu da noch das verfälschen gut sein soll?

Ich hab seit da aber nichts an den Bildern geändert? Nennt man wohl Zufall, kannst ja paar mal reloaden... ;-) Ich verfälsche die Bilder um aus einer endlichen Ergebnismenge, die man mit lernenden Algorithmen oder ein paar Stunden Arbeit lösen könnte, eine unendliche zu machen.

@Undead, jo hab ich im Safari auch gemerkt. Content-type muss image/jpeg und nicht image/jpg sein - fixed.

Auf diese Diskussion antworten