Captcha Programmieren

one_o

Gesperrt
Hallo

Komme mit meinen Anmeldeformular recht gut voran ;)

Jetzt fehlt mir nur noch ein sehr guter Captcha, weiß jemand nach welchen functionen ich suchen mus, habe auch mal gelesen das es sehr sinnvoll ist das Ergebnis vom Captcha in die Datenbank zu speichern(für den fall müste der User ja auch ne Session bekommen oder ? ).


PS:
Würde gerne auf eine Schriftart zugreifen, die Buchstaben oder Zahlen sollen später auch geneigt, hoch , runter ,rechts und links Dargestellt werden.


Würde mich über jeden Tipp freuen:rolleyes: :rolleyes: :rolleyes:

mfg.one
 
Allgemein brauchst du unter PHP dazu selbstverständlich bilverarbeitende Erweiterungen: http://de.php.net/manual/en/refs.utilspec.image.php

Und da kann ich dir insbesondere die GD-Lib ans Herz legen: http://de.php.net/manual/en/book.image.php

Wozu es etliche Tutorials gibt (auch für Captchas).

Ich selbst verwende nur ungern Captchas, da meine Seiten auch immer etwas barrierefreies haben sollen. Aber wenn dann würde ich zu reCaptcha greifen, da man so noch "was gutes tut" ;)
http://recaptcha.net/learnmore.html
EDIT: http://recaptcha.net/plugins/php/
 
Zuletzt bearbeitet:
Hallo ZodiacXP

Mir Persönlich ist der Captcha schon sehr wichtig, er wird auch nur bei der Erstanmeldung zusehen sein.

Geplant war jetzt erst mal ein ganzes Loginscript zu Programmieren, was keine Sicherheitslücken hat, nach Ende der Programmierarbeiten wird das fertige Script auf DVD gebrannt, dann hab ich für spätere Projecte immer ein gutes Login Script und spare mir viel Zeit beim Coden.

Habe grad was Interessantes gefunden.

Siehe Link:

http://www.traum-projekt.com/forum/.../98345-tutorial-schutz-spam-bots-captcha.html

Halte zwar nix von traum-projekt aber das haben sie echt gut gemacht, denke die Infos werden mir reichen um einen guten Captcha zu erstellen.

Melde mich sobald Probleme auftreten:rolleyes:

mfg.one
 
Ich würde dir auch stark empfehlen das Rad nicht neu zu erfinden sondern einen der vorhandenen Services wie ReCaptcha (s.o.) zu verwenden - zumal die am sichersten, einfachsten, komfortabelsten sind.
 
HI Freak

Versteh dich und ZodiacXP voll und ganz, denke wen ich PHP zu 100% beherschen würde, würd ich das gleiche sagen, aber das tuhe ich leider noch nicht darum ist es für mich um so wichtiger sowas zu lernen.

Und da ich ein Produktiver Mensch bin, und ey einen Captcha brauch schlag ich so 2 Fliegen mit einer Klappe :D

Hoffe ihr versteht wodrauf ich hinaus will:rolleyes:

lg.one
 
Erstes Problem, wollte jetzt das Captcha Bild in mein Formular einfügen, aber weiß nicht wie hier der Captcha Code.

PHP:
<?php
session_start();
unset( $_SESSION['captcha_code'] );
// Das Cachen der Grafik verhindern
header( "Expires: Mon, 26 Jul 1997 05:00:00 GMT" );
header( "Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT" );
header( "Cache-Control: no-store, no-cache, must-revalidate" );
header( "Cache-Control: post-check=0, pre-check=0", false );
header( "Pragma: no-cache" );
// Dem Browser mitteilen das es sich hierbei um ein JPG handelt.
header( 'Content-type: image/jpeg' );
// Sicherheitscode generieren
$AlphaNumerischerString = "ABCDEFGHIJKMNLOPQRS12345689";
$ZufallString1 = substr( str_shuffle( $AlphaNumerischerString ), 0, 1 );
$ZufallString2 = substr( str_shuffle( $AlphaNumerischerString ), 0, 1 );
$ZufallString3 = substr( str_shuffle( $AlphaNumerischerString ), 0, 1 );
$ZufallString4 = substr( str_shuffle( $AlphaNumerischerString ), 0, 1 );
$ZufallString5 = substr( str_shuffle( $AlphaNumerischerString ), 0, 1 );
$ZufallString6 = substr( str_shuffle( $AlphaNumerischerString ), 0, 1 );
$ZufallStringKomplett = $ZufallString1.$ZufallString2.$ZufallString3;
// Sicherheitscode in der Session speichern
$_SESSION['captcha_code'] = md5( $ZufallStringKomplett );
// Grafik erzeugen und an den Browser senden
$Schriftarten = "AGENTORANGEf";
$Bilddatei  = imagecreatefrompng( "hintergrund.png" );
$TextFarbe1 = imagecolorallocate( $Bilddatei, 77, 77, 77 );
$TextFarbe2 = imagecolorallocate( $Bilddatei, 77, 77, 77 );
$TextFarbe3 = imagecolorallocate( $Bilddatei, 77, 77, 77 );
$TextFarbe4 = imagecolorallocate( $Bilddatei, 77, 77, 77 );
$TextFarbe5 = imagecolorallocate( $Bilddatei, 77, 77, 77 );
$TextFarbe6 = imagecolorallocate( $Bilddatei, 77, 77, 77 );
imagettftext( $Bilddatei, 20, 10, 10, 30, $TextFarbe1, $Schriftarten, $ZufallString1 );
imagettftext( $Bilddatei, 20, -10, 40, 30, $TextFarbe2, $Schriftarten, $ZufallString2 );
imagettftext( $Bilddatei, 20, 10, 70, 30, $TextFarbe3, $Schriftarten, $ZufallString3 );
imagettftext( $Bilddatei, 20, -10, 100, 30, $TextFarbe4, $Schriftarten, $ZufallString4 );
imagettftext( $Bilddatei, 20, 10, 130, 30, $TextFarbe5, $Schriftarten, $ZufallString5 );
imagettftext( $Bilddatei, 20, -10, 160, 30, $TextFarbe6, $Schriftarten, $ZufallString6 );
imagejpeg( $Bilddatei );

// Grafik zerstoeren und Speicher freigeben
imagedestroy( $Bilddatei );
?>

Und hier mein Formular
PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Anmeldeformular</title>
<style type="text/css">
.box{
width:500px;
border:#333333 solid 1px;
margin:150px auto;
background-color:#CCCCCC
}
</style>
</head>
<body>
<center>
<div class="box">
<table>
<form action="anmelden.php" method="post">
<tr><td>
Vorname:
</td><td>
 <input type="text" name="vorname" />
</td></tr>
<tr><td>
Nachname:
</td><td>
<input type="text" name="nachname" />
</td></tr>
<tr><td>
Email: 
</td><td>
<input type="text" name="email" />
</td></tr>
<tr><td>
Password:
</td><td>
<input type="text" name="password" />
</td></tr>
<tr><td>
<img src="community/captcha/captcha.php" />
</td><td>
<input type="text" name="captcha" />
</td></tr>
<tr><td>
<input type="submit" value="Anmelden" />
</td><td>
<input type="reset" value="Zurücksetzen" />
</td></tr>

</form>
</table>
</div>
</center>
</body>
</html>

Wie gehe ich jetzt weiter vor allso im Beispiel von TP arbeiten die mit $_SERVER['PHP_SELF'] ist das ne gute Idee um das Formular auszuwerten, habe mal gelesen das $_SERVER['PHP_SELF'] nicht grade sicher ist oder ?

Ist Zwar ne nette sache,aber war ey geplant mein Formular mit Javascript noch mal auswerten zu lassen.

Kann man dann überhaupt mir Javascript den Captcha Code einfangen? um in dann auszuwerten, und ist das dann sicher,da ich mir denke das Bots meinen Quelltext nur nach der Variable mit dem Captcha durchsuchen müsten.

Überhaupt wie würdet ihr vorgehen ?

mfg.one
 
Sessions übergabe geht nicht richtig

Hallo stehe vor einem großen Problem.

Habe ein HTML Formular :

PHP:
<img src="http://www.tutorials.de/forum/captcha/captcha.php" />

Alles andere dort würde euch nur unnötige Zeit kosten.

Dann meine Captcha.php die dem Brower sagt es ist eine JPG Datei und einen Code erstellt,so weit geht alles.

Noch mal der Captcha Code:
PHP:
<?php
session_start();
unset( $_SESSION['captcha_code'] );
// Das Cachen der Grafik verhindern
header( "Expires: Mon, 26 Jul 1997 05:00:00 GMT" );
header( "Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT" );
header( "Cache-Control: no-store, no-cache, must-revalidate" );
header( "Cache-Control: post-check=0, pre-check=0", false );
header( "Pragma: no-cache" );
// Dem Browser mitteilen das es sich hierbei um ein JPG handelt.
header( 'Content-type: image/jpeg' );
// Sicherheitscode generieren
$AlphaNumerischerString = "ABCDEFGHIJKMNLOPQRS12345689";
$ZufallString1 = substr( str_shuffle( $AlphaNumerischerString ), 0, 1 );
$ZufallString2 = substr( str_shuffle( $AlphaNumerischerString ), 0, 1 );
$ZufallString3 = substr( str_shuffle( $AlphaNumerischerString ), 0, 1 );
$ZufallString4 = substr( str_shuffle( $AlphaNumerischerString ), 0, 1 );
$ZufallString5 = substr( str_shuffle( $AlphaNumerischerString ), 0, 1 );
$ZufallString6 = substr( str_shuffle( $AlphaNumerischerString ), 0, 1 );
$ZufallStringKomplett = $ZufallString1.$ZufallString2.$ZufallString3;
// Sicherheitscode in der Session speichern
$_SESSION['captcha_code'] = md5( $ZufallStringKomplett );
// Grafik erzeugen und an den Browser senden
$Schriftarten = "AGENTORANGEf";
$Bilddatei  = imagecreatefrompng( "hintergrund.png" );
$TextFarbe1 = imagecolorallocate( $Bilddatei, 77, 77, 77 );
$TextFarbe2 = imagecolorallocate( $Bilddatei, 77, 77, 77 );
$TextFarbe3 = imagecolorallocate( $Bilddatei, 77, 77, 77 );
$TextFarbe4 = imagecolorallocate( $Bilddatei, 77, 77, 77 );
$TextFarbe5 = imagecolorallocate( $Bilddatei, 77, 77, 77 );
$TextFarbe6 = imagecolorallocate( $Bilddatei, 77, 77, 77 );
imagettftext( $Bilddatei, 20, 10, 10, 30, $TextFarbe1, $Schriftarten, $ZufallString1 );
imagettftext( $Bilddatei, 20, -10, 40, 30, $TextFarbe2, $Schriftarten, $ZufallString2 );
imagettftext( $Bilddatei, 20, 10, 70, 30, $TextFarbe3, $Schriftarten, $ZufallString3 );
imagettftext( $Bilddatei, 20, -10, 100, 30, $TextFarbe4, $Schriftarten, $ZufallString4 );
imagettftext( $Bilddatei, 20, 10, 130, 30, $TextFarbe5, $Schriftarten, $ZufallString5 );
imagettftext( $Bilddatei, 20, -10, 160, 30, $TextFarbe6, $Schriftarten, $ZufallString6 );
imagejpeg( $Bilddatei );

// Grafik zerstoeren und Speicher freigeben
imagedestroy( $Bilddatei );
?>

So jetzt will ich meine Eingabe aus dem Formular mit dem generierten Code vergleichen, dort zeigt er aber immer 2 unterschiedliche an warum ?

PHP:
<?php
session_start();
//Verbindungs Daten werden geladen...
require_once ('konfiguration.php');
$datenbankverbindung = mysql_connect   (HOST, BENUTZER, KENNWORT);
$datenbankauswahl    = mysql_select_db (DATENBANK);
// Übertragene Zeichenketten in Variablen speichern...
$vorname   = $_POST['vorname']; $nachname  = $_POST['nachname'];
$email     = $_POST['email'];   $password  = $_POST['password'];
$captcha   = $_POST['captcha'];

if(md5($captcha) == $_SESSION['captcha_code']){
echo ("Der Code stimmt überein");
echo $_SESSION['captcha_code'];
echo ("<br>");
echo md5($captcha);
}
else
{
echo ("Der Code stimmt nicht überein");
echo $_SESSION['captcha_code'];
echo ("<br>");
echo md5($captcha);
}


// Tabellen und Spalten bestimmen... 
$datenspeicherung = "INSERT INTO `user_anmeldung`
(`Vorname` , `Nachname` , `Email` , `Password`)
VALUES
('$vorname' , '$nachname' , '$email' , '$password')";
// Daten werden eingetragen 
$db_erg = mysql_query($datenspeicherung);
// Mysql verbindung wird eingestellt...
mysql_close($datenbankverbindung);
?>

Nur der mittlere Teil ist wichtig.

Kann es einfach nicht verstehen, bevor ich das Script getestet hab, hab ich die Seite neugeladen, heist der alte Captcha wurde gelöscht und der neue in die Session gespeichert,dann vergleiche ich meine Eingabe mit der Session und sie stimmt nicht überein
:confused::confused::confused:

mfg.one




EDIT:

Juhu habs geschafft hab das ganze Script noch mal geschrieben,was zwar nicht wo der Fehler war aber es geht.

Hier mein Code für andere User die mal einen Captcha haben wollen.
captcha.php
PHP:
<?php
// Session starten
session_start();
// Alten CAPTCHA-Code aus der Session loeschen
unset( $_SESSION['Code'] );
//Header Optionen festlegen...
header( "Expires: Mon, 26 Jul 1997 05:00:00 GMT" );
header( "Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT" );
header( "Cache-Control: no-store, no-cache, must-revalidate" );
header( "Cache-Control: post-check=0, pre-check=0", false );
header( "Pragma: no-cache" );
header( 'Content-type: image/jpeg' );
//Erlaubte Zeichen...
$zeichen = ("ABCDEFGHKLNMOPQRSTXYZ123456789");
//Zufallszahen Festlegen...
$buchstaben_1 = substr(str_shuffle($zeichen),0,1);
$buchstaben_2 = substr(str_shuffle($zeichen),0,1);
$buchstaben_3 = substr(str_shuffle($zeichen),0,1);
$buchstaben_4 = substr(str_shuffle($zeichen),0,1);
$buchstaben_5 = substr(str_shuffle($zeichen),0,1);
$buchstaben_6 = substr(str_shuffle($zeichen),0,1);
//Alle Zufallszahlen miteinander verbinden...
$sicherheitscode = $buchstaben_1.$buchstaben_2.$buchstaben_3.$buchstaben_4.$buchstaben_5.$buchstaben_6;
//Scriftart erzeugen...
$schrifft = ("AGENTORANGEf");
//Hintergrundgrafik festlegen...
$grafik = imagecreatefrompng("hintergrund.png");
//Buchstabenfarbe festlegen...
$buchstabenfarbe_1 = imagecolorallocate($grafik, 0, 0, 0);
$buchstabenfarbe_2 = imagecolorallocate($grafik, 0, 0, 0);
$buchstabenfarbe_3 = imagecolorallocate($grafik, 0, 0, 0);
$buchstabenfarbe_4 = imagecolorallocate($grafik, 0, 0, 0);
$buchstabenfarbe_5 = imagecolorallocate($grafik, 0, 0, 0);
$buchstabenfarbe_6 = imagecolorallocate($grafik, 0, 0, 0);
//Text einstellungen...
imagettftext($grafik,15,0,10,20, $buchstabenfarbe_1,$schrifft,$buchstaben_1);
imagettftext($grafik,15,0,30,20, $buchstabenfarbe_1,$schrifft,$buchstaben_2);
imagettftext($grafik,15,0,50,20, $buchstabenfarbe_1,$schrifft,$buchstaben_3);
imagettftext($grafik,15,0,70,20, $buchstabenfarbe_1,$schrifft,$buchstaben_4);
imagettftext($grafik,15,0,90,20, $buchstabenfarbe_1,$schrifft,$buchstaben_5);
imagettftext($grafik,15,0,110,20,$buchstabenfarbe_1,$schrifft,$buchstaben_6);
imagettftext($grafik,15,0,130,20,$buchstabenfarbe_1,$schrifft,$buchstaben_7);
//Grafik an Brower schicken...
imagejpeg($grafik);
//Den fertigen Code in einer SESSION speichern
$_SESSION['Code'] = $sicherheitscode;
?>
Formular (HTML)
PHP:
<img src="http://www.tutorials.de/forum/captcha/captcha.php" />
Kontroll Seite
PHP:
<?php
session_start();
$captcha   = $_POST['captcha'];

if($captcha == $_SESSION['Code']){
   echo "Der Code war richtig";
   }
   else
   {
   echo "Der Code war Falsch";
   }

Trozdem allen noch mal ein dickes Danke für die Hilfe .

mfg.one
 
Zuletzt bearbeitet:
Zurück