| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
| Autor |
Nachricht |
frameguard
Anmeldedatum: 05.03.2007 Beiträge: 117 Wohnort: Wien
|
Verfasst am: 11.04.2007, 17:17 Titel: Gemischtes Captcha (Tutorial) |
|
|
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 |
|
 |
apophis171
Anmeldedatum: 02.04.2007 Beiträge: 16 Wohnort: Rathenow
|
Verfasst am: 12.04.2007, 13:01 Titel: |
|
|
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 |
|
 |
frameguard
Anmeldedatum: 05.03.2007 Beiträge: 117 Wohnort: Wien
|
Verfasst am: 12.04.2007, 13:14 Titel: |
|
|
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.  |
|
| Nach oben |
|
 |
Rob [Admin] Site Admin
Anmeldedatum: 23.12.2006 Beiträge: 132
|
Verfasst am: 15.04.2007, 15:11 Titel: |
|
|
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 |
|
 |
frameguard
Anmeldedatum: 05.03.2007 Beiträge: 117 Wohnort: Wien
|
Verfasst am: 15.04.2007, 16:26 Titel: |
|
|
| 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 |
|
 |
Rob [Admin] Site Admin
Anmeldedatum: 23.12.2006 Beiträge: 132
|
Verfasst am: 15.04.2007, 17:51 Titel: |
|
|
| 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 |
|
 |
frameguard
Anmeldedatum: 05.03.2007 Beiträge: 117 Wohnort: Wien
|
Verfasst am: 15.04.2007, 19:32 Titel: |
|
|
| Stimmt auch wieder. Ich nehm die Speicherung vom Key einfach wieder raus. |
|
| Nach oben |
|
 |
TheGear
Anmeldedatum: 10.12.2007 Beiträge: 7
|
Verfasst am: 10.12.2007, 17:04 Titel: |
|
|
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 |
|
 |
frameguard
Anmeldedatum: 05.03.2007 Beiträge: 117 Wohnort: Wien
|
Verfasst am: 10.12.2007, 17:31 Titel: |
|
|
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 |
|
 |
TheGear
Anmeldedatum: 10.12.2007 Beiträge: 7
|
Verfasst am: 10.12.2007, 18:43 Titel: |
|
|
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 |
|
 |
frameguard
Anmeldedatum: 05.03.2007 Beiträge: 117 Wohnort: Wien
|
Verfasst am: 10.12.2007, 19:02 Titel: |
|
|
Mir deucht, Du hast recht. Ups.  |
|
| Nach oben |
|
 |
TheGear
Anmeldedatum: 10.12.2007 Beiträge: 7
|
Verfasst am: 11.12.2007, 11:21 Titel: |
|
|
| Hab nochmal editiert wo der Fehler ist ^^. Allerdings funktioniert das auf meinem Webspace immernoch nicht, leider. |
|
| Nach oben |
|
 |
frameguard
Anmeldedatum: 05.03.2007 Beiträge: 117 Wohnort: Wien
|
Verfasst am: 11.12.2007, 17:41 Titel: |
|
|
| 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 |
|
 |
TheGear
Anmeldedatum: 10.12.2007 Beiträge: 7
|
Verfasst am: 12.12.2007, 14:06 Titel: |
|
|
http://thegear.th.funpic.de/cap/
wie man sieht, sieht man nichts , aber ich glaub wenns auf meinem bezahltem webspace nicht geht, gehts bei Funpic erst recht nicht. |
|
| Nach oben |
|
 |
frameguard
Anmeldedatum: 05.03.2007 Beiträge: 117 Wohnort: Wien
|
Verfasst am: 12.12.2007, 17:39 Titel: |
|
|
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 |
|
 |
|
|
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
|
|