was ist an diesem script falsch ?
Alain
- cgi
hallo,
Ich komm da einfach nicht klar mit diesem total umgebauten cgi
Dieses cgi hat zwei funktionen oder zumindest sollte es die haben.
Es öffnett intern ein framset wenn der remonte User berechtigt ist,
bedingt dadurch dass sein username der selben IP die beim erstenmal
im log eingetragen wurde ist wie jetzt,ansonsten würde das script
wenn es im log den counterstand erreicht hat,den user eine denied
seite übergeben ,gleichzeitig dem webmaster ne mail senden...
Dies kurz zur funktion
Leider funktioniert das cgi nicht so wie ich möchte und wenn es funktioniert
dann krieg ich 10 mails auf einmal?!
Nun gut ich möchte es nicht spannend machen...
hier ist das vollständige cgi:
#!/usr/bin/perl -w
$siteid = 'blabla';
$mailto = 'webmaster@mydomain.com';
$mailprog = '/usr/sbin/sendmail';
$loginlog = 'login';
$abusecount = 9;
$maxusers = 150;
$doflocks = 1;
$date = date
;
$date_today = join( " ", (split(" ",$date)) [1,2] );
$username = $ENV{'REMOTE_USER'};
$ip_now = $ENV{'REMOTE_ADDR'};
$ua_now = $ENV{'HTTP_USER_AGENT'} == /'AOL'/ ? "AOL": "noAOL";#ignoriert AOL user
@ips = ('211.222.99.226','62.2.230.2');
#if hacker IP exist
foreach(@ips) {
if ($_ eq $ip_now) {
print "Content-type: text/html\n\n";
print "access $_ denied !\n\n";
exit;
}
}
print "Content-type: text/html\n\n";
$maxsize=$maxusers*8*2; #uname+pass average length is 8 chars
unlink($loginlog) if ((stat($loginlog))[7] > $maxsize);
exit if (!$username);
if (dbmopen(logins,$loginlog,0666))
{
flock(logins,2) if ($doflocks);
$ip_last,$ua_last,$count_last,$date_last) = split(/\*/,$logins{$username});
#if first time logging in today
if ($date_last ne $date_today)
{
$count_last=0;
}
elsif (($ip_last eq $ip_now) and ($ua_last ne $ua_now))#damit hab ich probleme
{
$count_last++;
#if abuse suspected
if ($count_last > $abusecount && length($username) > 2)
{
&SendMail;
} }
sub SendMail {
open (MAIL, "|$mailprog -t");
print MAIL "To: $mailto\n";
print MAIL "From: $mailto\n";
print MAIL "Subject: AbuseBlock monitor for user: $username\n";
print MAIL "Abuse Block monitor script on $date_today for siteid $siteid reports:\n\n";
print MAIL "Username $username detected to be used $count_last times from different IP addresses (last\n";
print MAIL "IP was $ip_now). If you get 5 or more warnings for this user, go to blablabla... user detail $ENV{'HTTP_REFERER'} und $ENV{'HTTP_USER_AGENT'} \n";
close MAIL;
$count_last=0;
}
$logins{$username} = ("$ua_now*$ip_now*$count_last*$date_today*");
dbmclose(logins);
flock(logins,8) if ($doflocks); #ist dies an der richtigen stelle?
sub badpass {
print "<HTML>\n";
print "<HEAD><TITLE>access denied</Title></HEAD>\n";
print "<META HTTP-EQUIV="pragma" CONTENT="no-cache">\n";
print "<META HTTP-EQUIV="REFRESH" CONTENT="2; URL=http://www.mydomain.com/abuse.htm">\n";
print "<CENTER><H2>access denied for user $username with IP $ip_now </H2>\n";
print "<BR><H2>your Account was blocking \n";
print "<BR><H2>for more jnfo mail to $mailto</H2>\n";
print "<BR><H2>detected to be used 10 times from different IP addresses<BR>\n";
print "</BODY>\n";
print "</HTML>\n";
exit;
}
&redir;
sub redir {
print "<HTML><HEAD><TITLE>Welcome </Title></HEAD>\n";
print "<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">\n";
print "<META HTTP-EQUIV="pragma" CONTENT="no-cache">\n";
print "<frameset ROWS="100%,*" scrolling="no" frameborder="0" border="0" noresize>\n";
print "<frame NAME="navigation" SRC="eingang.html" marginwidth="1" marginheight="1" scrolling="no" frameborder="0" border="0" noresize framespacing="0">\n";
print "<noframes></HEAD>\n";
print "<BODY BGCOLOR=#005050 TEXT=#00FF00 LINK=#00FFFF VLINK=#00FFFF ALINK=#FF0000>\n";
print "<BR><Center><FONT SIZE=+4>Welcome</FONT>\n";
print "<BR><FONT SIZE=+2>your Browser can not support frames or frameset <BR>please update your netscape or IE for see the frameset \n";
print "<BR>If you need support mail to $mailto your problem and your username with detail jnfo</FONT>\n";
print "</BODY></noframes></frameset></HTML>\n";
exit;
} }
Wäre euch wircklich dankbar wenn ich wenigstens einen kleinen tip
bekommen würde bin (noch) Anfänger :-)
Gruss Alain
P.S.:use strict hat mir bisher auch nicht viel geholfen-leider
Hi,
Ich komm da einfach nicht klar mit diesem total umgebauten cgi
Ich auch nicht. Der wartungstechnische Zustand Deines
Skripts ist in meinen Augen eine Katastrophe.
Es würde für mich wahrscheinlich länger dauern, Dein
Skript zu lesen und zu verstehen, als es anhand einer
vorliegenden Aufgabenstellung neu zu schreiben.
Strukturiere und dokumentiere Dein Skript, isoliere
Zuständigkeiten, verwende "use strict" ... kurzum:
Mache Dir selbst die Arbeit leichter. Es macht wenig
Sinn, Dein komplettes Skript hier zur Diskussion zu
stellen, wenn Du eine technische Detailfrage hast.
Ich will Dich nicht entmutigen - ich will Dir Dein
fundamentales Problem zeigen. Dieses liegt nicht in
Deinem Perl-Skript, sondern in Deinem Programmierstil.
Ob Du ggf. Anfänger bist, spielt dabei keine Rolle.
Lerne, Fehler zu suchen - lerne, Zwischenausgaben
einzubauen und die Stelle zu lokalisieren, wo Deine
Variablen anfangen, unerklärliche Werte zu enthalten.
_Dann_ kannst Du sehr exakt die Fehlerstelle finden.
und wenn Du dann immer noch nicht verstehst, was das
Skript anders macht als Deine Erwartungshaltung,
_dann_ poste dieses Stückchen hier im Forum, und
einer der Perl-Cracks wird Dir aus dem Kopf die
Lösung sagen.
Dein komplettes Skript ist mir einfach zu lang - in
derselben Zeit könnte ich mindestens fünf besser
vorbereitete Fragen hier im Forum beantworten, sorry.
Dein Infrastrukturproblem kannst Du nur selbst lösen.
Viele Grüße
Michael