Gå til innhold

Problemer med antibot-script


Anbefalte innlegg

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 av ZoRaC
Lenke til kommentar
Videoannonse
Annonse

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

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

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

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

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 av Nazgul
Lenke til kommentar

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

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:

  1. Generer random streng
  2. Lag bilde med strengen og "støy" rundt
  3. Hash strengen med md5 eller sha1
  4. Legg hashen som hidden field i formen
  5. Sammenlign hashet bruker-input med hashen du sendte som hidden field

Lenke til kommentar

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å... :p

Lenke til kommentar
  • 11 måneder senere...

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...