Kom ihåg mig?

Stoppa spam på forum och bloggar

 
 
Ämnesverktyg Visningsalternativ
Oläst 2011-10-06, 15:02 #1
klein klein är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Jul 2005
Inlägg: 2 225
klein klein är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Jul 2005
Inlägg: 2 225
Shield Stoppa spam på forum och bloggar

Botnar som används för Black hat SEO är numera plåga som inte ungår någon forum eller blogg ägare, efter en slump sprungit på mjukvara som används för black hat SEO , så hittade jag url: http://www.stopforumspam.com/

Här är mitt bidrag till ett bättre internet, jag är hobby programmerare, därav får ni ta koden för vad den här. Jag har shell access på min burk, därav så kan förfarande som beskriv nedan vara lite annorlunda för webhotell som saknar shellaccess.

Instruktioner nedan fungera för mac och linux användare, för Windows RTFM eller ladda hem Vbox , kör ingång virtuell maskin med linux.

Värt att notera den första scriptet körs via enklast php_cli och det kommer troligen göra time out man kör det på webhotelll miljö via http. IP Ban filen innehåller ca 180k rader ip adresser,.

Notera 2 : fopen ,kommer skapa filer i /tmp/ , kommer antaligen inte vara så populärt hos Ert webhotell, så byt /tmp till getcwd(). i det fopen avsnitt som finns nedan.

När ni ser att scriptet fungera, så kommentara bort logg delen av koden.

Kod 2 , förutsätter att man har loggat in på DBn redan. Hur gör? Se första raderna kod 1 fram till // Slut på DB login

Och ni får jättegärna bidra med smartare kod och förbättringar.... Jag har inte märkt av någon prestanda problem. Men det kan bli ett problem i webhotell miljöer.


Instruktioner :

1) Ladda hem databasen från http://www.stopforumspam.com/downloads/

Med blockerade IP addresser.

Packa upp filen och dra upp ett bash skriv
Kod:
cat filnamn | tr -t , '\n' > evil_ip.txt
2) Logga in på mysql , skapa tabell i databasen med följande struktur :

Kod:
CREATE TABLE `banIP` (
  `ban_id` int(11) NOT NULL AUTO_INCREMENT,
  `ban_ip` varchar(16) COLLATE utf8_bin NOT NULL DEFAULT '',
  `ban_time` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`ban_id`),
  KEY `ban_id` (`ban_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;
3) Kod 1 inläsning av data :

Kod:
<?
error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED);
define( DB_SERVER, "127.0.0.1");
define( DB_SERVER_USERNAME, "dittusername");
define( DB_SERVER_PASSWORD, "dittpassword");
define( DB_DATABASE, "dindatabas");
define("OUTPUT_CHARSET","ISO-8859-1");


$link = mysql_connect( DB_SERVER, DB_SERVER_USERNAME, DB_SERVER_PASSWORD);
$link = mysql_select_db( DB_DATABASE );

// Slut på DB login

$ipfile ="/tmp/evil_ip.txt";
$handle 		= @fopen( $ipfile, "r");

if ($handle) {	
	$X=0;
	while (!feof($handle)) {
            
            $data              = fgets($handle, 32768 );
            $INLINE2           = str_replace( "\n","", $data); 
            
            
            $SQL0   = "SELECT * FROM banIP WHERE ban_ip='".$INLINE2."';";
            $res0   =  mysql_query ( $SQL0 ); 
            
            if ( mysql_num_rows($res0) == 0  ) {
                                  
                    $tid               = time();            
                    $SQL               = "INSERT banIP ( ban_ip , ban_time ) VALUES ( '$INLINE2', '$tid' );";
                    $res               =   mysql_query ( $SQL );
            
                    print "\n".$SQL."  res=".$res;
            
            }            
            
        }            
        }

?>
4) Kod 2 , den här koden skall implemteras central någonstans på din blogg eller forum :

Kod:
<?
function CheckEvilIP ( $IP ) {    
    
            $URL    = "http://127.0.0.1/";      
            $SQL0   = "SELECT * FROM banIP WHERE ban_ip='".$IP."';";
            $res0   =  mysql_query ( $SQL0 ); 
            
            if ( mysql_num_rows($res0) > 0  ) {          // Finns ondskan i databasen?                  
                $handle = fopen("/tmp/evil-ip-address.txt", "a");
                    fwrite($handle,"\n". $_SERVER['REMOTE_ADDR'] ); 
                fclose( $handle );
                
                header ('HTTP/1.1 301 Moved Permanently');
                header ('Location: '.$URL);                
                
            } else if ( mysql_num_rows($res0) ==0  ) {              // Det finns ingen ondska.    
                
                $urlchecker = file_get_contents('http://www.stopforumspam.com/api?ip='.$IP);
                
                 if (strpos($urlchecker, 'yes') ) {    
                    $handle = fopen("/tmp/evil-new-ip-address.txt", "a");
                        fwrite($handle,"\n". $_SERVER['REMOTE_ADDR'] ); 
                    fclose( $handle );    
                    
                    $tid               = time();            
                    $SQL               = "INSERT banIP ( ban_ip , ban_time ) VALUES ( '$IP', '$tid' );";
                    $res               =  mysql_query ( $SQL );
                    
                    header ('HTTP/1.1 301 Moved Permanently');
                    header ('Location: '.$URL);

        }
                
    }
            
}
?>

Slutligen :

Anropa funktionen med :

Kod:
CheckEvilIP ( $_SERVER['REMOTE_ADDR'] );

Senast redigerad av klein den 2011-10-06 klockan 15:21
klein är inte uppkopplad   Svara med citatSvara med citat
Oläst 2011-10-07, 10:00 #2
Jim_Westergrens avatar
Jim_Westergren Jim_Westergren är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: May 2005
Inlägg: 1 058
Jim_Westergren Jim_Westergren är inte uppkopplad
Har WN som tidsfördriv
Jim_Westergrens avatar
 
Reg.datum: May 2005
Inlägg: 1 058
Bra. Men ovan kod lär dra en del performance om du ska köra den på varenda sidvisning. Kör funktionen annars på de ställen där de behövs, till exempel registrering av nytt konto. Du kan ju annars sätta en cookie om IP:et är ok och köra funktionen om det inte finns en cookie satt.

Men en bättre lösning måste nog ändå vara att kräva registrering för att kunna skriva inlägg och vid registreringen ha en enkel men unik fråga som måste svaras rätt. Gör det själv på seo-forum.se och det funkar bra. Drar heller ingen performance.
Jim_Westergren är inte uppkopplad   Svara med citatSvara med citat
Oläst 2011-10-07, 10:43 #3
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 585
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 585
Citat:
Ursprungligen postat av Jim_Westergren Visa inlägg
Bra. Men ovan kod lär dra en del performance om du ska köra den på varenda sidvisning. Kör funktionen annars på de ställen där de behövs, till exempel registrering av nytt konto. Du kan ju annars sätta en cookie om IP:et är ok och köra funktionen om det inte finns en cookie satt.

Men en bättre lösning måste nog ändå vara att kräva registrering för att kunna skriva inlägg och vid registreringen ha en enkel men unik fråga som måste svaras rätt. Gör det själv på seo-forum.se och det funkar bra. Drar heller ingen performance.
Håller med dig till 100%. Det enkla och smarta är oftast det bästa och mest effektiva.

Citat:
Ursprungligen postat av Danielos Visa inlägg
Ett annat alternativ är att ta ett webbhotell som redan har inbyggda spamfilter i systemen så man slipper som hotellkund att programmera in saker.
Finns det något sådant system som fungerar bra? Jag har då aldrig träffat på ett spamfilter som man vill använda på det viset. Det är bättre att släppa igenom en del spam än att råka blockera några oskyldiga.

Ni som blockerar IP:n rakt av, räknar ni med att dessa ska vara svartlistade för all framtid? Det är ju ett enormt slöseri med IP-adresser.
__________________
Full-stack developer, free for smaller assignments

Senast redigerad av tartareandesire den 2011-10-07 klockan 10:48
tartareandesire är inte uppkopplad   Svara med citatSvara med citat
Oläst 2011-10-07, 11:42 #4
Danieloss avatar
Danielos Danielos är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Oct 2005
Inlägg: 3 102
Danielos Danielos är inte uppkopplad
Klarade millennium-buggen
Danieloss avatar
 
Reg.datum: Oct 2005
Inlägg: 3 102
Citat:
Ursprungligen postat av tartareandesire Visa inlägg
Finns det något sådant system som fungerar bra? Jag har då aldrig träffat på ett spamfilter som man vill använda på det viset. Det är bättre att släppa igenom en del spam än att råka blockera några oskyldiga.
Jodå, det finns, vi tex. kör ett professionellt system som fungerar otroligt bra och vi har inga klagomål från kunder. Det sker ingen IP blockering, utan det fungerar mycket likt ett vanlig spamfilter för email.
Danielos är inte uppkopplad   Svara med citatSvara med citat
Oläst 2011-10-07, 12:15 #5
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 585
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 585
Citat:
Ursprungligen postat av Danielos Visa inlägg
Jodå, det finns, vi tex. kör ett professionellt system som fungerar otroligt bra och vi har inga klagomål från kunder. Det sker ingen IP blockering, utan det fungerar mycket likt ett vanlig spamfilter för email.
Jo, fast spamfilter för email felmarkerar alltid en del mail. Sannolikheten att en kund märker av detta är ju också ganska liten. Jag tycker inte det är en bra lösning - det finns för många tveksamheter som inte går att komma förbi.
__________________
Full-stack developer, free for smaller assignments
tartareandesire är inte uppkopplad   Svara med citatSvara med citat
Oläst 2011-10-07, 12:34 #6
Danieloss avatar
Danielos Danielos är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Oct 2005
Inlägg: 3 102
Danielos Danielos är inte uppkopplad
Klarade millennium-buggen
Danieloss avatar
 
Reg.datum: Oct 2005
Inlägg: 3 102
Citat:
Ursprungligen postat av tartareandesire Visa inlägg
Jo, fast spamfilter för email felmarkerar alltid en del mail. Sannolikheten att en kund märker av detta är ju också ganska liten. Jag tycker inte det är en bra lösning - det finns för många tveksamheter som inte går att komma förbi.
Alla spamfilter, inkl. de som du lägger in i php kod kommer att blockera riktiga inlägg, eller felaktiga IP, inget spamfilter är 100%. Det system vi kör är dock så bra att ingen kund klagar, annars skulle vi reklamera systemet där vi skaffade det.
Danielos är inte uppkopplad   Svara med citatSvara med citat
Oläst 2011-10-08, 11:08 #7
klein klein är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Jul 2005
Inlägg: 2 225
klein klein är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Jul 2005
Inlägg: 2 225
Citat:
Ursprungligen postat av tartareandesire Visa inlägg
Ni som blockerar IP:n rakt av, räknar ni med att dessa ska vara svartlistade för all framtid? Det är ju ett enormt slöseri med IP-adresser.
Det där ett problem, lösningen är väl att hämta hem stopforum databas varje mån åtminstoende, updatera databasen. Fundera på att man kanske bara skall behålla IPn från kända spam stater konstant typ .RU ,man skulle kunna lägga upp ett cronjob som wgetade hem db:n varje dag också..

Det bero också på vad man har på sin hemsida , min hemsida vänder sej till Svenskar, därav är det ganska lätt att blockera .ru, .ua osv..

Stänger jag av spam filtret, då har jag ca 200 fulkonto reggade på några timmar. Nu har jag 2 st fulkonto på några dagar.

Det jobbigaste är inte att fulkonto reggas, utan när det sätter ingång och bajsa ner forumet med sin skit, då kan man få sitta 1 h om dagen och bara rensa spam, för botnar bumpar upp gamla trådar. Så för mig är det här bästa sättet att freda min hemsida emot slöddret.

Kan bara vara tacksam emot att det bruka skita ner forumet på Engelska, Ryska eller Spanska.
klein är inte uppkopplad   Svara med citatSvara med citat
Oläst 2011-10-07, 15:08 #8
klein klein är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Jul 2005
Inlägg: 2 225
klein klein är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Jul 2005
Inlägg: 2 225
Jag har inte märkt någon kraftminskning, dock kör jag inte det i webhotell miljö. Har fundera på att ha 2 tabeller , en stor tabell med alla blockerade IP och sedan en cache tabell där man lagra besökta ip och med flagga om det goda eller onda IPn.

Men som sagt , det vara ett snabbhack, det går för sköna.. Eller så kanske man kan få sitt webhotell att sätta upp en lokal version av stoppaspam.

Nackdelen som jag ser med t.e.x frågor, är man kan få modeifera koden ganska mycket... Cookie lika så.. Det är ganska mycket arbete på implemtera det. Fördelen med den här koden, är att man kan lägga den central i någon header, så är det up and running.

Jag trodde det skulle prestanda problem, med söka igenom att en tabell på 180k IP, men har inte märkt av det och då är mysql standard uppsatt på maskinen. Webhotellen har oftast optimerade DB maskiner..


Citat:
Ursprungligen postat av Jim_Westergren Visa inlägg
Bra. Men ovan kod lär dra en del performance om du ska köra den på varenda sidvisning. Kör funktionen annars på de ställen där de behövs, till exempel registrering av nytt konto. Du kan ju annars sätta en cookie om IP:et är ok och köra funktionen om det inte finns en cookie satt.

Men en bättre lösning måste nog ändå vara att kräva registrering för att kunna skriva inlägg och vid registreringen ha en enkel men unik fråga som måste svaras rätt. Gör det själv på seo-forum.se och det funkar bra. Drar heller ingen performance.

Senast redigerad av klein den 2011-10-07 klockan 15:18
klein är inte uppkopplad   Svara med citatSvara med citat
Oläst 2011-10-07, 15:55 #9
Clarence Clarence är inte uppkopplad
Administratör
 
Reg.datum: Jan 2003
Inlägg: 1 974
Clarence Clarence är inte uppkopplad
Administratör
 
Reg.datum: Jan 2003
Inlägg: 1 974
Citat:
Ursprungligen postat av klein Visa inlägg
Jag har inte märkt någon kraftminskning, dock kör jag inte det i webhotell miljö. Har fundera på att ha 2 tabeller , en stor tabell med alla blockerade IP och sedan en cache tabell där man lagra besökta ip och med flagga om det goda eller onda IPn.

Men som sagt , det vara ett snabbhack, det går för sköna.. Eller så kanske man kan få sitt webhotell att sätta upp en lokal version av stoppaspam.

Nackdelen som jag ser med t.e.x frågor, är man kan få modeifera koden ganska mycket... Cookie lika så.. Det är ganska mycket arbete på implemtera det. Fördelen med den här koden, är att man kan lägga den central i någon header, så är det up and running.

Jag trodde det skulle prestanda problem, med söka igenom att en tabell på 180k IP, men har inte märkt av det och då är mysql standard uppsatt på maskinen. Webhotellen har oftast optimerade DB maskiner..
Det finns en del andra problem med din kod också. De tre jag ser direkt är:

Kolumn-typ för ip-adressen. Lagras denna som varchar(15) tar den upp till 46 bytes med utf8. Alternativet heter INT, kör du ipv4 har du det redan klart i MySQL med INET_NTOA()/INET_ATON(). Med en unsigned int rymmer du alla ipv4 adresser på 4 bytes.

Det andra är att du har en primär-nyckel på ett id för IP-adressen (!?). Det enda det gör här är att göra inserts/updates långsammare. Lägger du istället primärnyckeln på int-representation av ip-adressen blir det mycket kvickare. Sedan bör du använda select banIP och inte select *. På så sätt kan du läsa hela ditt svar från index och behöver inte göra disk-reads (förutsatt att db-servern mår bra).

Du har gjort dig direkt beroende av en tredje part för hela din sajt. Vad händer när de får prestanda-problem, du får routingproblem mot dom eller deras site går ner kl 4 på natten?
Clarence är inte uppkopplad   Svara med citatSvara med citat
Oläst 2011-10-07, 17:32 #10
klein klein är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Jul 2005
Inlägg: 2 225
klein klein är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Jul 2005
Inlägg: 2 225
Tack det skall jag till mig, det är som sagt ett fulhack..Skall vara ärlig så tog en tabell från ett annat projekt och yxade till det.

Citat:
Ursprungligen postat av Clarence Visa inlägg
Det finns en del andra problem med din kod också. De tre jag ser direkt är:

Kolumn-typ för ip-adressen. Lagras denna som varchar(15) tar den upp till 46 bytes med utf8. Alternativet heter INT, kör du ipv4 har du det redan klart i MySQL med INET_NTOA()/INET_ATON(). Med en unsigned int rymmer du alla ipv4 adresser på 4 bytes.

Det andra är att du har en primär-nyckel på ett id för IP-adressen (!?). Det enda det gör här är att göra inserts/updates långsammare. Lägger du istället primärnyckeln på int-representation av ip-adressen blir det mycket kvickare. Sedan bör du använda select banIP och inte select *. På så sätt kan du läsa hela ditt svar från index och behöver inte göra disk-reads (förutsatt att db-servern mår bra).

Du har gjort dig direkt beroende av en tredje part för hela din sajt. Vad händer när de får prestanda-problem, du får routingproblem mot dom eller deras site går ner kl 4 på natten?
klein är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 
Ämnesverktyg
Visningsalternativ

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 09:38.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017