Dieser Codeschnipsel zeigt statt einer Buchstabenreihnfolge eine Frage an, die der Benutzer beantworten muss.
Hallo ,
da ich oft gelesen habe , dass Captchas nichts nützen , da sie eh immer geknackt werden , habe ich mir überlegt wie man ein dynamisches Fragen - Antworten - Captcha erstellt - mit Erfolg!
Hier will ich euch zeigen wie das Simple , aber starke , Captcha funktioniert und wie ihr es selber coden und anpassen könnt.
Zuerst brauchen wir das Hauptcaptcha , ich habe eins von www.stoppt-den-spam.info genommen ,da ich mich nicht mit Bildern erstellen auskenne!
Zuerst werden die Sessions gestartet und geresetet , dann werden die Fragen eingeladen und ein Zufallsmechanismus wählt irgendeine Frage ( durch Arrays ) und lässt sie auf den Bild anzeigen.
Außerdem wird die Antwort mitgleich gespeichert, damit sie im Formular verglichen werden kann , ob diese Antwort wirklich auf die Antwort passt.
Die Antwort Nummer ist zu gleich auch die Frage Nummer.
Ihr benötigt die Fradm.TTF , aber ihr könnt die Schriftart ganz leicht auswechslen durch eine beliebige , sie muss aber im Ordner mit drin sein , in der auch die captcha.php ist.
Das Hintergrundbild sieht so aus:
Das muss ebenfalls in einen Ordner mit captcha.php rein.
Nun kommen wir zu den Fragen , die man selber leicht erstellen und löschen kann sowie die Antworten dazu:
Fragen.php:
Code
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
<?php
$fragen = array("Welches Farmtier macht Milch?","Was dreht sich um die Erde?","Wieviel Beine hat der Mensch?","Bist du ein Bot?");
$antworten = array("Kuh","Mond","Zwei","Nein");
$wieviele = count($fragen) - 1;
?>
Es wird ein Arrasy erstellt in denen alle Fragen kommen ( von 0 bis X ) und die Antworten genauso ( von 0 bis X ). Danach wird gezählt wieviele Fragen es gibt , und soviele Antworten gibt es logischerweise. Dies ist nötig , damit eine Zufallszahl gewählt werden kann , der in diesem Bereich liegt. Sonst wird eine Zufallszahl z.B 48 gewählt und in dieser Zahl ist überhaupt keine Frage gespeichert!
Ein Wert muss von $wieviele abgezogen werden , da die 0 noch mit drin ist und deswegen immer ein zuviel ist ( wenn man nicht -1 macht , dann kriegt man oft keine Frage zu Gesicht )
<?php session_start(); ?>
<form action="eingabe.php" method="post">
<img src="captcha.php" alt="Captcha"><br><br>
<input type="text" name="captcha"> ( Groß- und Kleinschreibung beachten )
<input type="submit" name="send"><br>
</form>
<?php
if(isset($_POST["send"])) {
if($_POST["captcha"] == $_SESSION["antwort_cap"] AND isset($_SESSION["antwort_cap"])) {
// Wenn das Captcha richtig ist , Code ausfuehren....
echo "<b>Benutzer wurde erfolgreich registriert..oder so.</b>";
}
}
?>
Das Captcha.php wird als Bild eingeladen und man muss die Antwort dazu geben. Wenn man es abgeschickt hat , wird überprüft ob die Antwort zu der Frage passt , welche in der SESSION gespeichert wurde. Wenn die Arrays miteinander übereinstimmen , dann ist das Captcha richtig und es kann mit den Code weitergehen.
Dieses kleine Captcha ist besonders gut für amerikanische Bots und russische Bots , da diese keine Antworten dadrauf geben können , sondern ( wenn sie Glück haben ) die Frage die im Bild steht , ins Feld eintragen.
Man kann das Captcha natürlich weiter erweitern , aber in diesem Tutorial wird gezeigt wie man Arrays mit Sessions kombinieren kann.
Ein Danke an php-einfach , denn ohne die wär ich in PHP immer noch eine Null!
Hey erstmal schönes Tutorial gut erklärt etc. Ich finde es bloß etwas unkompfortabel und stelle euch mal hier meine Captcha Version mit Datenbank. Die Codes sind gut kommentiert so dass es keiner Erklärung mehr Bedarf denke ich aber bei Frage gerne Posten
<?php
session_start(); // Sesssion Start zum übergeben der Varialbe
$verbindung = mysql_connect ("localhost",
"XXX", "XXXX")
or die ("keine Verbindung möglich.
Benutzername oder Passwort sind falsch");
mysql_select_db("stex-cash_Gaeste")
or die ("Die Datenbank existiert nicht."); // Typischer Verbindungsaufbau
$abfrage = "SELECT * FROM `captcha` ORDER BY RAND() LIMIT 1"; // Hier wird dafür gesorgt dass nur eine Frage zufällig aus der DB ausgwählt wird
$ergebnis = mysql_query($abfrage);
$row = mysql_fetch_object($ergebnis);
$_SESSION["frage"] = $row->frage ; // Hier wird die Frage die ausgewählt wurde in der Session gespeichert und zum Schluss ausgegeben
echo $row->frage; // Der Rest ist ein einfaches Formular
$verbindung = mysql_connect ("localhost",
"XXXX", "XXX")
or die ("keine Verbindung möglich.
Benutzername oder Passwort sind falsch");
mysql_select_db("stex-cash_Gaeste")
or die ("Die Datenbank existiert nicht.");
// Typische Verbindung
$antwort = mysql_real_escape_string($_POST["antwort"]); // Sichere Übergabe der Antwort
$abfrage = "SELECT * FROM `captcha` WHERE `frage` = '".($_SESSION["frage"])."'" ; // Auswahl der Antwort die zu der Frage passt
$ergebnis = mysql_query($abfrage);
$row = mysql_fetch_object($ergebnis);
if (strtoupper($antwort) == strtoupper($row->antwort))
{
echo "Richtig du Genie"; // Wenn die beiden Antworten übereinstimmen irgend einen Code ausführen
}
else
{
echo "Erbärmlicher Trottel"; // Wenn nicht anderen Code ausführen
}
?>
Viel Spaß Damit. Fragen und antworten müssen in die DB selbst eingetragen werden per phpmyadmin
Struktur ist übringens :
id | frage | antwort
/Edit: strtoupper bewirkt dass das Wort in komplett in Großbuchstaben erkannt wird. Also wird aus HuNd -> HUND und die Antwort ist dann auch komplett in großbuchstaben. So ist es verbessert
Post wurde schon 2x editiert, das letzte mal am 29.09.2009 um 15:54 von stex
Also ich persönlich mache es immer so , wenn die Datenbankverbindung oder die MySQL Verbindung scheitert , dass nix mehr geht , weil der Code abhängig von MySQL ist.
$connect = mysql_connect("","","");
$db = mysql_select_db("");
if($connect==false)
{
echo "Tut mir leid da stimmt was mit der Verbindung nicht";
exit;
}
if($db==false)
{
echo "Tut mir leid da stimmt was mit der Datenbank nicht";
exit;
}
.....
Klar aber wenn er ein Connection Fehler auftretten sollte dann sieht man das auch ohne zusätzlichen Code da dann jede menge Errors auf der Seite angezeigt werden.
ihr solltet noch einen befehl einbauen, womit entweder alle buchstaben groß oder klein gesetzt werden, weil ihr kennt ja die User sie geben statt, "Kuh" "kuh" ein, und schon stimmt das ganze nicht. Aber sonst ist es sehr schön.
erstmal großes Kompliment für die Idee sowie die Umsetzung. Ich frage mich nur, ob man das Hintergrundbild überhaupt benötigt. Bots sollten doch so oder so von den Fragen abgeschreckt werden und normale User werden vom Hintergrundbild nur abgelenkt...
Eure Meinung?
Danke & Grüße,
Steffen
09.02.2012, 17:54
FalkenaugeMihawk
Mitglied
Perfekter User
Dabei seit: 05.06.2010
Herkunft: Schweiz
Posts: 2619
Orginal von FalkenaugeMihawk
Meine Meinung? reCaptcha schlägt alle Captchas.
Ganz ehrlich: Ich HASSE diese optischen Spamschutz-Maßnahmen. Ich ärgere mich regelmäßig darüber, dass ich selbst daneben liege und das will ich meinen Besuchern wirklich nicht zumuten. Von daher finde ich die Idee mit den Verständnisfragen super. Nur sollte das auch einigermaßen funktionieren... Gibt es dazu Erfahrungen?
Grüße,
Steffen
09.02.2012, 22:13
DingsDaBums
Mitglied
Exzellenter User
Dabei seit: 12.09.2010
Herkunft: keine Angabe
Posts: 2496
Besonders, da solche Captchas gar kein 100% oder vielleicht noch 90%iger Schutz sind.
reCaptcha zeigt oft sogar Zeichen an, die man nicht eingeben kann...
Deswegen würde eine einfache Frage oder eben ein einfaches Bild mit leicht verschnörkelten Zahlen/Buchstaben reichen, um die Skriptkiddis und die Hobby Spamer vom Spamen abhalten zu können.
Alle anderen schaffen es auch reCaptcha zu "knacken". Da gibt es schon sehr viele Möglichkeiten...