• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[FRAGE] onclick image captcha - onsubmit löst Js-funktion nicht aus.

walli62

New member
Hallo liebe JS-Gemeinde,

ich hatte vor ein Captcha zu gestallten das mit ein Mausklick gelöst werden kann.
Dafür lasse ich ein zufälliges Bild wiedergeben, dass einen zum Bild zugeordneten wert hat: also bild_a=1;bild_b=2;bild_c=3;
dann habe ich in einen Form-tag drei inputs gesetzt die wenn sie makiert werden den vergleichswert füllen, wo dahinter die entsprechenden Bilder zugeordnet sind.
der sendenbutton soll dann, wenn die vergleichs-funktion ein true zurück gibt, die "action" ausführen. ... und hier klemmt es, und ich weiss nicht wieso.
Ich wäre über jeden ernst gemeinten Ratschlag sehr dankbar.

HTML:
<html>
<head>
<title>Captcha</title>
    
    <script type="text/javascript">

 
    function DrawCaptcha()
    {
        this.bild_a = Math.ceil(Math.random() * 3);
  this.bild_b = 0;
  if (this.bild_a == 1)
  {
  document.write('<img src="a.png">');
  }
  if (this.bild_a == 2)
  {
  document.write('<img src="b.png">');
  }
  if (this.bild_a == 3)
  {
  document.write('<img src="c.png">');
  }
  document.write('<form action="http://google.de" onsubmit="return CheckInput();"><p>Klicken sie das dargestellte bild an:</p><p><input type="radio" name="auswahlbild" onSelect="DrawCaptcha.bild_b = this.value;" value="1">  <img src="a.png" height="50px" width="50px"><br><input type="radio" name="auswahlbild" onSelect="DrawCaptcha.bild_b = this.value;" value="2"> <img src="b.png" height="50px" width="50px"><br><input type="radio" name="auswahlbild" onSelect="DrawCaptcha.bild_b = this.value;" value="3"> <img src="c.png" height="50px" width="50px"></p></form><input type="submit" value="absenden">');
  
 }
 function CheckInput()
 {
 if (DrawCaptcha.bild_a == DrawCaptcha.bild_b)
 {return true;
 alert("richtig");
 } 
 else {
 return false; 
 alert("falsch");
 }
 }
 </script>
</head>
<body onload="DrawCaptcha();">


</body >

Zeile 24 - document.write funktioniert scheinbar über mehrere Zeilen nicht. Falls ich mich da irre, bitte ich um eine Antwort.
Weil er das alert nicht aufruft glaube ich, das er die Checkinput-funktion nicht aufruft.

Ich hoffe das ich alle Forumregeln beachtet habe. Dies ist mein erster Beitrag. Danke im vorraus für Ihre Antworten.
 
Zuletzt bearbeitet:
Auf den ersten Blick fällt mir folgendes auf:
- Das alert(); kann er nicht mehr aufrufen, da du vorher ein return machst. Damit sagst du dem Script, hier bin ich fertig, gebe mir den Wert zurück.
- Dann sollte das Input in die Form rein, sonst bringt es nichts.


Aber warum willst du das Rad neu erfinden?

Ich würde dir z.B. Googles ReCaptcha (recaptcha) empfehlen.
 
Vielen Dank für deine schnelle Antwort.

Das, dass alert und das return vertauscht ist war mir auch gerade aufgefallen, aber anders rum funktioniert es auch nicht.
So müsste er google öffnen, wenn er die Funktion ausführen würde und das alert() ignorieren, da haben Sie vollkommen Recht.

"Aber warum das Rad neu erfinden?"

Bei reCaptcha gefallen mir zum einem die gestallterischen Möglichkeiten nicht (passt so gar nicht zum Stil meiner Webseite),
zum anderen möchte ich das die Abfrage mit einem Klick erledigt ist und man nicht irgendein nicht lesbaren Text eintippen muss.

MfG
walli62
 
Dein Einstand ist regelkonform und nicht zu beanstanden ;)

Zuerst ein paar Anmerkungen zu deiner Idee und deinem Code.

Also zuerst einmal: eine clientseitiges Captcha ist sicherheitstechnisch äquivalent zu gar keinem Captcha. Damit erzeugst du nur Aufwand für den legitimen Nutzer. Ein Captcha braucht immer einen Server, der die Lösung des Captchas kennt - und nur er. Die Lösung darf niemals in irgendeiner Form an den Browser gesendet werden.
Zusätzlich ist es für einen Bot extrem einfach, die zwei src-Attribute der <img> auszulesen. Auch zwei identische Bilder unter verschiedenen URLs sind extrem einfach zu detektieren.
Du musst dir für ein Captcha prinzipiell eine Aufgabenstellung überlegen, die für einen Computer extrem schwer zu lösen ist. Ansich gehört Muster-/Bilderkennung schon dazu, aber es darf hald keine Abkürzung geben.

Dann: Dein HTML ist invalide - da fehlt sowohl das <html> als auch eine DocType. Mit validem HTML lässt sich viel einfacher arbeiten.

Auch sollte man document.write() nicht verwenden, da es mehr Probleme erzeugt als löst und man die (meisten) Probleme auch mit anderen Techniken lösen kann (z.B. .innerHTML). Wenn du z.B. in deinem Beispiel oben direkt im HTML etwas in den <body> schreibst, wird das komplett gelöscht und nicht angezeigt.

Aber zu deinem Problem: da das <input type="submit"> nicht innerhalb des <form> ist, wird da onsubmit gar nicht ausgeführt, da das Formular gar nicht abgeschickt wird. Dann hast du einen Denktfehlt im Code: das this ist nicht eine Referenz auf die Funktion, sondern der sog. Kontext - in deinem Fall das window-Objekt.
DrawCaptcha.bild_a ist somit gar nicht definiert.

PS: wir duzen uns hier alle im Forum.
PPS: in JS schreiben die Meisten normale Funktion mit einem Kleinbuchstaben am Anfang. Nur Konstruktoren werden groß geschrieben.
 
Bei reCaptcha gefallen mir zum einem die gestallterischen Möglichkeiten nicht (passt so gar nicht zum Stil meiner Webseite),
zum anderen möchte ich das die Abfrage mit einem Klick erledigt ist und man nicht irgendein nicht lesbaren Text eintippen muss.
Ok, dann kann man sich natürlich was eigenes basteln. Wollte dich nur drauf hinweisen, dass es auch schon fertige Captchas gibt...

- - - Aktualisiert - - -

Noch was:
height und width im img Tag sollte man heute nicht mehr verwenden. Nimm lieber eine Klasse und schreibe die Höhe und Breite in eine CSS Datei.
 
Danke für Ihre Antwort

Ich werde mir eine neuen Ansatz überlegen mit PHP. Werde trotzdem versuchen mit diesen Ansatz Google auf zu rufen.
Das dient mir eher zur Übung mit Javascript und Html.

Mfg walli62
 
Zuletzt bearbeitet:
Die Lösung darf niemals in irgendeiner Form an den Browser gesendet werden.
Ich mach das deswegen immer so, dass ich die Lösung als Hash in der Session speichere:
PHP:
$_SESSION['captcha-code'] = hash('sha512', $salt.$random_string);

in JS schreiben die Meisten normale Funktion mit einem Kleinbuchstaben am Anfang. Nur Konstruktoren werden groß geschrieben.
Da dürfte dir jetzt wohl auch hesst zustimmen ;)
 
Da dürfte dir jetzt wohl auch hesst zustimmen ;)
Deswegen hab' ich's so geschrieben...

@walli62: Als Übung richtet es ja keinen Schaden an. Da fällt mir noch ein: du solltest gleich am Anfang dir einen gut leserlichen und konsisteten Codestil aneignen. Das hilft ungemein beim späteren Lesen und bei der Fehlersuche.
Zum Codestil gehört auch eine geschreite Codeeinrückung - der Code oben sieht eher aus wie Kraut und Rüben...
 
Der Thread beginnt irgendwie mit ricos Beitrag; wo ist denn der ursprünglichd erste Beitrag hin verschwunden? :confused:
 
Aus einem mir unbekannten Grund stand der erste Beitrag gerade wieder zum Freischalten. Obwohl ich das gestern schon gemacht hatte, sonst hätte ihn ja keiner gesehen und auch nicht geantwortet.
Wieso der jetzt wieder freizuschalten war, keine Ahnung.

mo, weißt du das?
 
Zurück
Oben