Stoppt-den-Spam.info Foren-Übersicht
RegistrierenSuchenFAQMitgliederlisteBenutzergruppenLogin
Gemischtes Captcha (Tutorial)
Gehe zu Seite 1, 2, 3  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    Stoppt-den-Spam.info Foren-Übersicht -> Sonstiges
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
frameguard



Anmeldedatum: 05.03.2007
Beiträge: 117
Wohnort: Wien

BeitragVerfasst am: 11.04.2007, 17:17    Titel: Gemischtes Captcha (Tutorial) Antworten mit Zitat

Nach dem Vorbild von Robs Tutorial für Zahlen- und Rechen-Captchas mache ich das jetzt auch als Tutorial:

Vorwort
Der folgende Script erzeugt einen zufälligen Sicherheitscode aus Zahlen und Buchstaben.

Und so sieht das dann zum Beispiel aus:


Captcha-PHP-Script
Wie bei den anderen Scripts brauchen wir zuerst einen Ordner "CAPTCHA". In diesen kommen folgende Dateien:
captcha.php
XFILES.TTF
captcha.PNG


Die captcha.php besteht aus folgendem Script:

captcha.php
Code:
<?php
   session_start();
   unset($_SESSION['captcha_spam']);

   function randomString($len) {
      srand(date("s"));
      $possible="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";
      $str="";
      while(strlen($str)<$len) {
        $str.=substr($possible,(rand()%(strlen($possible))),1);
      }
   return($str);
   }

$text=randomString(5);

   function encrypt($string, $key) {
   $result = '';
   for($i=0; $i<strlen($string); $i++) {
      $char = substr($string, $i, 1);
      $keychar = substr($key, ($i % strlen($key))-1, 1);
      $char = chr(ord($char)+ord($keychar));
      $result.=$char;
   }
   return base64_encode($result);
   }

   $_SESSION['captcha_spam'] = encrypt($text, '8t3479u97'); //Key sollte geändert werden
   $_SESSION['captcha_spam'] = str_replace("=", "", $_SESSION['captcha_spam']);

         
   header('Content-type: image/png');
   $img = ImageCreateFromPNG('captcha.PNG'); //Backgroundimage
   $color = ImageColorAllocate($img, 255, 255, 0); //Farbe
   $ttf = $_SERVER['Document_Root']."XFILES.TTF"; //Schriftart
   $ttfsize = 25; //Schriftgrösse
   $angle = rand(0,5);
   $t_x = rand(5,30);
   $t_y = 35;
   imagettftext($img, $ttfsize, $angle, $t_x, $t_y, $color, $ttf, $text);
   imagepng($img);
   imagedestroy($img);
?>


XFILES.TTF
Die Schriftart x-files ist eine Freeware-Schriftart und mMn besser für ein Captcha geeignet als Arial, weil für Spambots schwerer lesbar. Ihr könnt sie hier downloaden.

Hintergrundbild
Das Hintergrundbild generiert ihr wie hier beschrieben.

Einbau ins Formular
Wie hier beschrieben.

Einbau ins Script
Code:
<?php
session_start();

function encrypt($string, $key) {
$result = '';
for($i=0; $i<strlen($string); $i++) {
   $char = substr($string, $i, 1);
   $keychar = substr($key, ($i % strlen($key))-1, 1);
   $char = chr(ord($char)+ord($keychar));
   $result.=$char;
}
return base64_encode($result);
}
$sicherheits_eingabe = encrypt($_POST["sicherheitscode"], '8t3479u97'); // key sollte ident sein mit captcha.php
$sicherheits_eingabe = str_replace("=", "", $sicherheits_eingabe);
if(isset($_SESSION['captcha_spam']) AND $sicherheits_eingabe == $_SESSION['captcha_spam']){
unset($_SESSION['captcha_spam']);

//
//
//Hier kommt das ursprüngliche Script hin.
//
//

}
?>


Rob hat Folgendes geschrieben:
Der Einbau ins bestehende Script ist sehr einfach, es braucht nur eine if-Schleife um das bisherige Script, welche überprüft ob das Captcha das eingegeben wurde, dem generierten Captcha entspricht. Optional kann auch noch ein else Teil angefügt werden, welche den Fehler ausgibt, dass das Captcha falsch war.


Eine andere Möglichkeit, die IF-Abfrage zu gestalten, wäre:

if(isset($_SESSION['captcha_spam']) AND $sicherheits_eingabe == $_SESSION['captcha_spam']){
unset($_SESSION['captcha_spam']);
}
else
{
die ("Der Sicherheitscode ist falsch!");
}

und dann der ursprüngliche Script. Ist leichter einzubauen, weil die Wahrscheinlichkeit, daß man was falsch macht, geringer ist - aber dafür wird die Abarbeitung etwaiger anderer IFs im Script nicht mehr durchgeführt, weil die(); das Script komplett abbricht.


Zuletzt bearbeitet von frameguard am 15.04.2007, 19:35, insgesamt 2-mal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
apophis171



Anmeldedatum: 02.04.2007
Beiträge: 16
Wohnort: Rathenow

BeitragVerfasst am: 12.04.2007, 13:01    Titel: Antworten mit Zitat

sinvoll ist dann natürlich auch, wenn man nicht alle Zahlen und Buchstaben verwendet.

Wenn man z.B. Arial verwendet sieht das kleine "L" und das große "i" gleich aus, bei "null" und "o" natürlich auch. habe auch das "Q" entfernt.

das ganze sieht dann so aus:
Code:

$possible="ABCDEFGHJKLMNPRSTUVWXYZabcdefghijkmnpqrstuvwxyz23456789";
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen Yahoo Messenger MSN Messenger
frameguard



Anmeldedatum: 05.03.2007
Beiträge: 117
Wohnort: Wien

BeitragVerfasst am: 12.04.2007, 13:14    Titel: Antworten mit Zitat

Der $possible-String kann mit relativ beliebigen Zeichen gefüllt werden, denkmöglich wäre ja auch, NUR Buchstaben in den String zu setzen (das wäre dann ein reines Buchstaben-Captcha).
Deshalb habe ich ja diese Vorgangsweise gewählt - sie ist unheimlich flexibel. Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Rob [Admin]
Site Admin


Anmeldedatum: 23.12.2006
Beiträge: 132

BeitragVerfasst am: 15.04.2007, 15:11    Titel: Antworten mit Zitat

Ich werde das Script übernehmen und bei Gelegenheit in die Seite einbauen.

Was ich nicht verstehe, was schlecht ist, warum du noch eine key.txt machst? Zudem diese ausgelesen werden kann, und wenn ein User das Forumlar aufruft und zwischen dem Überprüfen wiederum ein anderer User auf dem Formular war, der Key geändert worden ist.

Ansonsten super, den Font wollt ich schon lange mal ändern, werd ich auch bei den anderen Scripten machen und das man seine eignen Zeichen wählen kann, ist ein grosser Vorteil.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
frameguard



Anmeldedatum: 05.03.2007
Beiträge: 117
Wohnort: Wien

BeitragVerfasst am: 15.04.2007, 16:26    Titel: Antworten mit Zitat

Stimmt, an das hatte ich gar nicht gedacht. Ich überleg mir da eine andere Lösung. Aber prinzipiell halte ich es schon für sicherer, wenn der key immer neu generiert wird.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Rob [Admin]
Site Admin


Anmeldedatum: 23.12.2006
Beiträge: 132

BeitragVerfasst am: 15.04.2007, 17:51    Titel: Antworten mit Zitat

Da die Sessionen nur serverseitig gespeichert werden, müssen Sie auch nicht zwingend verschlüsselt werden, denn wer Zugriff auf den Server und die Sessionen hat, der braucht kein blödes Kontaktformular mehr zu umgehen, der kann dann den ganzen Server übernehmen, daher ist die Verschlüsselung nicht wichtig im Prinzip.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
frameguard



Anmeldedatum: 05.03.2007
Beiträge: 117
Wohnort: Wien

BeitragVerfasst am: 15.04.2007, 19:32    Titel: Antworten mit Zitat

Stimmt auch wieder. Ich nehm die Speicherung vom Key einfach wieder raus.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
TheGear



Anmeldedatum: 10.12.2007
Beiträge: 7

BeitragVerfasst am: 10.12.2007, 17:04    Titel: Antworten mit Zitat

Mal Anmerkungen von mir zu dem Tutorial, also das Tutorial auf der Seite hat überhaupt nicht funktioniert bei mir weder Lokal auf dem Webserver, noch auf meinem Webspace.

Dann hab ich das Forum entdeckt und den Code übernommen, siehe da es funktioniert.

Problem: Es funktioniert nur Lokal.
Auf meinem Webspace wird kein Bild angezeigt.
GD Lib und alles was dazugehört ist an.

Wo könnte der Fehler liegen ?
Version Lokal 5.2.x
Version Webspace 4.3.x http://power-programing.de/gb.php

Hier noch ein Testscript http://thegear.de/cap/
Der Code

Code:

<?php
session_start();

function encrypt($string, $key)
{
   $result = '';
   for($i=0; $i<strlen($string); $i++)
   {
      $char = substr($string, $i, 1);
      $keychar = substr($key, ($i % strlen($key))-1, 1);
      $char = chr(ord($char)+ord($keychar));
      $result.=$char;
   }
   return base64_encode($result);
}

$sicherheits_eingabe = encrypt($_POST["sicherheitscode"], '8t3479u97'); // key sollte ident sein mit captcha.php
$sicherheits_eingabe = str_replace("=", "", $sicherheits_eingabe);

if(isset($_SESSION['captcha_spam']) && $sicherheits_eingabe == $_SESSION['captcha_spam'])
{
   unset($_SESSION['captcha_spam']);

   $msg = "Code Richtig!";
}
else
{
   $msg = "Code Falsch!";
}
?>
<!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=iso-8859-1" />
<title>Unbenanntes Dokument</title>
</head>

<body>
<br />
<img src="captcha/captcha.php" border="0" title="Sicherheitscode">
<form action="<?php echo $_REQUEST["PHP_SELF"]; ?>" method="post"/>
   
   <input type="text" name="sicherheitscode" size="5">
   <input type="submit" name="submitButtonName" value="Senden" />
</form>
<?php echo $msg; ?>
</body>
</html>


Die anderen Daten sind die selben, wie gesagt Lokal gehts un-lokal gehts nicht hoffe es kann einer helfen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
frameguard



Anmeldedatum: 05.03.2007
Beiträge: 117
Wohnort: Wien

BeitragVerfasst am: 10.12.2007, 17:31    Titel: Antworten mit Zitat

Da gibt es zwei mögliche Ursachen:
1. Die captcha.php - der Pfad zur Schriftart bzw. dessen Schreibweise ist manchmal haarig, wenn die entsprechende Systemvariable nicht vorhanden bzw. nicht korrekt belegt ist. Kommt immer wieder vor.
Da hilft dann nur experimentieren.
2. Der Server: Ich weiß nicht, warum, aber manche Server blockieren die Verwendung eigener Schriftarten (also .ttf-Dateien) für Captchas. In dem Fall versuch's am besten mit einem Rechen-Captcha, das braucht keine eigene Schriftart.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
TheGear



Anmeldedatum: 10.12.2007
Beiträge: 7

BeitragVerfasst am: 10.12.2007, 18:43    Titel: Antworten mit Zitat

Das Rechen captcha funktioniert wunderbar, danke !
Auf der Seite das Tutorial hat, wie es mir scheint ein fehler.

Undzwar im dem Teil(Seite):
Code:

header('Content-type: image/png');
   $img = ImageCreateFromPNG('captcha.PNG'); //Backgroundimage
   $color = ImageColorAllocate($img, 0, 0, 0); //Farbe
   $ttf = $_SERVER['DOCUMENT_ROOT']."/captcha/XFILES.TTF"; //Schriftart <-- pfad falsch :)
   $ttfsize = 25; //Schriftgrösse
   $angle = rand(0,5);
   $t_x = rand(5,30);
   $t_y = 35;
   imagettftext($img, $ttfsize, $angle, $t_x, $t_y, $color, $ttf, $text);
   imagepng($img);
   imagedestroy($img);

Forum(Funktioniert lokal)
Code:
header('Content-type: image/png');
   $img = ImageCreateFromPNG('captcha.PNG'); //Backgroundimage
   $color = ImageColorAllocate($img, 255, 255, 0); //Farbe
   $ttf = $_SERVER['Document_Root']."XFILES.TTF"; //Schriftart <-- richtig
   $ttfsize = 25; //Schriftgrösse
   $angle = rand(0,5);
   $t_x = rand(5,30);
   $t_y = 35;
   imagettftext($img, $ttfsize, $angle, $t_x, $t_y, $color, $ttf, $text);
   imagepng($img);
   imagedestroy($img);


Zuletzt bearbeitet von TheGear am 11.12.2007, 11:21, insgesamt 2-mal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
frameguard



Anmeldedatum: 05.03.2007
Beiträge: 117
Wohnort: Wien

BeitragVerfasst am: 10.12.2007, 19:02    Titel: Antworten mit Zitat

Mir deucht, Du hast recht. Ups. Embarassed
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
TheGear



Anmeldedatum: 10.12.2007
Beiträge: 7

BeitragVerfasst am: 11.12.2007, 11:21    Titel: Antworten mit Zitat

Hab nochmal editiert wo der Fehler ist ^^. Allerdings funktioniert das auf meinem Webspace immernoch nicht, leider.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
frameguard



Anmeldedatum: 05.03.2007
Beiträge: 117
Wohnort: Wien

BeitragVerfasst am: 11.12.2007, 17:41    Titel: Antworten mit Zitat

Hast Du noch einen anderen php-fähigen Webspace, wo Du einen Gegencheck machen kannst? (Sprich: Selbe Ordnerstruktur etc. hochladen, ausprobieren ob's dort geht) - Wenn's nämlich am Server liegt, findest es so raus.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
TheGear



Anmeldedatum: 10.12.2007
Beiträge: 7

BeitragVerfasst am: 12.12.2007, 14:06    Titel: Antworten mit Zitat

http://thegear.th.funpic.de/cap/
wie man sieht, sieht man nichts Smile, aber ich glaub wenns auf meinem bezahltem webspace nicht geht, gehts bei Funpic erst recht nicht.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
frameguard



Anmeldedatum: 05.03.2007
Beiträge: 117
Wohnort: Wien

BeitragVerfasst am: 12.12.2007, 17:39    Titel: Antworten mit Zitat

Da ist was dran. *g*
Ruf einmal die captcha.php direkt auf (also zB http://dein-webspace.de/captcha/captcha.php) und schau, was für eine Fehlermeldung kommt. Die hilft uns vielleicht weiter.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Stoppt-den-Spam.info Foren-Übersicht -> Sonstiges Alle Zeiten sind GMT
Gehe zu Seite 1, 2, 3  Weiter
Seite 1 von 3

 
  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
You can attach files in this forum
You can download files in this forum