 |
| Hinweise |
Willkommen im TP-Hilfe-Forum!Dies ist ein Forum zu den Themen Photoshop, Dreamweaver, Flash, Selbständigkeit und mehr, in dem Du Hilfe, Anleitung oder eine Lösung zu Deinen Problemen erhältst. Aktuell bist Du in unseren Foren als Gast mit reinen Leserechten unterwegs. Wenn Du Dich registrierst, kannst Du eigene Themen verfassen, Deine Frage stellen und privat mit anderen TPlern kommunizieren. Weitere Foren werden zugänglich, und Du wirst – falls gewünscht – per Mail über neue Beiträge informiert. Die Registrierung ist schnell und kostenlos. Sollten bei der Registrierung Fragen auftauchen, reicht ein Klick in unsere Hilfe - Häufig gestellte Fragen oder eine kurze Mitteilung an das Support-Team. Viel Spaß bei Traum-Projekt.com |
12.02.2006, 22:25
|
#1
|
|
TP-Member
Registriert seit: Oct 2005
|
[php] Sicherheitscode zum Schutz vor Bots
Hallo habe mir folgendes zusammengebastelt:
PHP-Code:
<?php
$width = 70;
$height = 25;
$font = 5;
$pool .= "23456789";
$pool .= "WERTUPLKJHGFDSAXCVBNM";
srand ((double)microtime()*1000000);
for($index = 0; $index < 6; $index++)
{
$ns.= substr($pool,(rand()%(strlen ($pool))), 1);
}
$image = ImageCreateFromPNG("code.png");
$ns_x = ($width - (imagefontwidth($font) * strlen($ns))) / 2;
$ns_y = ($height - imagefontheight($font)) / 2;
$color[1] = imagecolorallocate($image,255,255,255);
$color[2] = imagecolorallocate($image,205,209,243);
$color[3] = imagecolorallocate($image,20,165,240);
$color[4] = imagecolorallocate($image,108,142,240);
$color[5] = imagecolorallocate($image,180,237,243);
$color[6] = imagecolorallocate($image,175,189,199);
$color[7] = imagecolorallocate($image,183,202,225);
$color[8] = imagecolorallocate($image,222,183,255);
$color[9] = imagecolorallocate($image,198,218,254);
$color[10] = imagecolorallocate($image,232,224,254);
$num = rand(1,10);
imagestring($image,$font,$ns_x,$ns_y,$ns[0],$color[$num]);
$num = rand(1,10);
imagestring($image,$font,$ns_x*2*1.2,$ns_y,$ns[1],$color[$num]);
$num = rand(1,10);
imagestring($image,$font,$ns_x*3*1.2,$ns_y,$ns[2],$color[$num]);
$num = rand(1,10);
imagestring($image,$font,$ns_x*4*1.2,$ns_y,$ns[3],$color[$num]);
$num = rand(1,10);
imagestring($image,$font,$ns_x*5*1.2,$ns_y,$ns[4],$color[$num]);
$num = rand(1,10);
imagestring($image,$font,$ns_x*6*1.2,$ns_y,$ns[5],$color[$num]);
ImagePNG($image);
?>
Das funktioniert wunderbar. Aber ich muss mir ja $ns wo die Buchstaben drinne stehen wieder ausgeben und wenn ich sowas mach:
funktioniert es nicht! Wenn ich es vor
PHP-Code:
ImagePNG($image);
setze kommt irgendwie was verschlüsseltes und danach passiert ncihtsmehr das sicherheitsbild erscheint also nichtmehr. Und wenn ichs danach mache wird mir nichts ausgegeben.
Weiß jemand um rat? Wär ganz gut...
Danke schonmal im Vorraus 
|
|
|
12.02.2006, 23:05
|
#2
|
|
TP-Special Mod
Registriert seit: Feb 2005
Ort: Haan / NRW
|
Du machst ja $ns.= d.h. Du hängst alles an einen String. Wenn Du ein Array möchtest, muss die Anweisung $ns[]= lauten. Der erste Index ist übrigens 0.
|
|
|
13.02.2006, 14:00
|
#3
|
|
TP-Member
Registriert seit: Oct 2005
|
Danke schonmal!
Mh habe das jetzt mal so geändert das es in einem Array liegt. Aber es ändert nichts an der situation:
PHP-Code:
<?php
$width = 130;
$height = 25;
$font = 5;
$pool = "23456789WERTUPLKJHGFDSAXCVBNM";
$ns = array();
srand ((double)microtime()*1000000);
for($index = 0; $index < 6; $index++)
{
$ns[$index] = substr($pool,(rand()%(strlen ($pool))), 1);
}
$image = ImageCreateFromPNG("code.png");
$ns_x = 10;
$ns_y = ($height - imagefontheight($font)) / 2;
$color[1] = imagecolorallocate($image,255,255,255);
$color[2] = imagecolorallocate($image,205,209,243);
$color[3] = imagecolorallocate($image,20,165,240);
$color[4] = imagecolorallocate($image,108,142,240);
$color[5] = imagecolorallocate($image,180,237,243);
$color[6] = imagecolorallocate($image,175,189,199);
$color[7] = imagecolorallocate($image,183,202,225);
$color[8] = imagecolorallocate($image,222,183,255);
$color[9] = imagecolorallocate($image,198,218,254);
$color[10] = imagecolorallocate($image,232,224,254);
$num = rand(1,10);
imagestring($image,$font,$ns_x,$ns_y,$ns[0],$color[$num]);
$num = rand(1,10);
imagestring($image,$font,$ns_x*2*2-$ns_x,$ns_y,$ns[1],$color[$num]);
$num = rand(1,10);
imagestring($image,$font,$ns_x*3*2-$ns_x,$ns_y,$ns[2],$color[$num]);
$num = rand(1,10);
imagestring($image,$font,$ns_x*4*2-$ns_x,$ns_y,$ns[3],$color[$num]);
$num = rand(1,10);
imagestring($image,$font,$ns_x*5*2-$ns_x,$ns_y,$ns[4],$color[$num]);
$num = rand(1,10);
imagestring($image,$font,$ns_x*6*2-$ns_x,$ns_y,$ns[5],$color[$num]);
ImagePNG($image);
echo "Hallo ".$ns[0].$ns[1].$ns[2].$ns[3].$ns[4].$ns[5];
?>
Da wo jetzt
PHP-Code:
echo "Hallo "......;
steht will ich mir das alles als Text ausgeben lassen aber es passiert einfach nichts...
Wenn ich diesen Befehl vor bekomm ich irgendwas verschlüsseltes und das Bild wird nichtmehr angezeigt. Das verschlüsselte sieht so aus:
Code:
Hallo MPLHJV‰PNG IHDR‚rÀa*dIDATxœíšËnÛF†?Äy„<‡-J$%·œWé6‹YH±%Ë–+ºÑŠ.ºÊ¦(¢]ì”ÄÎE±«è ÊN˼@Ý.Fg2Ô…"¥¶ðŒxžf¾sΘ;w~‡HCìRé’à@’µÚ'H€ .XžwË{{Ħ6ww{bº`5›§O¦>üIp!N¡Ð2°7D.w W»`W*ïäѰÀ[^–€¤¤+±94Å9ÊWV½~"cÚT¥ò^tœ|þ¸ð¬¡ÄÙÜ|-W¸†tŽz³y*J˜/».¸¥ÒØVJ¬¯¿VUÕT,¾1•¨V»Ôkµ>ƒuáy%LÏ;3”P »RÂ{{ûÐPÂÍ垃‹Ì‘´¡–6Ǹ¨„ç]†¼ ¦µC%ªÕ®8Ö{kë*P n6»ÏÆÆKiJƒ].€Áò¼x9 ƒO‰fS+á@rgç£©Äæækp Hv¡Ð1*À •° Q2˜ú âØ!¢ …ŽNß =†ær –66^Ž"z{û*á@êÑ£OÜ?ù²ò¬VkÕ¦gƒþùøò«n<ùzãÉ×ù<ÒîtÛ®ù«j‰ô¨¿öÿÑGÈ÷êÔÁ’j©Õ‚%÷Áƒàø]*ËQ²V;VNWJxÞ™aÎî™tkBGgÞ+2Ì36E† aB>Jdu±ù½*X’–¤ÓF°äCt.w@>ÿÊŸ»½7•Ð~9ÂôÌèÖTa¦ÝkÈY C†©ÂDš!/ö¯Õj}–,ù],¾1횈ž»é© '!ÃŒžé± Ì´{õ¢4‡zìòQzQŠ®„-çß‚%ÑÁõlö^±Xs–îÞý©Zõàoä¯ÕúEN—äDýºtëÖ{{¿N1ýÞ :èŸú=àé³?Ãß;ý×Ù÷¶;Û¯ÝñÚÇQú¼P7ü/h4~6[©4ļ–ÍÞËç·àµhDˆNŽ ZO‚¨ˆž³ŽheFB´^¢õl¬g¸ëë¡mæn‹ :¼ ®"¢M% *Ø“}èGôóPˆ6Ë«‹ :¼ .Ñ&“#!z<L÷×3þ Dë,zD‡÷æ"Z»^DÌÝÌÕØ¬LdÑ£ˆž‘E+§›åU½(…œžs¬ÈZ†‘#ä½ã$&dî6ÇÜÝí+Òø–ÃÄ,:EºãòjXs¬Ð½pºç2Õ¨µ Dreamweaverű Ý3 ÝÇq¡;ôräS"r¡;8X2 Ýñ^ôl0ˆiƒÕhŒïE§Æö¢ DìEïìÄ{Ñsƒ!h/ºžº½ßÇ{Ñÿ¢'ån¶ÃýûÏÀnšú_ –ÒjßM‚%lX‘`É,Ë»c3Ëe®TØ™Üm¸¿)¹Û*dÀº}û··n5÷·t*IEND®B`‚
Es sieht so aus als würde er die Bildinformationen noch mit ausspucken... und das MPLHJV die Buchstaben wären die geschrieben worden wären...
Weiß aber nicht worann das liegt bzw. wie ichs ändern kann
|
|
|
13.02.2006, 20:52
|
#4
|
|
TP-Member
Registriert seit: Oct 2005
|
Habe grad rausgefunden das der Code so nur im IE funktioniert im Mozilla und in Opera zeigt er mir denselben fehler wie im IE wenn ich mir dort ns[0]-ns[6]
ausgeben lassen will.
Also das bild in schrift und nicht als grafik.
|
|
|
14.02.2006, 15:56
|
#5
|
|
TP-Specialist
Registriert seit: Mar 2005
Ort: Unterfranken
|
Ich kenne mich hier nicht sonderlich gut aus, aber da sich sonst keiner traut...
Soweit ich weiß, besteht das Problem u.a. auch darin, dass ein PHP-Skript nur eine Datei ausgeben kann. Du versuchst hier Text und Bild auszugeben, darüber hinaus mit dem MIME-Type text/html. Nicht-IE-Browser zeigen also Text an, der IE erkennt, dass das Kauderwelsch ist und erkennt die Datei als PNG-Datei nur so lange, du nicht auch Text ausgibst. Dann gibt auch der IE auf.
Du brauchst zwei verschiedene Dateien. Nennen wir die captcha.php, die die Bilddatei erzeugt, und skript.php, die den HTML-Code ausgibt.
skript.php gibt dann HTML aus, unter anderem diesen Tag:
Code:
<img src="captcha.php?text=ABCD">
captcha.php nimmt also den Wert der Variable $_GET['text'] und erzeugt damit das Bild, das dann in die Seite eingebunden wird.
Wichtig ist, dass der erste Befehl in captcha.php so lautet:
Code:
header("Content-type: image/png");
Dann weiß der Browser bescheid, dass es sich um eine PNG-Datei handelt.
|
|
|
14.02.2006, 16:17
|
#6
|
|
TP-Special Mod
Registriert seit: Feb 2005
Ort: Haan / NRW
|
womit Du jetzt wieder in der Spur wärst ...
den header des Dokumentes hat uns der Ersteller ja verschwiegen, womit sich zeigt: Es sind nicht immer die Stellen auch richtig, wo man den Fehler vermutet.
|
|
|
14.02.2006, 16:28
|
#7
|
|
TP-Member
Registriert seit: Oct 2005
|
Dankeschön es scheint zu funktionierten zumindest das mir im IE jetz auch der Code ausgegeben wird mit den andern Browsern probier ich gleich auchnoch direkt...
Nur eine blöde frage im Quelltext steht ja dann sowas in der art
Code:
<img src="code_genpic.php?code=YEJNCN">
Kann der Bot da nicht einfach den Code rausfischen?
|
|
|
14.02.2006, 16:31
|
#8
|
|
TP-Special Mod
Registriert seit: Feb 2005
Ort: Haan / NRW
|
wenn er schlau ist ...  aber welcher Bot ist schon schlau.
Es wird aber eine Zeit kommen, wo die Bots das alle können. Also generier Deine Buchstabenfolge lieber in dem php-script und schreibs in die Session.
|
|
|
14.02.2006, 17:58
|
#9
|
|
TP-Member
Registriert seit: Oct 2005
|
Vielen dank an euch beide!
Bin froh das es jetzt shconmal soweit klappt.
Aber kann mir einer sagen wie ich was in die Sessions schreibe und wieder aubrufe falls es nicht allzukompliziert wird.
Weil irgendwie weiß ich nun absolut nicht wie ich das anstellen soll ^^
EDIT: Sorry hab grad gesucht und ein einfaches Tutorial gefunden. Jetzt klappt alles wunderbar.
Vielen dank nochmal an euch beide für die schnelle und gute Hilfe!
Geändert von *Wishmaster* (14.02.2006 um 18:17 Uhr).
|
|
|
15.02.2006, 13:46
|
#10
|
|
TP-Member
Registriert seit: Oct 2005
|
Mh wenn ich das erste mal aufrufe wird nichts gemacht also der Code bleibt "leer" oder wenn ich die seite direkt aufrufe weil die Sessions ja erst am ende der Seite übergeben werden.
Kann man das sonst noch übergeben hier mal mein bisheriger Code:
´
code.php
PHP-Code:
<?php
include ("code_gencode.php");
echo "<img src=\"code_genpic.php\">";
echo "<br><input type=\"text\" name=\"code\" size=\"37\"><input type=\"hidden\" name=\"codecheck\" value=\"$code2\">";
?>
code_gencode.php
PHP-Code:
<?
session_start();
$pool = "23479WERTUZPLKJHFDAYXCVNM";
$ns = array();
srand ((double)microtime()*1000000);
for($index = 0; $index < 6; $index++)
{
$ns[$index] = substr($pool,(rand()%(strlen ($pool))), 1);
}
$code=$ns[0].$ns[1].$ns[2].$ns[3].$ns[4].$ns[5];
$code2 = md5($code);
session_register("check");
$check = $code;
?>
code_genpic.php
PHP-Code:
<?php
header('Content-Type: image/png');
session_start();
$code = $check;
$ns[0] = substr($code , 0, 1);
$ns[1] = substr($code , 1, 1);
$ns[2] = substr($code , 2, 1);
$ns[3] = substr($code , 3, 1);
$ns[4] = substr($code , 4, 1);
$ns[5] = substr($code , 5, 1);
$width = 200;
$height = 50;
$image = ImageCreateFromPNG("code.png");
$schriftart ="../fonts/reclaimthestreets.ttf"; //Pfad zur Schriftart
$ns_x = 10;
$ns_y = 35;
$faktor=32.5;
$color[1] = imagecolorallocate($image,216,215,227);
$color[2] = imagecolorallocate($image,179,177,198);
$color[3] = imagecolorallocate($image,135,135,193);
$color[4] = imagecolorallocate($image,142,133,169);
$color[5] = imagecolorallocate($image,199,198,214);
$color[6] = imagecolorallocate($image,166,166,190);
$color[7] = imagecolorallocate($image,181,179,201);
$color[8] = imagecolorallocate($image,185,183,255);
$color[9] = imagecolorallocate($image,156,157,188);
$color[10] = imagecolorallocate($image,150,150,207);
ImageTTFText ($image, 20, rand(-20,20), 5,$ns_y, $color[rand(1,10)], $schriftart, $ns[0]);
ImageTTFText ($image, 20, rand(-20,20), 2*$faktor-$faktor, $ns_y, $color[rand(1,10)], $schriftart, $ns[1]);
ImageTTFText ($image, 20, rand(-20,20), 3*$faktor- | | |