Hier eine universell einsetzbare Floodsperre die in fast jedes Script eingebaut/nachgerüstet werden kann.
Der Bereich des Scriptes der geschützt werden soll muss dann diesen Subroutinenaufruf erhalten.
&floodcheck;
Die Subroutine, diese muss natürlich auf die gegebenheiten abgestimmt werden.
##########################################################
sub floodcheck {
$wartezeit = "1.0";
$sperrlistenlaenge = 15;
my $IP_Nummer = $ENV{'REMOTE_ADDR'};
my $aktionszeit = time();
unless (-e "Zeitlimit") {
mkdir ("Zeitlimit", 0777);
chmod(0777, "Zeitlimit");
}
open(ZEITLIMIT, "Zeitlimit/limit.dat");
@letzte_eintraege = <ZEITLIMIT>;
close(ZEITLIMIT);
foreach (@letzte_eintraege) {
if (/^$IP_Nummer/){
($junk,$letzte_aktionszeit) = split(/\|!!\|/,$_);
chomp($letzte_aktionszeit);
last;
}
} # ende foreach
$wartezeit *= 10; # zeit in sek bis neu gepostet werden darf
if ( int(($aktionszeit - $letzte_aktionszeit) < $wartezeit)){
print qq~
<div align="center">
<font face="Verdana, Arial" size="5">
<b>Anti Spam Protection</b></font><br>
<font face="Verdana, Arial" size="2" color="#ff0000"><b>
Sie müssen $wartezeit Sekunden warten bis Sie wieder eine Aktion ausführen können.
</b></font>
</div>
~;
exit;
}
else {
if (unshift(@letzte_eintraege, "$IP_Nummer|!!|$aktionszeit\n") > $sperrlistenlaenge){
$#letzte_eintraege = $sperrlistenlaenge;
}
open(ZEITLIMIT, ">Zeitlimit/limit.dat");
print ZEITLIMIT @letzte_eintraege;
close(ZEITLIMIT);
}
return 1;
}
Die 10 bei $wartezeit *= 10; # zeit in sek bis neu gepostet werden darf ist das einzige was normalerweise angepasst werden muss.
Der Bereich der Fehleranzeige kann beliebig gestaltet werden.
print qq~
<div align="center">
<font face="Verdana, Arial" size="5">
<b>Anti Spam Protection</b></font><br>
<font face="Verdana, Arial" size="2" color="#ff0000"><b>
Sie müssen $wartezeit Sekunden warten bis Sie wieder eine Aktion ausführen können.
</b></font>
</div>
~;
Demo: Testen
|