SPAM Filter

Door Timonb , 16 jaar geleden, 7.326x bekeken

Hierbij een handige PHP spam filter voor als bijv. je gastenboek wordt gespamd. Dat was bij mij het geval, vandaar dat ik deze PHP spam filter geschreven heb.

'$message' is het gastenboek bericht.

Je moet wel een extra kolom aanmaken in de tabel met de naam 'spam'. Je kunt de spam berichten dan onafhankelijk van de echte berichten tonen. Zo kun je de spam berichten in één keer verwijderen, maar het toch eerst even controleren.

Gesponsorde koppelingen

PHP script bestanden

  1. spam-filter

 

Er zijn 22 reacties op 'Spam filter'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Vdleije .
vdleije .
16 jaar geleden
 
0 +1 -0 -1
hmm.. Het houd niet álle spam weg, maar wel geweldig idee!
- -
- -
16 jaar geleden
 
0 +1 -0 -1
kan ook zo:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
$bad_words
= array('teen', 'viagra', 'order'); //etc...
foreach($bad_words as $word)
{

  if(strpos($message, $word[$i]) !== false)
  {

    $spam = 1;
  }
}

?>
Ponzi
Ponzi
16 jaar geleden
 
0 +1 -0 -1
Simpel, maar redelijk effectief. Je zou het beter 'scheldwoordenfilter' noemen ;-) .
Timonb
timonb
16 jaar geleden
 
0 +1 -0 -1
Ja zo zou je het ook kunnen noemen :), maar ik word opeens onwijs gespamd, maar goed, nu heb ik het onder controle ;)
Dutchcamel
dutchcamel
16 jaar geleden
 
0 +1 -0 -1
Vet, ga ik meTEEN gebruiken.. Oh kut, dat mag ik niet posten :P
- -
- -
16 jaar geleden
 
0 +1 -0 -1
Simpele maar effectieve aanpak!
Willem Jan Z
Willem Jan Z
16 jaar geleden
 
0 +1 -0 -1
Waarom gebruikt nooit iemand stristr(), maar altijd strpos of ereg...
Volgens mij zijn beide varianten namelijk langzamer dan stristr.
Pim Vernooij
Pim Vernooij
16 jaar geleden
 
0 +1 -0 -1
Maar wat nou als iemand per ongeluk een van de bad words in z'n bericht gebruikt?

Wat je beter kan doen is een vraag stellen. Een bot kan die namelijk niet beantwoorden. Het antwoord check je door de ingevoerde waarde door strtolower() te halen, en alle spaties te verwijderen.
Eric Cartman
Eric Cartman
16 jaar geleden
 
0 +1 -0 -1
Ikzelf houd niet zo van CAPTCHA's (behalve hotcaptcha's dan), vragen, spamfilters en dergelijke. Ze zijn alleen maar irritant.

Geef mij maar gewoon Akismet. Heel handige service. Degene die een WordPress weblog hebben zullen het waarschijnlijk wel kennen en weten vast ook dat het heel goed werkt.

Laatst had ik een klasse geschreven die het werken met de service makkelijker maakt. Ik zal er nog eens naar kijken en hem zo dan even hier neerzetten :)

En als je het Zend Framework gebruikt, zit daar zelfs al een Akismetmodule in :)
Barman V
Barman V
16 jaar geleden
 
0 +1 -0 -1
Leuk idee, maar zeker niet waterdicht. Spam is ook alleen de tekst "Nice site", of "Perfect site", of iets van "DKJF903qwLKJ". Moet je dan op "Perfect" gaan filteren??

Ik heb dit probleem ook een tijd gekent en het zo proberen op te lossen, maar er kwamen toch steeds spamberichtjes door. Ik heb het opgelost door de bezoeker een plaatje te laten overtypen en dan een cookie op hun compu te plaatsen als ze het goed hebben. Deze cookie toont aan dat ze een echte gebruiker zijn, dus ze hoeven niet nogmaals het plaatje over te typen.

De code kan ook zo (maar er zijn natuurlijk duizenden manieren):

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
$spam
= false;
$bad_words = array('teen', 'viagra', 'order'); //etc...
if (eregi(implode('|', $bad_words), $message))
  $spam = true;
?>


Voordeel hierbij is dat je geen loop hoeft te gebruiken.
- -
- -
16 jaar geleden
 
0 +1 -0 -1
@Barman: dat van die cookie is wel een goed idee!
Steff   an
Steff an
16 jaar geleden
 
0 +1 -0 -1
Cookies zijn óók door een bot te gebruiken! Met Curl bv. kan je ook cookies gebruiken.
Barman V
Barman V
16 jaar geleden
 
0 +1 -0 -1
Met Cookies werkt het prima. De bot krijgt de cookie niet zomaar. Hij moet wel eerst het plaatje (met cijfers en letters) overtypen.

De afgelopen 2 jaar is er geen 1 spambericht doorgekomen, terwijl het daarvoor echt zeer vaak gebeurde.

Ik heb zoiets bovenaan de bron staan
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php
define('COOKIENAME', 'realUser');

$ckRealUser = false;
$ckDate        = mktime(0, 0, 0, date('n') + 3, date('j'), date('Y'));

if ($_COOKIE[COOKIENAME]){
    $ckRealUser = true;
//gebruiker is bekend => verleng cookie
    setcookie(COOKIENAME, $_COOKIE[COOKIENAME], $ckDate);
}

?>


Deze code dient als check voordat bericht in gastenboek gezet wordt
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
//gebruiker onbekend
if (!$ckRealUser){
    //code goed ingevoerd > is echte gebruiker > plaats cookie
    if (is_numeric($pCodeValid) && $pCodeValid == $pCodeInput){
        //een soort tempcookie. code is goed ingevoerd, maar de naam hoeft dan niet ingevoerd te zijn
        setcookie(COOKIENAME, ' ', $ckDate);
        
        $ckRealUser = true;
    //code incorrect > misschien door spam > foutmelding
    } else {
        $messResponse .= '
        - De ingevoerde <b>code is onjuist</b>'
;
        
        $objJS->setFocus('fldValidate');
    }
}


if ($messResponse){
    //ERRORMESSAGE AANMAKEN
    $messResponse = setResponse('<b>Bericht niet opgeslagen</b><br />'.$messResponse, false, $messX, $messY);
}

elseif ($ckRealUser){
    //DATA IS VALIDE > BERICHT TOEVOEGEN IN DATABASE
    setcookie(COOKIENAME, $pNaam, $ckDate);
    
    $objDB->query("INSERT INTO gb_bericht (gb_berichtNaam, gb_berichtBericht, gb_berichtIP) VALUES ('".$pNaam."', '".$pBericht."', '".$_SERVER['REMOTE_ADDR']."');");
    header('Location: '.SELF.'/posted');
}
else {
    $messResponse    = setResponse('<b>Bericht niet opgeslagen</b><br />- Uw browser accepteert geen cookies', false, $messX, $messY);
}

?>


Misschien een onduidelijke regel (regel 6):
//een soort tempcookie. code is goed ingevoerd, maar de naam hoeft dan niet ingevoerd te zijn

Dit houdt in: Stel iemand vult de code wel goed in, maar heeft het bericht (of de naam) niet ingevoerd. Het bericht wordt dan niet geplaatst, maar omdat de gebruiker bewezen heeft dat hij geen bot is, krijgt hij toch een cookie. Zo hoeft hij dus (ook bij een fout) niet de code opnieuw in te voeren.

Let op! De code heb ik puur gekopieerd en geplakt vanuit mijn systeem, dus (indien je geinteresseerd bent) je moet de touwtjes nog aan elkaar knopen.
K i p
K i p
16 jaar geleden
 
0 +1 -0 -1
Je kan ook inbouwen dat hij bij 'viagra' ook controleerd op vi@gra en viagr@ enzo. Maar ik ben het dan nog steeds niet eens met deze manier van controle op spam.
Eric Cartman
Eric Cartman
16 jaar geleden
 
0 +1 -0 -1
Stel dat hier op phphulp die beveiliging op had gezeten, had Boris zijn vorige (best aardige) tip niet geplaatst kunnen worden...
Killerpuppy
Killerpuppy
16 jaar geleden
 
0 +1 -0 -1
spam?

ZIjn toch 9 van de 10 keer botjes die de POST methode gebruiken.

Gewoon automatisch random variabele namen gebruiken.
Dan kan het namelijk alleen met jouw script geplaatst worden.
De anderen hebben de juiste "code" niet
Barman V
Barman V
16 jaar geleden
 
0 +1 -0 -1
@Killerpuppy:
Zijn toch 9 van de 10 keer...

Wel een leuk idee, maar je zegt zelf al dat het geen waterdichtsysteem is.

Ik heb de bots voor een tijdje gelogd en daaruit blijkt dat het inderdaad VAAK vanaf een externe gepost wordt. Maar soms gaat het ook via het formulier, en dan?
Wessel
Wessel
16 jaar geleden
 
0 +1 -0 -1
het is eigenlijk makkelijk te omzeilen, want als het woord teen niet mag typt iemand gewoon TEEN of TeEn in en dan word de post wel geplaats
Killerpuppy
Killerpuppy
16 jaar geleden
 
0 +1 -0 -1
@barnan

Wat noem jij soms?
20 berichten achterelkaar?

Dan heb je nog iets als floodprotection
Daan
Daan
16 jaar geleden
 
0 +1 -0 -1
kan iemand mij vertellen waar ik het spamfilter neer moet zetten in mijn code. bij werkt ie namelijk niet.....

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
if($_SERVER['REQUEST_METHOD'] == 'POST')
{

    if(!$rMySQLQuery    =    mysql_query("INSERT INTO replys (topic_id,reply_poster,reply_date,reply_message)
    VALUES('"
.$_GET['topic_id']."','".$_SESSION['gebruiker']."',NOW(),'".addslashes($_POST['reply_message'])."');"))
    {

        message_die();
    }

    
    if(!$rMySQLQuery        =    mysql_query("SELECT member_posts,member_username FROM members WHERE member_username = '".$_SESSION['gebruiker']."'"))
    {

        message_die();
    }

    
    $aFetch                    =    mysql_fetch_assoc($rMySQLQuery);
    
    $aFetch['member_posts']    =    (int) $aFetch['member_posts'] + 1;
    
    if(!$rMySQLQuery        =    mysql_query("UPDATE members SET member_posts = '".$aFetch['member_posts']."' WHERE member_username = '".$_SESSION['gebruiker']."'"))
    {

        message_die();
    }

    
    print '<script language="javascript"> location="view_topic.php?style='.$_GET['style'].'&forum_id='.$_GET['forum_id'].'&topic_id='.$_GET['topic_id'].'"; </script>';
}

else
{

$spam = false;
$bad_words = array('teen', 'viagra', 'order'); //etc...
if (eregi(implode('|', $bad_words), $reply_poster))
  $spam = true;

?>
Barman V
Barman V
16 jaar geleden
 
0 +1 -0 -1
@Wessel:
eregi is anders dan ereg. eregi is NIET hoofdlettergevoelig. Maar dan heb je weer dat worden als teentjes (ik noem maar wat) ook niet mag. Dan zou je het bericht moeten exploden op spaties. Dan krijg je een array met alle woorden. Dan met in_array(); kan je ware slechte woorden vinden. (misschien kan het nog efficienter, maar dit komt even in me op)

@Killerpuppy:
floodprotection? Met soms bedoel ik +/- 3 berichten per dag.

@Daan:
Ik denk aan zoiets
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php
if($_SERVER['REQUEST_METHOD'] == 'POST')
{

    $spam = false;
    $bad_words = array('teen', 'viagra', 'order'); //etc...
    if (eregi(implode('|', $bad_words), $reply_poster))
         $spam = true;
    
    if (!$spam){
        if(!$rMySQLQuery    =    mysql_query("INSERT INTO replys (topic_id,reply_poster,reply_date,reply_message)
                VALUES('"
.$_GET['topic_id']."','".$_SESSION['gebruiker']."',NOW(),'".addslashes($_POST['reply_message'])."');"))
            {

        
            message_die();
           }

    
            if(!$rMySQLQuery        =    mysql_query("SELECT member_posts,member_username FROM members WHERE member_username = '".$_SESSION['gebruiker']."'"))
            {

                message_die();
            }

    
            $aFetch                    =    mysql_fetch_assoc($rMySQLQuery);
    
            $aFetch['member_posts']    =    (int) $aFetch['member_posts'] + 1;
    
            if(!$rMySQLQuery        =    mysql_query("UPDATE members SET member_posts = '".$aFetch['member_posts']."' WHERE member_username = '".$_SESSION['gebruiker']."'"))
            {

                    message_die();
            }

    
            print '<script language="javascript"> location="view_topic.php?style='.$_GET['style'].'&forum_id='.$_GET['forum_id'].'&topic_id='.$_GET['topic_id'].'"; </script>';
    }
}

else
{


?>
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
D-unid.com
D-unid.com
16 jaar geleden
 
0 +1 -0 -1
Wat boedoel je met voeg wel even een tabel toe met spam...

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. spam-filter

Labels

  • Geen tags toegevoegd.

Navigatie

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.