ZoRaC Skrevet 28. mai 2006 Del Skrevet 28. mai 2006 (endret) Har et script for å generere "visual confirmation" som jeg skal bruke på gjestebøker og andre skript jeg har laget, men har et lite problem, hvordan "sende" stringen til scriptet, uten å ha den i HTML-koden (for da kan jo boter lett finne den) antibot.php: <?php // Print the image if ($_GET['action'] == "print") { $verify = new ImageVerify(); $verify->createImage($_GET['string']); } class ImageVerify { function createString($Code) { $comp_string = ""; for($i=0;$i<4;$i++) { $str = $Code[$i]; if (rand(1,2)==1) $str = strtolower($str); else $str = strtoupper($str); $comp_string .= $str; } return $comp_string; } function createImage($Code) { $image = imagecreatetruecolor(130, 35); // Noise background for($x=0;$x<imagesx($image);$x++){ for($y=0;$y<imagesy($image);$y++){ if (rand(1,5) == 4 ) $nm = rand(0, 80); else $nm = rand(190, 230); $col = imagecolorallocate($image, $nm, $nm, $nm); imagesetpixel($image, $x, $y, $col); imagecolordeallocate($image, $col); } } // Border $nm = rand(140, 160); $col = imagecolorallocate($image, $nm, $nm, $nm); imagerectangle($image, 0,0, imagesx($image)-1 , imagesy($image)-1, $col); imagecolordeallocate($image, $col); for($i=0;$i<4;$i++) { $nm = rand(0, 50); $col = imagecolorallocate($image, $nm, $nm, $nm); $str = $Code[$i]; imagettftext($image, rand(16,24), rand(-10, 20), 13+(30*$i), rand(25, imagesy($image)-5 ), $col, "fonts/ARIAL.TTF", $str); imagestring($image, $font, 5+(26*$i), rand(2, imagesy($image)-30 ), $str, $col); imagecolordeallocate($image, $col); $comp_string .= $str; } imagejpeg($image); } function verifyString($string_entered, $md5_string) { if ($md5_string === md5($string_entered)) return true; else return false; } } $charset = "AabDdEeGgHhLMmNnqRrT2345679"; $charset = preg_split("//", $charset, -1, PREG_SPLIT_NO_EMPTY); shuffle($charset); ?> Kalles slik: require_once('antibot.php'); $verify = new ImageVerify; $string = $verify->createString($charset); $md5_string = md5($string); <img src="antibot.php?action=print&string=<?php echo $string; ?>" border="0"> Men, ønsker ikke at $string skal settes i img-tagen, men $string er ikke tilgjengelig i antibot.php når den "inkluderes" via <img>. Hvordan løse dette lettest mulig? Tenkte på session, men ønsker egentlig ikke å bruk det... Endret 28. mai 2006 av ZoRaC Lenke til kommentar
ZoRaC Skrevet 28. mai 2006 Forfatter Del Skrevet 28. mai 2006 Bruker ikke SQL nei...? Den koden der er den komplette koden jeg bruker. Har laget en løsning nå, men da bruker jeg SESSIONS og det ønsker jeg egentlig ikke, for da må jeg starte session på sidene jeg bruker det og det hender det "krasjer" med andre headers, osv.... Lenke til kommentar
Ernie Skrevet 28. mai 2006 Del Skrevet 28. mai 2006 Som du sikkert har skjønt må den strengen lagres utilgjengelig for "brukeren". I klartekst vil det si enten database, session eller som utilgjengelig fil på serveren. Å lagre det i database er meget vanlig og tabellen vil i såfall inneholde en hash/unik id som tilhører strengen samt strengen i seg selv. Lenke til kommentar
ZoRaC Skrevet 28. mai 2006 Forfatter Del Skrevet 28. mai 2006 (endret) Endte opp med SESSION, se her: http://www.reinsveien.com/test/antibot/antibot.phps http://www.reinsveien.com/test/antibot/antibot-test.phps Se det i "action": http://www.reinsveien.com/test/antibot/antibot-test.php Endret 28. mai 2006 av ZoRaC Lenke til kommentar
muffe Skrevet 31. mai 2006 Del Skrevet 31. mai 2006 Her er en alternativ løsning: - Generer en tilfeldig string (f eks. 'aj3yt') - Legg på en seed-string - MD5 stringen med seed - Ta utgangspunkt i originalstringen, og lag bildet ditt - Legg den MD5-ede stringen i et hidden-felt i skjemaet ditt. - Når brukeren har skrevet inn en kode (som vist på bildet), legg på den samme seed-stringen og MD-5 den - Kontroller de to MD5'ede stringene, og se om de matcher. Mener at det skulle være rimelig sikkert. Lenke til kommentar
genstian Skrevet 31. mai 2006 Del Skrevet 31. mai 2006 Da må du jo lagre seed strengen et sted. Lenke til kommentar
ZoRaC Skrevet 31. mai 2006 Forfatter Del Skrevet 31. mai 2006 (endret) Muffe: Høres ut som en god idè! Får se om jeg orker å skrive om koden igjen... Hotstian: Kan jo sette $seed_string fast i antibot.php? Endret 31. mai 2006 av ZoRaC Lenke til kommentar
ZoRaC Skrevet 31. mai 2006 Forfatter Del Skrevet 31. mai 2006 Hmm... Problemet er å "sende" stringen til scriptet får å få skrevet bildet uten å lagre stringen i SESSION. // Print the image if ($_GET['action'] == "print") { $verify = new ImageVerify(); $verify->createImage($_SESSION['string']); } Lenke til kommentar
Peter Skrevet 31. mai 2006 Del Skrevet 31. mai 2006 (endret) EDIT: err, hva er det jeg egentlig snakker om... Du kan sende den som en hidden field i formen, hashet med md5. Dermed kan ikke botene gjette stringen, og du kan bare sammenligne stringen klienten har skrevet inn med md5-strengen du sendte med. (Du må selvsagt md5-hashe strengen klienten skrev inn også før du sammenligner) Endret 31. mai 2006 av Nazgul Lenke til kommentar
ZoRaC Skrevet 31. mai 2006 Forfatter Del Skrevet 31. mai 2006 Ja, men for å få skrevet teksten i bildet kan jeg jo ikke sende den hashet, for da vet jo ikke scriptet hva det skal skrive... Lenke til kommentar
genstian Skrevet 31. mai 2006 Del Skrevet 31. mai 2006 Kall heller scriptet slik: <?php require_once('antibot.php'); $string = $verify->createString($charset); $verify = new ImageVerify(); ob_start(); $verify->createImage($string); $image = base64_encode(ob_get_contents()); ob_end_clean(); //Set session her. } ?> <img src="data:image/png;base64,<?php echo $image; ?>" border="0"> Lenke til kommentar
ZoRaC Skrevet 31. mai 2006 Forfatter Del Skrevet 31. mai 2006 Løser det problemet med caching? Har aldri brukt ob-funksjoner... Lenke til kommentar
Peter Skrevet 31. mai 2006 Del Skrevet 31. mai 2006 du kan jo sende seed-teksten i klartekst da, men skjønner egentlig ikke hvorfor du trenger den. Knekking av md5-strenger baserer seg på å se etter mønster, det er umulig når du bare får se hashen én gang. Du skal stoppe en bot, ikke et hacker-angrep. Hvorfor kan du ikke lagre i sessions isåfall? Slik ville jeg gjort det: Generer random streng Lag bilde med strengen og "støy" rundt Hash strengen med md5 eller sha1 Legg hashen som hidden field i formen Sammenlign hashet bruker-input med hashen du sendte som hidden field Lenke til kommentar
ZoRaC Skrevet 31. mai 2006 Forfatter Del Skrevet 31. mai 2006 Akkurat slik jeg har gjort det nå Nazgul. Litt mer "styr" med sessions, putte inn "session_start();" der jeg skal bruke det, osv. Det kan igjen skape litt trøbbel med cookies og andre headers om man ikke passer på... Lenke til kommentar
robgar Skrevet 3. mai 2007 Del Skrevet 3. mai 2007 Jeg hvet ikke hvordan siden din er helt bygget opp, men om du har en fil som blir kalt i toppen av alle filer som skal brukes, kan du bare ha session_start(); i den og passe på at den blir kalt i alle filer du bruker så slipper du å tenke på header problemer i og med at session_start(); alltid er øverst i filen. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå