Profil | Mitglieder | Registrieren | Start | Suche


PHP-Support.de » Programmierung » PHP & MySQL » Codeschnipsel » Captcha mit dynamischen Fragen    » Hallo Gast [Login | Registrieren]

Neues Thema | Antworten   

Autor Beitrag
youzer
Mitglied
Gruenling


Dabei seit: 11.08.2009
Herkunft: keine Angabe
Posts: 20
     Captcha mit dynamischen Fragen Zitat | Bearbeiten

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!

captcha.php
 Code 
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
<?php
// Vielen Dank an www.stoppt-den-spam.info ( modifiziert ) 

session_start();
unset($_SESSION['captcha_spam']);
unset($_SESSION["zahl_frage"]);
unset($_SESSION["antwort_cap"]);

   include("fragen.php");
   srand((double)microtime()*1000000);
   $zahl_frage = rand(0,$wieviele);
   $_SESSION["zahl_frage"] = $zahl_frage;
   
   
   $_SESSION['captcha_spam'] = $fragen[$_SESSION["zahl_frage"]];
   
   
   
   
   $text   =  $_SESSION['captcha_spam'];
   $_SESSION["antwort_cap"] = $antworten[$_SESSION["zahl_frage"]];  
     
     
     
   header('Content-type: image/png');
   $img = ImageCreateFromPNG('captcha.PNG'); //Backgroundimage
   $color = ImageColorAllocate($img, 255, 255,255); //Farbe
   $ttf = "Fradm.TTF"; //Schriftart
   $ttfsize = 15; //Schriftgrösse
   $angle = 0;
   $t_x = 20;
   $t_y = 25;
   imagettftext($img, $ttfsize, $angle, $t_x, $t_y, $color, $ttf, $text);
   imagepng($img);
   imagedestroy($img); ;
?>


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 )

Zu guter Letzt das Formular:

eingabe.php

 Code 
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
<?php session_start(); ?>
<form action="eingabe.php" method="post">
<img src="captcha.php" alt="Captcha"><br><br>
<input type="text" name="captcha"> ( Gro&szlig;- und Kleinschreibung beachten ) &nbsp;&nbsp;
<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!

http://kellercoding.tk

mfg




Post wurde schon 2x editiert, das letzte mal am 01.03.2011 um 11:30 von Andavos
28.09.2009, 17:02 Profil | PM | E-Mail  
stex
Mitglied
Sehr guter User


Dabei seit: 14.04.2009
Herkunft: Hannover
Posts: 650
      Zitat | Bearbeiten

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 
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:

<?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

?>
<form action="captcha2.php" method="post">
<input type="text" size="24" maxlength="50"
name="antwort"><br>

<input type="submit">
</form>


So nun die Captcha2.php

 PHP 
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
<?php
session_start
(); // Wieder Session Start


$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
28.09.2009, 20:39 Profil | PM | E-Mail  
youzer
Mitglied
Gruenling


Dabei seit: 11.08.2009
Herkunft: keine Angabe
Posts: 20
      Zitat | Bearbeiten

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.

 Code 
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
$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;
  }

.....




28.09.2009, 22:15 Profil | PM | E-Mail  
stex
Mitglied
Sehr guter User


Dabei seit: 14.04.2009
Herkunft: Hannover
Posts: 650
      Zitat | Bearbeiten

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.


29.09.2009, 07:13 Profil | PM | E-Mail  
Blackpig
Mitglied
Anfänger


Dabei seit: 03.08.2009
Herkunft: Bayern
Posts: 50
      Zitat | Bearbeiten

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.


29.09.2009, 07:20 Profil | PM | E-Mail  
stex
Mitglied
Sehr guter User


Dabei seit: 14.04.2009
Herkunft: Hannover
Posts: 650
      Zitat | Bearbeiten

// Edit habe ich gemacht nun ist es egal ob man ObAmA oder oBaMA schreibt


29.09.2009, 15:55 Profil | PM | E-Mail  
youzer
Mitglied
Gruenling


Dabei seit: 11.08.2009
Herkunft: keine Angabe
Posts: 20
      Zitat | Bearbeiten

Das mit den Connection Problem soll auch nicht für den Coder sein , sondern komfortabler für die User.


29.09.2009, 17:15 Profil | PM | E-Mail  
Gast


     CAPTCHA Zitat | Bearbeiten

CAPTCHA_K313 created: 0.0015 sec.
http://k313.k3.funpic.de/


18.12.2011, 18:56  
Gast


     Hintergrundbild notwendig? Zitat | Bearbeiten

Hallo,

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
      Zitat | Bearbeiten

Meine Meinung? reCaptcha schlägt alle Captchas.


09.02.2012, 19:20 Profil | PM | E-Mail  
Gast


      Zitat | Bearbeiten

Zitat:
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
      Zitat | Bearbeiten

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...


DingsDaBums


Schau mal bei meinem Projekt vorbei. Vielleicht ist das ja was für dich MyStartPanel - Deine persönliche Startseite mit deinen Favoriten
Auf der Suche nach einem guten Vokabeltrainer? Vokabeltrainer Cramfire - Schnell und effektiv Vokabeln lernen
10.02.2012, 12:36 Profil | PM | E-Mail  
FalkenaugeMihawk
Mitglied
Perfekter User


Dabei seit: 05.06.2010
Herkunft: Schweiz
Posts: 2619
      Zitat | Bearbeiten

Zitat:
Orginal von DingsDaBums
reCaptcha zeigt oft sogar Zeichen an, die man nicht eingeben kann...

Man kann immer noch einen anderen Captcha anzeigen lassen, wenn man auf die refresh-Pfeile drückt.


10.02.2012, 15:50 Profil | PM | E-Mail  
Seiten (1):  1 
PHP-Support.de » Programmierung » PHP & MySQL » Codeschnipsel » Captcha mit dynamischen Fragen   

Neues Thema | Antworten   


Powered by Command Board 1.0 - Beta 2.0 © 2004-08 PHP-Einfach | Impressum | Datenschutz