[PHP] Forum spam tegengaan *

Pagina: 1
Acties:

Onderwerpen


Verwijderd

Topicstarter
Hallo allemaal,

Het volgende probleem :)

Er stonden vandaag ineens 900 dezelfde spam berichten in mijn forum. Ik ben in principe nog niet heel erg gevorderd met php maar het forum is in ieder geval door mezelf geschreven. Het is op het forum mogelijk om jezelf aan te melden of door je als guest in te loggen.

Deze berichten zijn wel met een regel code te verwijderen maar toch is het vervelend. Het ip adres is momenteel geblokkeerd maar zodra diegene een nieuw ip nr heeft kan die dus weer beginnen wat niet de bedoeling is.

Nu is mijn vraag (eindlijk :P):

Kan iemand duidelijk uitleggen hoe je bijvoorbeeld aan de hand van het ip nummer kan controleren of de gebruiker meer dan 5 reply's post binnen een minuut tijd. Zo, ja een error geeft.

Mocht je niet helemaal super uit mijn uitleg komen. Dan hoor ik het wel.

Alvast bedankt,

Michel

  • coubertin119
  • Registratie: Augustus 2002
  • Laatst online: 15-09 17:06
Je slaat in de database het IP op van de poster en de huidige tijd, en bij iedere nieuwe post kijk je of het IP al in de DB staat en zo ja, of het al dan niet meer/minder dan 1 minuut geleden is dat er een post via dat IP is geweest.

Skat! Skat! Skat!


  • Jelmer
  • Registratie: Maart 2000
  • Laatst online: 11:59
In SQL zou je het zo kunnen doen:

SELECT ipadress FROM <tabel>GROUP BY ipadress HAVING count(*) >=5

Verwijderd

Topicstarter
Ok tot nu toe alvast bedankt, moet zodra je nu 5 x binnen een minuut post geeft die dus een error. Hoe kan die nu na een minuut na je post een rij verwijderen uit een tabel? Of eventueel vergelijken dat er niet meer dan een minuut verschil met de werkelijke tijd zit?

  • Arjan A
  • Registratie: November 2000
  • Laatst online: 11:25

Arjan A

Cenosillicafoob

Kijk eens naar de datum functies in PHP en in MySQL.
Je moet geen rijen verwijderen bij meer dan 5 posts, maar je moet dan de zesde post gewoonweg niet in de DB zetten.
Je moet dus tegelijk met de post ook het IP-adres en een timestamp opslaan om na te kunnen gaan wanneer en hoeveel een user post.

Canon EOS | DJI M2P
Fotoblog · Mijn werk aan jouw muur


Verwijderd

Topicstarter
Owhja logisch idd :)

Bedankt, zow moet er met wat knutselen wel uitt te komen zijn.

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Verwijderd schreef op 13 September 2003 @ 19:41:
Er stonden vandaag ineens 900 dezelfde spam berichten in mijn forum.
kan je niet checken op dezelfde berichten, dat je niet precies hetzelfde bericht binnen een bepaalde tijd, bijvoorbeeld 10minuten kan posten.
Want hoe vaak komt het voor dat het gewenst is dat er dezelfde berichten gepost worden.
je zou bijvoorbeeld een tabel maken waar je van elk bericht een tijd+hash kunnen bijhouden, waarop je dan kan checken.

  • JER00N
  • Registratie: Maart 2002
  • Niet online
Je kan ook microtime() gebruiken. Deze geeft het aantal seconden na 1 januari 1970.
Stel je slaat die microtime op als je gebruiker een bericht post. Als hij daarna weer een bericht wil posten, neem je de microtime op dat moment, en trek je de opgeslagen microtime daarvan af. Als je nu bijv minder dan 300 seconden krijgt (5 minuten) kun je bijvoorbeeld zeggen "Je mag maar eens in de 5 minuten een bericht plaatsen!". Let er op dat microtime() een array teruggeeft. Het tweede item in die array is de microtime die je nodig hebt.

Zoiets dus:
PHP:
1
2
$CurrentMicrotime = explode(" ", microtime());
$CurrentMicrotime = $CurrentMicrotime[1];


en dan als de user een post wil plaatsen:

PHP:
1
2
3
4
5
6
7
8
9
$LastPost = $User_row->LastPost  //in microtime

$Verschil = $CurrentMicrotime - $LastPost;
if($Verschil >= 300){
  //ok, je mag posten!
}
else {
 // je mag nog niet posten!
}


zo simpel is het :)

Meer info over microtime: http://nl2.php.net/manual/nl/function.microtime.php

Verwijderd

Topicstarter
Pastasaus schreef op 13 September 2003 @ 19:59:
Je kan ook microtime() gebruiken. Deze geeft het aantal seconden na 1 januari 1970.
Stel je slaat die microtime op als je gebruiker een bericht post. Als hij daarna weer een bericht wil posten, neem je de microtime op dat moment, en trek je de opgeslagen microtime daarvan af. Als je nu bijv minder dan 300 seconden krijgt (5 minuten) kun je bijvoorbeeld zeggen "Je mag maar eens in de 5 minuten een bericht plaatsen!". Let er op dat microtime() een array teruggeeft. Het tweede item in die array is de microtime die je nodig hebt.

Zoiets dus:
PHP:
1
2
$CurrentMicrotime = explode(" ", microtime());
$CurrentMicrotime = $CurrentMicrotime[1];


en dan als de user een post wil plaatsen:

PHP:
1
2
3
4
5
6
7
8
9
$LastPost = $User_row->LastPost  //in microtime

$Verschil = $CurrentMicrotime - $LastPost;
if($Verschil >= 300){
  //ok, je mag posten!
}
else {
 // je mag nog niet posten!
}


zo simpel is het :)

Meer info over microtime: http://nl2.php.net/manual/nl/function.microtime.php
Heel erg bedankt, dit ga ik gebruiken.

  • JER00N
  • Registratie: Maart 2002
  • Niet online
Oh trouwens, om te voorkomen dat een user 2 keer een post met dezelfde content post, kun je nog wat doen. Geef bij elke keer dat een user een bericht post het ID mee van die post, zodat je bij de volgende post kan controleren wat de content was van de vorige. Is die hetzelfde als de 'nieuwe' dan is het a.h.w. een dubbelpost :)

  • slm
  • Registratie: Januari 2003
  • Laatst online: 12-11-2023

slm

Eens in de 5 minuten is wel erg weinig. Een keer per 1-3 minuten lijkt me beter plus dan eventueel een maximum stellen aan posts per dag.

Daarnaast moet je kijken of je geen structureel probleem hebt in je forum scripts. Kan een guest zomaar posten zonder op de site geweest te zijn bv? Een manier die vaak wordt gebruikt om forums te spammen is om een post als image in een ander goedlopend forum te plaatsen, dus bv: [_img_]http://www.jouwsite.nl/forum/savepost.php?userid=999&topic=wateenspamzeg&message=stomhe[_/img_]

Als dat werkt is er wat goed mis in je scripting en zul je extra maatregelen moeten nemen.

Bovendien zou in het script dat een post bewaart een check moeten zetten op of de user die de net de vorige post heeft gemaakt, ook dezelfde user is als deze post. Zo verplicht je mensen de edit-button te gebruiken. Eventueel kan je een dag incubatietijd nemen, zodat men de volgende dag wel weer hun topic kunnen kicken.

To study and not think is a waste. To think and not study is dangerous.


  • Suepahfly
  • Registratie: Juni 2001
  • Laatst online: 17-09 17:05
Zo heb ik het opgelost voor mijn gastenboek
PHP:
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
function is_flood($ip)
{ 

    global $flood_control, $flood_control_time, $prefix, $dbi;

    if($flood_control != "1")
    {
        return false;
    }
    else
    { 
        $query = sql_query("SELECT sys_time FROM ".$prefix."_blather WHERE ip = '$ip' ORDER BY time DESC LIMIT 0 , 1", $dbi) or print(mysql_error());
        $now_time = time();
        $res = sql_fetch_array($query);
        $post_time = $res[0];
        $diff = ($now_time - $post_time);

        if($diff < $flood_control_time)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}

$flood_control (boolean of floodcontrol aan of uit staat)
$flood_control_time (int seconden voor dat ip weer mag posten)
$prefix (heb jij niet nodig)
$bdi (heb jij ook niet nodig)
Ik heb dit ding als module voor PHP-nuke gemaakt ,vandaar

het veld sys_time bevat de waarden va time() (deze functie geeft het aantal seconden terug die zijn verstreken sinds 1970 om 00.00 u.

Tijd en ip worden opgeslagen tijdens het posten

En je post script doe je zo iets als:
PHP:
1
2
3
4
5
6
7
8
if(is_flood($REMOTE_ADDR)
{
    die("Spammer!");
}
else
{
    /* hier je post formulier */
}

Verwijderd

Topicstarter
slm schreef op 13 September 2003 @ 20:22:
Eens in de 5 minuten is wel erg weinig. Een keer per 1-3 minuten lijkt me beter plus dan eventueel een maximum stellen aan posts per dag.

Daarnaast moet je kijken of je geen structureel probleem hebt in je forum scripts. Kan een guest zomaar posten zonder op de site geweest te zijn bv? Een manier die vaak wordt gebruikt om forums te spammen is om een post als image in een ander goedlopend forum te plaatsen, dus bv: [_img_]http://www.jouwsite.nl/forum/savepost.php?userid=999&topic=wateenspamzeg&message=stomhe[_/img_]

Als dat werkt is er wat goed mis in je scripting en zul je extra maatregelen moeten nemen.

Bovendien zou in het script dat een post bewaart een check moeten zetten op of de user die de net de vorige post heeft gemaakt, ook dezelfde user is als deze post. Zo verplicht je mensen de edit-button te gebruiken. Eventueel kan je een dag incubatietijd nemen, zodat men de volgende dag wel weer hun topic kunnen kicken.
Een guest word gewoon ingelogd. Het is dus niet mogelijk om zonder in te loggen iets te posten
Pagina: 1