Avatar billede yHec Novice
04. marts 2008 - 20:27 Der er 27 kommentarer og
1 løsning

Captcha er ineffektivt

Hej Eksperter.
Mit problemer ikke AT lave en captcha, men at lave en der rent faktisk forhindrer uvelkommene bidrag i min gæstebog.

Koden ser således ud:
<?php    
session_start();
$karak=6;
//Captcha - newCode stammer fra coderdks artikel på eksperten.dk
function newCode($karak){
    // Denne funktion laver en tekst der (som regel) kan udtales
    $vowels = array_slice( preg_split( '//', 'AEYaeiy' ), 1, -1 );
    $nvowels = count( $vowels ) - 1;
    $consonants = array_slice( preg_split( '//', 'BCDFGHJKLMNPQRSTZbcdfghjkmnpqrstz1234567890' ), 1, -1 );
    $nconsonants = count( $consonants ) - 1;
    $code = "";
    $rnd = mt_rand( 0, 1 ) == 1 ? true : false;
    // Loopet herunder bygger teksten
    while (strlen( $code ) < $karak)
    {
    $code .= ($rnd ? $vowels[mt_rand(0, $nvowels)] : $consonants[mt_rand(0, $nconsonants)]);
    $rnd = !$rnd;
    }
    return $code;
}

    $code=newCode($karak);
    $arne=md5(microtime());
    $_SESSION['zzxxqqwwttyughtyureetffrgguujjikkklooommme']=$code;
    $dir="../lib/fonts/";
    $fonts=array();
    foreach(scandir($dir) as $name) {
        if (!is_dir($name)) $fonts[]=$name;
        }
    $w=200;
    $h=50;
    $im=imagecreate ($w, $h);
    $baggrund=imagecolorallocate($im,230,230,230); //lysegrå
    imagefill($im,0,0,$baggrund);
    $left=6;
    $text_to_arr=str_split($code);
    foreach($text_to_arr as $letter) {
        $text_farve = imagecolorallocate($im,mt_rand(0,180),mt_rand(0,180),mt_rand(0,180));  // Definer tekstfarve - rgb-værdier
        $ttf=$fonts[array_rand($fonts)];
        imagettftext ($im,mt_rand(24,26),mt_rand(-30,30),$left,mt_rand(25,($h-5)),$text_farve,"../lib/fonts/".$ttf,$letter);
        $left=$left+($w-30)/($karak-1);
    }
    for($i=0;$i<=($w*5);$i++) {
        $pletfarve=imagecolorallocate($im,mt_rand(0,100),mt_rand(0,100),mt_rand(0,100));
        imagesetpixel($im,mt_rand(1,$w-1),mt_rand(1,$h-1),$pletfarve);
    }

    header( 'Content-Type: image/jpeg' );ImageJpeg($im);
    ImageDestroy($im);
?>
Og et eksempel kan ses her: http://hecker.dk/lib/captcha.php

Normalt kalder jeg den i et <img>-tag.

Før havde jeg et simpelt regnestykke, og fik måske 1-3 ugentlige spams.

Siden jeg lavede denne på min side, er der kommet ca 40 i døgnet. Jeg kan ikke se, om der er en "læk", dvs om jeg et eller andet sted afslører koden i ren tekst.

Men det tror jeg altså ikke.

Det mærkelige sessionvaribelnavn, er et desperat camuflageforsøg....

Nogen tips??

/y
Avatar billede showsource Seniormester
04. marts 2008 - 21:44 #1
random navn til et hiddenfelt virker fint.
http://www.phpbegynder.dk/artikler.php?id=26&page=1

Undlad evt. javascriptet, men tjek om der postes inden du sætter random navn .....
Avatar billede erikjacobsen Ekspert
04. marts 2008 - 21:52 #2
Det gør ingen forskel hvad du kalder din sessions-variabel.

Men får du checket om teksten passer med dit billede?
Avatar billede yHec Novice
04. marts 2008 - 22:01 #3
@showsource: Jeg synes ikke det er et specielt imponerende script du henviser til... det er alt for nemt at aflure koden.

@erikjacobsen: det tænkte jeg nok.... Jeg chekker min session mod min post, på de relevante sider, hvor ovenstående er includeret.

Men det er helt EKSTEMT, som spammerne kommer igennem...

*SUK*

/y
Avatar billede erikjacobsen Ekspert
04. marts 2008 - 22:04 #4
Ja, det er ekstremt, og hvorfor skulle de interessere sig så meget for din side. Har du et link - så kan vi se om vi kan "hacke os vej igennem" ;)
Avatar billede yHec Novice
04. marts 2008 - 22:19 #5
Avatar billede showsource Seniormester
04. marts 2008 - 22:29 #6
Hvordan vil du af lure den af?
Avatar billede erikjacobsen Ekspert
04. marts 2008 - 22:34 #7
Det ved jeg heller ikke om jeg kan - men jeg kan fx dø din session. Har du fået noget spændende siden kl. 22.19 ?
Avatar billede erikjacobsen Ekspert
04. marts 2008 - 22:41 #8
Ja, så var den der. Det er mig der har skrevet noget med "test", og jeg kan ikke engang læse din captcha, så det er ikke fordi jeg har skrevet den i feltet.

Men kan du så gætte hvad der er galt ... ;)
Avatar billede erikjacobsen Ekspert
04. marts 2008 - 22:42 #9
(...og den er altså ret svær at læse... der kommer heller ikke mange indlæg, vel?...)
Avatar billede yHec Novice
04. marts 2008 - 22:44 #10
Hej Test, Test, Test.... ;-)
Hvordan gjorde du det...

Jeg gør lige captcha'en tydeligere.

Venter i spænding
Avatar billede showsource Seniormester
04. marts 2008 - 22:48 #11
y -> hvor ? :O)
Avatar billede erikjacobsen Ekspert
04. marts 2008 - 22:50 #12
Jo, ser du. Du har garanteret en linie, der ligner:

  if ($_POST['cap']==$_SESSION['et-eller-andet']) {
      ...ok
  }

Det virker så længe, der er en session i gang. Jeg fjernede session-cookien i en test, og lod være med at skrive noget i feltet. Så er den if-sætning sand, og alt er ok.

Du kan derfor (skitse):

  if ($_SESSION['et-eller-andet']<>"" && $_POST['cap']==$_SESSION['et-eller-andet']) {
      ...ok
  }
Avatar billede erikjacobsen Ekspert
04. marts 2008 - 22:52 #13
Og din spammer-ven, han kommer ikke med en session-cookie. Den ser bare sådan her ud:

Name    PHPSESSID
Value    a5336f4425e266f44f9ef42f8d9dddf6

Det er slet ikke fordi din tilfældige tekst står i den.
Avatar billede showsource Seniormester
04. marts 2008 - 22:55 #14
<?php
session_start();
$hide = "protect";

    if($_SERVER["REQUEST_METHOD"] == "POST" && isset($_SESSION[$hide])) {

        if(isset($_POST[$_SESSION[$hide]])) {
        echo $_SESSION[$hide];
        unset($_SESSION[$hide]);
        exit;
        }

    }

$_SESSION[$hide] = "php".rand();

?>
vis html med form

Den kan du ikke bare poste til
Avatar billede yHec Novice
04. marts 2008 - 22:56 #15
Ok. Du er en skræmmende mand....

"Jeg fjernede session-cookien i en test"... Øhhh, hvordan?

Men din løsning lyder god, vil jeg fluks implementerer.

Og du har helt ret mht min nuværende struktur!!!!

Så vidt jeg ved, samler du ikke på point, vel?

@Show... Som du kan se har Erikjacobsen lige givet mig en lektion - lidt morsomt... SÅ jeg er ikke lige så skråsikker ;-) Men umiddelbart, kan du vel se kilden i browseren, og se oplysningerne omkring hidden...

Jan
Avatar billede yHec Novice
04. marts 2008 - 23:00 #16
@erikjacobsen: Kan jeg overtale dig til endnu et forsøg?
Avatar billede erikjacobsen Ekspert
04. marts 2008 - 23:01 #17
Jeg samler slet ikke på point, tak. Og jeg er ikke skræmmende, hvis det var mig du mente.

Gode browsere kan indstilles til at sende det tilbage, man vil have.
Avatar billede erikjacobsen Ekspert
04. marts 2008 - 23:02 #18
Et forsøg? Kan du ikke bare vente en dag, og se at der ikke kommer 40 ?

Ok - jeg prøver at skrive, eh, hmm, "kokosnødder" i en kommentar.
Avatar billede yHec Novice
04. marts 2008 - 23:02 #19
Ok, du har skræmmende evner så. Har ofte haft fornøjelse af dine svar herinde!!!

Tager selv pointene
Avatar billede showsource Seniormester
04. marts 2008 - 23:03 #20
Ja, så det skal du gøre ved hver request, + du skal sætte session på serveren, altså være inde på den.

Men ok, jeg aner heller ikke hvad erik laver! :O)

Men med mit ex. skal spammer ha' mulighed for at sætte en session af forskelligt ("udefineret") navn ved hver request for at poste.
Om man kan det fra sin egen comp, bare så'n, kan man vel, men så behøver man vel ikek sidde og la' maskinen poste?

Og b.t.w. vil jeg tro erik får dig på rette vej til at funker for dig. :O)
Avatar billede erikjacobsen Ekspert
04. marts 2008 - 23:03 #21
Jeg får:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1
Avatar billede erikjacobsen Ekspert
04. marts 2008 - 23:07 #22
Det er igen sikkert fordi du ikke har en session-variabel et sted hvor du tror du har den.
Avatar billede yHec Novice
04. marts 2008 - 23:07 #23
Jeg ved det godt... Det er fixet
Avatar billede erikjacobsen Ekspert
04. marts 2008 - 23:10 #24
Øh, ikke helt, tror jeg. Kan du lægge en normal kommentar?
Avatar billede yHec Novice
04. marts 2008 - 23:16 #25
Ja... Men der var et lille problem ;-)

Så NU kan jeg...
Avatar billede erikjacobsen Ekspert
04. marts 2008 - 23:21 #26
Jeg ser ikke ud til at kunne hacke mig igennem. Men fortæl os om en dags tid, om det har hjulpet på spam. Der var ellers nogle links man kunne besøge, hvis man kedede sig ...
Avatar billede yHec Novice
04. marts 2008 - 23:29 #27
Det lyder godt:-)

Men jeg kan se, at jeg skal have justeret andre af mine sider...

Tak for hjælpen!

Jeg melder tilbage, men jeg kan allerede nu mærke at det har hjulpet, idet der ikke er kommet noget, siden jeg lagde din rettelse ind!

Jan

Jan
Avatar billede yHec Novice
05. marts 2008 - 06:59 #28
@erikjacobsen: Det virker, der er ikke kommet noget de sidste 8 timer!

/y
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester