Avatar billede dr-jay Nybegynder
15. februar 2007 - 19:59 Der er 10 kommentarer og
1 løsning

PHP kode til at undgå SPAM i gæstebog

Jeg anvender en gæstebogskabelon (til mit site www.ulfkoch.dk), hvor i der ikke er nogen SPAMkontrol. Jeg fandt dog hurtigt ud af at dette var nødvendigt, da jeg nu får enorme mængder SPAM i gæstebogen. Til at starte med havde jeg et felt som skulle udfyldes og hvor jeg i Javascript tjekkede om feltet indeholdte den korrekte værdi, men det hjalp ikke, da kode og dermed tjekket af feltet var tilgængelig for spammerne. Jeg ændrede det til et tjek på indhold og forsøgte så at skrive alle de ord en besked ikke måtte indeholde, i Javascript ser det således ud:

function isSpam(str)
{
    str = str.toLowerCase();
    var regex = /href|http|check|this|free|cool|thank|site|very|porn|viagra|honda|<a|anal|sex|mature|funny|the|transsexual|hentai|clip|lesbian/gi;
    return regex.test(str);
}

Men det er heller ikke effektivt nok og virker ikke optimalt. Det undre mig at der kommer beskeder i gæstebogen, som jeg ikke selv kan få lov at indsætte beskeder, fordi de bliver fanget af isSpam tjekket.

Jeg leder efter en sikker metode til at undgå SPAM evt. ved at brugeren skal indtaste en kode som random genereret i et felt.

Jeg håber på nogle har et konkret bud på en løsning.

Venligst
Jeppe
Avatar billede mccookie Seniormester
15. februar 2007 - 20:10 #1
Sæt en SESSION på forside

$_SESSION['OK'] = "1212";

der hvor du submitter til, tjekker du om du kan se session værdien.

Så submitter du indholdet og sætter endnu en session $_SESSION['kontrol_tid'] = time();

og så tjekker du blot når der submittes om kontrol_tid er sat, er den, vil du vide om det eks. er over 15 min siden den sidst er sat!

$kontrol_tid = $_SESSION['kontrol_tid'] + (15*60);

if(!$_SESSION['kontrol_tid'] + (15*60) < time()) { echo "Ikke igen DU!!!"; exit; }
Avatar billede mccookie Seniormester
15. februar 2007 - 20:13 #2
Du vil ALDRIG komme til at kunne lave et regulært udtryk som fanger noget væsentligt at det evt. input du IKKE er interesseret i!

Ellers er der den gode gamle metode med et billede hvor man skal skrive den tekst dr måtte være gemt i det...... Den er jeg modstander af, da det efter min opfattelse giver brugeren unødige opgaver......

men smag og behag
Avatar billede amite Mester
15. februar 2007 - 20:18 #3
Vil blot lige nævne at javascript i øvrigt en ubrugelig måde at tjekke efter spambotter på, da man jo frit kan vælge hvorvidt man har lyst til at følge de regler som javascriptet sætter op (da det køres client-side)

Hvis du vil lave en reg-ex udelukkelses søgning på ord, skal du gøre det server-side, f.eks. i PHP, som du nok kan se....
Avatar billede amite Mester
15. februar 2007 - 20:38 #4
Pointing med forum spambotter er i >99% af tilfældende at lave et link på din side til deres side, så hvis du gerne vil holde det simpelt kunne du jo blot søge på http fra textarea'et i din PHP kode inden du fyrede udgivelses-koden af, noget alá

$mintext = $_POST["mtxMessage"];
if (strstr($mintext, "html"))
  {
    echo("fyfy skamme");
  }
else
  {
    DIN FORM KODE HER
  }
Avatar billede showsource Seniormester
16. februar 2007 - 07:21 #5
Avatar billede masik7 Nybegynder
16. februar 2007 - 14:00 #6
dr-jay -> Se lige det overstående link. Det er en rigtig god løsning, synes jeg ;).
Avatar billede masik7 Nybegynder
16. februar 2007 - 14:02 #7
Og hvis du ikke forstår den, så sig bare til, så forklarer jeg det for dig ;)
Avatar billede dr-jay Nybegynder
16. februar 2007 - 14:22 #8
Tak for alle svar og kommentarer :D

Da jeg ikke er super erfaren i PHP valgte jeg at tage det lette løsning først.
Jeg har sæt amites forslag ind:
...
    $message = trim($_POST['mtxMessage']);
   
    //hvis beskeden indeholder html tags
    if (strstr($message, "href")!= false)
          {
            echo("Du har forsøgt at indsætte et link (href), det er ikke tilladt - du er sandsyneligvis en SPAMbot som burde blive most af Neo ;)");
          }
    //fortsæt med resten af formen
    else
          {
...
Men jeg forstå ikke helt hvorledes jeg kan teste den måde som SPAMbotterne indsætter rækker i min tabel på, men det vil hurtigt vise sig om det virker. Jeg vender tilbage med point når vi se resultatet ;)
-Jeppe
Avatar billede masik7 Nybegynder
16. februar 2007 - 17:13 #9
Jeg vil nu enda sige, at min løsning er en del nemmere. Det er bare at tjekke om feltet indeholder noget, og hvis det gør, så ignorere man det..Prøv og læs det.. ;)
Avatar billede dr-jay Nybegynder
18. februar 2007 - 21:04 #10
Der er nu gået to dage med det nye tjek og der er ikke sluppet noget spam igennem, alene ved at frasortere alle meddelser indeholdende 'href'. Så det er jo rigtigt rart. Jeg vil gerne belønne amite med point, men det kræver et svar og ikke en kommentar for at tildele point, skriv derfor et svar og få dine fortjente point.

Hej fra Jeppe
Avatar billede amite Mester
19. februar 2007 - 00:13 #11
Godt at høre at det lykkedes for dig :)
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
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

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