power-box.de
-


Hinweise


Antwort
 
LinkBack Themen-Optionen Thema durchsuchen Thema bewerten
Alt 12.02.2006, 22:25   #1
TP-Member
 
Registriert seit: Oct 2005
*Wishmaster* macht alles soweit korrekt

[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:
PHP-Code:
echo $ns[1]; 
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
*Wishmaster* ist offline   Mit Zitat antworten


Alt 12.02.2006, 23:05   #2
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User
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.
__________________

Typo3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer
steffenk ist offline   Mit Zitat antworten
Alt 13.02.2006, 14:00   #3
TP-Member
 
Registriert seit: Oct 2005
*Wishmaster* macht alles soweit korrekt
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
PHP-Code:
ImagePNG(); 
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
*Wishmaster* ist offline   Mit Zitat antworten
Alt 13.02.2006, 20:52   #4
TP-Member
 
Registriert seit: Oct 2005
*Wishmaster* macht alles soweit korrekt
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.
*Wishmaster* ist offline   Mit Zitat antworten
Alt 14.02.2006, 15:56   #5
TP-Specialist
 
Benutzerbild von rewboss
 
Registriert seit: Mar 2005
Ort: Unterfranken
rewboss ist ein richtiges Arbeitstier - DANKErewboss ist ein richtiges Arbeitstier - DANKErewboss ist ein richtiges Arbeitstier - DANKErewboss ist ein richtiges Arbeitstier - DANKErewboss ist ein richtiges Arbeitstier - DANKErewboss ist ein richtiges Arbeitstier - DANKE
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.
rewboss ist offline   Mit Zitat antworten
Alt 14.02.2006, 16:17   #6
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User
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.
__________________

Typo3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer
steffenk ist offline   Mit Zitat antworten
Alt 14.02.2006, 16:28   #7
TP-Member
 
Registriert seit: Oct 2005
*Wishmaster* macht alles soweit korrekt
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?
*Wishmaster* ist offline   Mit Zitat antworten
Alt 14.02.2006, 16:31   #8
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User
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.
__________________

Typo3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer
steffenk ist offline   Mit Zitat antworten
Alt 14.02.2006, 17:58   #9
TP-Member
 
Registriert seit: Oct 2005
*Wishmaster* macht alles soweit korrekt
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).
*Wishmaster* ist offline   Mit Zitat antworten
Alt 15.02.2006, 13:46   #10
TP-Member
 
Registriert seit: Oct 2005
*Wishmaster* macht alles soweit korrekt
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 01);
$ns[1] = substr($code 11);
$ns[2] = substr($code 21);
$ns[3] = substr($code 31);
$ns[4] = substr($code 41);
$ns[5] = substr($code 51);
$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 ($image20rand(-20,20), 5,$ns_y$color[rand(1,10)], $schriftart$ns[0]);
ImageTTFText ($image20rand(-20,20), 2*$faktor-$faktor$ns_y$color[rand(1,10)], $schriftart$ns[1]);
ImageTTFText ($image20rand(-20,20), 3*$faktor-