D:\my docs\My Received Files\Yabb\Yabb\YaBB_2.5_AEB\cgi-bin\yabb2_old\Sources\Guardian.pl D:\WEBSITES\testbed\cgi-bin\yabb252\Sources\Guardian.pl
############################################################################### ###############################################################################
# Guardian.pl                                                                 # # Guardian.pl                                                                 #
############################################################################### ###############################################################################
# YaBB: Yet another Bulletin Board                                            # # YaBB: Yet another Bulletin Board                                            #
# Open-Source Community Software for Webmasters                               # # Open-Source Community Software for Webmasters                               #
# Version:        YaBB 2.5 Anniversary Edition                                # # Version:        YaBB 2.5.2                                                  #
# Packaged:       July 04, 2010                                               # # Packaged:       September 30, 2012                                          #
# Distributed by: http://www.yabbforum.com                                    # # Distributed by: http://www.yabbforum.com                                    #
# =========================================================================== # # =========================================================================== #
# Copyright (c) 2000-2010 YaBB (www.yabbforum.com) - All Rights Reserved.     # # Copyright (c) 2000-2012 YaBB (www.yabbforum.com) - All Rights Reserved.     #
# Software by:  The YaBB Development Team                                     # # Software by:  The YaBB Development Team                                     #
#               with assistance from the YaBB community.                      # #               with assistance from the YaBB community.                      #
# Sponsored by: Xnull Internet Media, Inc. - http://www.ximinc.com            #    
#               Your source for web hosting, web design, and domains.         #    
############################################################################### ###############################################################################
   
$guardianplver = 'YaBB 2.5 AE $Revision: 1.12 $'; $guardianplver = 'YaBB 2.5.2 $Revision: 1.1 $';
   
$not_from   = qq~$webmaster_email~; $not_from   = qq~$webmaster_email~;
$not_to     = qq~$webmaster_email~; $not_to     = qq~$webmaster_email~;
$abuse_time = &timeformat($date,1,0,1); $abuse_time = &timeformat($date,1,0,1);
$abuse_time =~ s/<.*?>(.*?)<\/.*?>/$1/g; $abuse_time =~ s/<.*?>(.*?)<\/.*?>/$1/g;
   
sub guard { sub guard {
   if (!$use_guardian) { return; }    if (!$use_guardian) { return; }
   
   # Proxy Blocker    # Proxy Blocker
   $proxy0 = &get_remote_addr;    $proxy0 = &get_remote_addr;
   $proxy1 = &get_x_ip_client;    $proxy1 = &get_x_ip_client;
   $proxy2 = &get_x_forwarded;    $proxy2 = &get_x_forwarded;
   $proxy3 = &get_http_via;    $proxy3 = &get_http_via;
   
   @white_list = split(/\|/, $whitelist);    @white_list = split(/\|/, $whitelist);
   foreach (@white_list) {    foreach (@white_list) {
       chomp $_;        chomp $_;
       if (($proxy0 =~ m/$_/ || $proxy1 =~ m/$_/ || $proxy2 =~ m/$_/ || $proxy3 =~ m/$_/ || $username eq $_) && $_ ne "") { $whitelisted = 1; last; }        if (($proxy0 =~ m/$_/ || $proxy1 =~ m/$_/ || $proxy2 =~ m/$_/ || $proxy3 =~ m/$_/ || $username eq $_) && $_ ne "") { $whitelisted = 1; last; }
   }    }
   if ($disallow_proxy_on && !$whitelisted && !$iamadmin && ($proxy1 ne "empty" || $proxy2 ne "empty" || $proxy3 ne "empty")) {    if ($disallow_proxy_on && !$whitelisted && !$iamadmin && ($proxy1 ne "empty" || $proxy2 ne "empty" || $proxy3 ne "empty")) {
       if ($disallow_proxy_notify) {        if ($disallow_proxy_notify) {
           &LoadLanguage('Guardian');            &LoadLanguage('Guardian');
           $not_subject = qq~$guardian_txt{'main'}-($mbname): $guardian_txt{'proxy_abuse'} $guardian_txt{'abuse'}~;            $not_subject = qq~$guardian_txt{'main'}-($mbname): $guardian_txt{'proxy_abuse'} $guardian_txt{'abuse'}~;
           $not_body    = qq~$guardian_txt{'proxy_abuse'} $guardian_txt{'abuse'} $maintxt{'30'} $abuse_time\n\n~;            $not_body    = qq~$guardian_txt{'proxy_abuse'} $guardian_txt{'abuse'} $maintxt{'30'} $abuse_time\n\n~;
           $not_body .= qq~$guardian_txt{'abuse_user'}: $username -> (${$uid.$username}{'realname'})\n~;            $not_body .= qq~$guardian_txt{'abuse_user'}: $username -> (${$uid.$username}{'realname'})\n~;
           $not_body .= qq~$guardian_txt{'abuse_ip'}: (REMOTE_ADDR)->$proxy0, (X_IP_CLIENT)->$proxy1, (HTTP_X_FORWARDED_FOR)->$proxy2, (HTTP_VIA)->$proxy3\n~;            $not_body .= qq~$guardian_txt{'abuse_ip'}: (REMOTE_ADDR)->$proxy0, (X_IP_CLIENT)->$proxy1, (HTTP_X_FORWARDED_FOR)->$proxy2, (HTTP_VIA)->$proxy3\n~;
           if ($use_htaccess && $disallow_proxy_htaccess && !$iamadmin && !$iamgmod) {            if ($use_htaccess && $disallow_proxy_htaccess && !$iamadmin && !$iamgmod) {
               $not_body .= qq~$guardian_txt{'htaccess_added'}: $user_ip,\n\n~;                $not_body .= qq~$guardian_txt{'htaccess_added'}: $user_ip,\n\n~;
           }            }
           $not_body .= qq~$mbname, $guardian_txt{'main'}~;            $not_body .= qq~$mbname, $guardian_txt{'main'}~;
           $not_subject =~ s~\&trade\;~~g;            $not_subject =~ s~\&trade\;~~g;
           $not_body    =~ s~\&trade\;~~g;            $not_body    =~ s~\&trade\;~~g;
           &guardian_notify($not_to, $not_subject, $not_body, $not_from);            &guardian_notify($not_to, $not_subject, $not_body, $not_from);
       }        }
       if ($use_htaccess && $disallow_proxy_htaccess && !$iamadmin && !$iamgmod) {        if ($use_htaccess && $disallow_proxy_htaccess && !$iamadmin && !$iamgmod) {
           &update_htaccess("add", $user_ip);            &update_htaccess("add", $user_ip);
       }        }
       &fatal_error("proxy_reason");        &fatal_error("proxy_reason");
   }    }
   
   # Basic Value Setup    # Basic Value Setup
   $remote = &get_ip;    $remote = &get_ip;
   if (index($remote, ", ")) {    if (index($remote, ", ")) {
       @remotes = split("\, ", $remote);        @remotes = split("\, ", $remote);
       if ($remotes[0] ne "unknown" && $remotes[0] ne "empty" && $remotes[0] ne "127.0.0.1" && $remotes[0] ne "") {        if ($remotes[0] ne "unknown" && $remotes[0] ne "empty" && $remotes[0] ne "127.0.0.1" && $remotes[0] ne "") {
           $remote = $remotes[0];            $remote = $remotes[0];
       } else {        } else {
           $remote = $remotes[1];            $remote = $remotes[1];
       }        }
   }    }
   $querystring = &get_query_string;    $querystring = &get_query_string;
   
   # Check for Referer    # Check for Referer
   if ($referer_on) {    if ($referer_on) {
       @refererlist = split(/\|/, lc($banned_referers));        @refererlist = split(/\|/, lc($banned_referers));
       $streferer = lc(&get_referer);        $streferer = lc(&get_referer);
       foreach (@refererlist) {        foreach (@refererlist) {
           chomp $_;            chomp $_;
           if ($streferer =~ m/$_/ && $_ ne "") {            if ($streferer =~ m/$_/ && $_ ne "") {
               &LoadLanguage('Guardian');                &LoadLanguage('Guardian');
               if ($referer_notify) {                if ($referer_notify) {
                   $not_subject = qq~$guardian_txt{'main'}-($mbname): $guardian_txt{'referer_abuse'} $guardian_txt{'abuse'}~;                    $not_subject = qq~$guardian_txt{'main'}-($mbname): $guardian_txt{'referer_abuse'} $guardian_txt{'abuse'}~;
                   $not_body    = qq~$guardian_txt{'referer_abuse'} $guardian_txt{'abuse'} $maintxt{'30'} $abuse_time\n\n~;                    $not_body    = qq~$guardian_txt{'referer_abuse'} $guardian_txt{'abuse'} $maintxt{'30'} $abuse_time\n\n~;
                   $not_body .= qq~$guardian_txt{'abuse_user'}: $username -> (${$uid.$username}{'realname'})\n~;                    $not_body .= qq~$guardian_txt{'abuse_user'}: $username -> (${$uid.$username}{'realname'})\n~;
                   $not_body .= qq~$guardian_txt{'abuse_ip'}: $user_ip\n~;                    $not_body .= qq~$guardian_txt{'abuse_ip'}: $user_ip\n~;
                   if ($use_htaccess && $referer_htaccess && !$iamadmin && !$iamgmod) {                    if ($use_htaccess && $referer_htaccess && !$iamadmin && !$iamgmod) {
                       $not_body .= qq~$guardian_txt{'htaccess_added'}: $user_ip,\n~;                        $not_body .= qq~$guardian_txt{'htaccess_added'}: $user_ip,\n~;
                   }                    }
                   $not_body .= qq~$guardian_txt{'abuse_referer'}: $streferer\n\n~;                    $not_body .= qq~$guardian_txt{'abuse_referer'}: $streferer\n\n~;
                   $not_body .= qq~$mbname, $guardian_txt{'main'}~;                    $not_body .= qq~$mbname, $guardian_txt{'main'}~;
                   $not_subject =~ s~\&trade\;~~g;                    $not_subject =~ s~\&trade\;~~g;
                   $not_body    =~ s~\&trade\;~~g;                    $not_body    =~ s~\&trade\;~~g;
                   &guardian_notify($not_to, $not_subject, $not_body, $not_from);                    &guardian_notify($not_to, $not_subject, $not_body, $not_from);
               }                }
               if ($use_htaccess && $referer_htaccess && !$iamadmin && !$iamgmod) {                if ($use_htaccess && $referer_htaccess && !$iamadmin && !$iamgmod) {
                   &update_htaccess("add", $user_ip);                    &update_htaccess("add", $user_ip);
               }                }
               &fatal_error("referer_reason");                &fatal_error("referer_reason");
           }            }
       }        }
   }    }
   
   # Check for Harvester    # Check for Harvester
   if ($harvester_on) {    if ($harvester_on) {
       @harvesterlist = split(/\|/, lc($banned_harvesters));        @harvesterlist = split(/\|/, lc($banned_harvesters));
       $agent = lc(&get_user_agent);        $agent = lc(&get_user_agent);
       foreach (@harvesterlist) {        foreach (@harvesterlist) {
           chomp $_;            chomp $_;
           if ($agent =~ m/$_/ && $_ ne "") {            if ($agent =~ m/$_/ && $_ ne "") {
               if ($harvester_notify) {                if ($harvester_notify) {
                   &LoadLanguage('Guardian');                    &LoadLanguage('Guardian');
                   $not_subject = qq~$guardian_txt{'main'}-($mbname): $guardian_txt{'harvester_abuse'} $guardian_txt{'abuse'}~;                    $not_subject = qq~$guardian_txt{'main'}-($mbname): $guardian_txt{'harvester_abuse'} $guardian_txt{'abuse'}~;
                   $not_body    = qq~$guardian_txt{'harvester_abuse'} $guardian_txt{'abuse'} $maintxt{'30'} $abuse_time\n\n~;                    $not_body    = qq~$guardian_txt{'harvester_abuse'} $guardian_txt{'abuse'} $maintxt{'30'} $abuse_time\n\n~;
                   $not_body .= qq~$guardian_txt{'abuse_user'}: $username -> (${$uid.$username}{'realname'})\n~;                    $not_body .= qq~$guardian_txt{'abuse_user'}: $username -> (${$uid.$username}{'realname'})\n~;
                   $not_body .= qq~$guardian_txt{'abuse_ip'}: $user_ip\n~;                    $not_body .= qq~$guardian_txt{'abuse_ip'}: $user_ip\n~;
                   if ($use_htaccess && $harvester_htaccess && !$iamadmin && !$iamgmod) {                    if ($use_htaccess && $harvester_htaccess && !$iamadmin && !$iamgmod) {
                       $not_body .= qq~$guardian_txt{'htaccess_added'}: $user_ip,\n~;                        $not_body .= qq~$guardian_txt{'htaccess_added'}: $user_ip,\n~;
                   }                    }
                   $not_body .= qq~$guardian_txt{'abuse_harvester'}: $agent\n\n~;                    $not_body .= qq~$guardian_txt{'abuse_harvester'}: $agent\n\n~;
                   $not_body .= qq~$mbname, $guardian_txt{'main'}~;                    $not_body .= qq~$mbname, $guardian_txt{'main'}~;
                   $not_subject =~ s~\&trade\;~~g;                    $not_subject =~ s~\&trade\;~~g;
                   $not_body    =~ s~\&trade\;~~g;                      $not_body    =~ s~\&trade\;~~g;  
                   &guardian_notify($not_to, $not_subject, $not_body, $not_from);                    &guardian_notify($not_to, $not_subject, $not_body, $not_from);
               }                }
               if ($use_htaccess && $harvester_htaccess && !$iamadmin && !$iamgmod) {                if ($use_htaccess && $harvester_htaccess && !$iamadmin && !$iamgmod) {
                   &update_htaccess("add", $user_ip);                    &update_htaccess("add", $user_ip);
               }                }
               &fatal_error("harvester_reason");                &fatal_error("harvester_reason");
           }            }
       }        }
   }    }
   
   # Check for Request    # Check for Request
   if ($request_on) {    if ($request_on) {
       @requestlist = split(/\|/, lc($banned_requests));        @requestlist = split(/\|/, lc($banned_requests));
       $method = lc(&get_request_method);        $method = lc(&get_request_method);
       foreach (@requestlist) {        foreach (@requestlist) {
           chomp $_;            chomp $_;
           if ($method =~ m/$_/ && $_ ne "") {            if ($method =~ m/$_/ && $_ ne "") {
               if ($request_notify) {                if ($request_notify) {
                   &LoadLanguage('Guardian');                    &LoadLanguage('Guardian');
                   $not_subject = qq~$guardian_txt{'main'}-($mbname): $guardian_txt{'request_abuse'} $guardian_txt{'abuse'}~;                    $not_subject = qq~$guardian_txt{'main'}-($mbname): $guardian_txt{'request_abuse'} $guardian_txt{'abuse'}~;
                   $not_body    = qq~$guardian_txt{'request_abuse'} $guardian_txt{'abuse'} $maintxt{'30'} $abuse_time\n\n~;                    $not_body    = qq~$guardian_txt{'request_abuse'} $guardian_txt{'abuse'} $maintxt{'30'} $abuse_time\n\n~;
                   $not_body .= qq~$guardian_txt{'abuse_user'}: $username -> (${$uid.$username}{'realname'})\n~;                    $not_body .= qq~$guardian_txt{'abuse_user'}: $username -> (${$uid.$username}{'realname'})\n~;
                   $not_body .= qq~$guardian_txt{'abuse_ip'}: $user_ip\n~;                    $not_body .= qq~$guardian_txt{'abuse_ip'}: $user_ip\n~;
                   if ($use_htaccess && $request_htaccess && !$iamadmin && !$iamgmod) {                    if ($use_htaccess && $request_htaccess && !$iamadmin && !$iamgmod) {
                       $not_body .= qq~$guardian_txt{'htaccess_added'}: $user_ip,\n~;                        $not_body .= qq~$guardian_txt{'htaccess_added'}: $user_ip,\n~;
                   }                    }
                   $not_body .= qq~$guardian_txt{'abuse_request'}: $method\n\n~;                    $not_body .= qq~$guardian_txt{'abuse_request'}: $method\n\n~;
                   $not_body .= qq~$mbname, $guardian_txt{'main'}~;                    $not_body .= qq~$mbname, $guardian_txt{'main'}~;
                   $not_subject =~ s~\&trade\;~~g;                    $not_subject =~ s~\&trade\;~~g;
                   $not_body    =~ s~\&trade\;~~g;                    $not_body    =~ s~\&trade\;~~g;
                   &guardian_notify($not_to, $not_subject, $not_body, $not_from);                    &guardian_notify($not_to, $not_subject, $not_body, $not_from);
               }                }
               if ($use_htaccess && $request_htaccess && !$iamadmin && !$iamgmod) {                if ($use_htaccess && $request_htaccess && !$iamadmin && !$iamgmod) {
                   &update_htaccess("add", $user_ip);                    &update_htaccess("add", $user_ip);
               }                }
               &fatal_error("request_reason");                &fatal_error("request_reason");
           }            }
       }        }
   }    }
   
   # Check for Strings    # Check for Strings
   if ($string_on) {    if ($string_on) {
       require "$sourcedir/SubList.pl";        require "$sourcedir/SubList.pl";
       my ($temp_query, $testkey);        my ($temp_query, $testkey);
       $temp_query = lc($querystring);        $temp_query = lc($querystring);
       @stringlist = split(/\|/, lc($banned_strings));        @stringlist = split(/\|/, lc($banned_strings));
       foreach (@stringlist) {        foreach (@stringlist) {
           chomp $_;            chomp $_;
           foreach $testkey(keys %director){            ## strip off all existing command strings from the temporary query ##            foreach $testkey(keys %director){            ## strip off all existing command strings from the temporary query ##
               chomp $testkey;                chomp $testkey;
               $temp_query =~ s/$testkey//g;                $temp_query =~ s/$testkey//g;
           }            }
           if ($temp_query =~ m/$_/ && $_ ne "") {            if ($temp_query =~ m/$_/ && $_ ne "") {
               if ($string_notify) {                if ($string_notify) {
                   &LoadLanguage('Guardian');                    &LoadLanguage('Guardian');
                   $not_subject = qq~$guardian_txt{'main'}-($mbname): $guardian_txt{'string_abuse'} $guardian_txt{'abuse'}~;                    $not_subject = qq~$guardian_txt{'main'}-($mbname): $guardian_txt{'string_abuse'} $guardian_txt{'abuse'}~;
                   $not_body    = qq~$guardian_txt{'string_abuse'} $guardian_txt{'abuse'} $maintxt{'30'} $abuse_time\n\n~;                    $not_body    = qq~$guardian_txt{'string_abuse'} $guardian_txt{'abuse'} $maintxt{'30'} $abuse_time\n\n~;
                   $not_body .= qq~$guardian_txt{'abuse_user'}: $username -> (${$uid.$username}{'realname'})\n~;                    $not_body .= qq~$guardian_txt{'abuse_user'}: $username -> (${$uid.$username}{'realname'})\n~;
                   $not_body .= qq~$guardian_txt{'abuse_ip'}: $user_ip\n~;                    $not_body .= qq~$guardian_txt{'abuse_ip'}: $user_ip\n~;
                   if ($use_htaccess && $string_htaccess && !$iamadmin && !$iamgmod) {                    if ($use_htaccess && $string_htaccess && !$iamadmin && !$iamgmod && $action ne "downloadfile") {
                       $not_body .= qq~$guardian_txt{'htaccess_added'}: $user_ip,\n~;                        $not_body .= qq~$guardian_txt{'htaccess_added'}: $user_ip,\n~;
                   }                    }
                   $not_body .= qq~$guardian_txt{'abuse_string'}: $_\n~;                    $not_body .= qq~$guardian_txt{'abuse_string'}: $_\n~;
                   $not_body .= qq~$guardian_txt{'abuse_environment'}: $querystring\n\n~;                    $not_body .= qq~$guardian_txt{'abuse_environment'}: $querystring\n\n~;
                   $not_body .= qq~$mbname, $guardian_txt{'main'}~;                    $not_body .= qq~$mbname, $guardian_txt{'main'}~;
                   $not_subject =~ s~\&trade\;~~g;                    $not_subject =~ s~\&trade\;~~g;
                   $not_body    =~ s~\&trade\;~~g;                    $not_body    =~ s~\&trade\;~~g;
                   &guardian_notify($not_to, $not_subject, $not_body, $not_from);                    &guardian_notify($not_to, $not_subject, $not_body, $not_from);
               }                }
               if ($use_htaccess && $string_htaccess && !$iamadmin && !$iamgmod) {                if ($use_htaccess && $string_htaccess && !$iamadmin && !$iamgmod) {
                   &update_htaccess("add", $user_ip);                    &update_htaccess("add", $user_ip);
               }                }
               &fatal_error("string_reason","($_)");                &fatal_error("string_reason","($_)");
           }            }
       }        }
   }    }
   
   # Check for UNION attack (for MySQL database protection only)    # Check for UNION attack (for MySQL database protection only)
   if ($union_on) {    if ($union_on) {
       if ($querystring =~ m/%20union%20/ || $querystring =~ m/\*\/union\/\*/) {        if ($querystring =~ m/%20union%20/ || $querystring =~ m/\*\/union\/\*/) {
           if ($union_notify) {            if ($union_notify) {
               &LoadLanguage('Guardian');                &LoadLanguage('Guardian');
               $not_subject = qq~$guardian_txt{'main'}-($mbname): $guardian_txt{'union_abuse'} $guardian_txt{'abuse'}~;                $not_subject = qq~$guardian_txt{'main'}-($mbname): $guardian_txt{'union_abuse'} $guardian_txt{'abuse'}~;
               $not_body    = qq~$guardian_txt{'union_abuse'} $guardian_txt{'abuse'} $maintxt{'30'} $abuse_time\n\n~;                $not_body    = qq~$guardian_txt{'union_abuse'} $guardian_txt{'abuse'} $maintxt{'30'} $abuse_time\n\n~;
               $not_body .= qq~$guardian_txt{'abuse_user'}: $username -> (${$uid.$username}{'realname'})\n~;                $not_body .= qq~$guardian_txt{'abuse_user'}: $username -> (${$uid.$username}{'realname'})\n~;
               $not_body .= qq~$guardian_txt{'abuse_ip'}: $user_ip\n~;                $not_body .= qq~$guardian_txt{'abuse_ip'}: $user_ip\n~;
               if ($use_htaccess && $union_htaccess && !$iamadmin && !$iamgmod) {                if ($use_htaccess && $union_htaccess && !$iamadmin && !$iamgmod) {
                   $not_body .= qq~$guardian_txt{'htaccess_added'}: $user_ip,\n~;                    $not_body .= qq~$guardian_txt{'htaccess_added'}: $user_ip,\n~;
               }                }
               $not_body .= qq~$guardian_txt{'abuse_environment'}: $querystring\n\n~;                $not_body .= qq~$guardian_txt{'abuse_environment'}: $querystring\n\n~;
               $not_body .= qq~$mbname, $guardian_txt{'main'}~;                $not_body .= qq~$mbname, $guardian_txt{'main'}~;
               $not_subject =~ s~\&trade\;~~g;                $not_subject =~ s~\&trade\;~~g;
               $not_body    =~ s~\&trade\;~~g;                $not_body    =~ s~\&trade\;~~g;
               &guardian_notify($not_to, $not_subject, $not_body, $not_from);                &guardian_notify($not_to, $not_subject, $not_body, $not_from);
           }            }
           if ($use_htaccess && $union_htaccess && !$iamadmin && !$iamgmod) {            if ($use_htaccess && $union_htaccess && !$iamadmin && !$iamgmod) {
               &update_htaccess("add", $user_ip);                &update_htaccess("add", $user_ip);
           }            }
           &fatal_error("union_reason");            &fatal_error("union_reason");
       }        }
   }    }
   
   # Check for CLIKE attack (for MySQL database protection only)    # Check for CLIKE attack (for MySQL database protection only)
   if ($clike_on) {    if ($clike_on) {
       if ($querystring =~ m/\/\*/) {        if ($querystring =~ m/\/\*/) {
           if ($clike_notify) {            if ($clike_notify) {
               &LoadLanguage('Guardian');                &LoadLanguage('Guardian');
               $not_subject = qq~$guardian_txt{'main'}-($mbname): $guardian_txt{'clike_abuse'} $guardian_txt{'abuse'}~;                $not_subject = qq~$guardian_txt{'main'}-($mbname): $guardian_txt{'clike_abuse'} $guardian_txt{'abuse'}~;
               $not_body    = qq~$guardian_txt{'clike_abuse'} $guardian_txt{'abuse'} $maintxt{'30'} $abuse_time\n\n~;                $not_body    = qq~$guardian_txt{'clike_abuse'} $guardian_txt{'abuse'} $maintxt{'30'} $abuse_time\n\n~;
               $not_body .= qq~$guardian_txt{'abuse_user'}: $username -> (${$uid.$username}{'realname'})\n~;                $not_body .= qq~$guardian_txt{'abuse_user'}: $username -> (${$uid.$username}{'realname'})\n~;
               $not_body .= qq~$guardian_txt{'abuse_ip'}: $user_ip\n~;                $not_body .= qq~$guardian_txt{'abuse_ip'}: $user_ip\n~;
               if ($use_htaccess && $clike_htaccess && !$iamadmin && !$iamgmod) {                if ($use_htaccess && $clike_htaccess && !$iamadmin && !$iamgmod) {
                   $not_body .= qq~$guardian_txt{'htaccess_added'}: $user_ip,\n~;                    $not_body .= qq~$guardian_txt{'htaccess_added'}: $user_ip,\n~;
               }                }
               $not_body .= qq~$guardian_txt{'abuse_environment'}: $querystring\n\n~;                $not_body .= qq~$guardian_txt{'abuse_environment'}: $querystring\n\n~;
               $not_body .= qq~$mbname, $guardian_txt{'main'}~;                $not_body .= qq~$mbname, $guardian_txt{'main'}~;
               $not_subject =~ s~\&trade\;~~g;                $not_subject =~ s~\&trade\;~~g;
               $not_body    =~ s~\&trade\;~~g;                $not_body    =~ s~\&trade\;~~g;
               &guardian_notify($not_to, $not_subject, $not_body, $not_from);                &guardian_notify($not_to, $not_subject, $not_body, $not_from);
           }            }
           if ($use_htaccess && $clike_htaccess && !$iamadmin && !$iamgmod) {            if ($use_htaccess && $clike_htaccess && !$iamadmin && !$iamgmod) {
               &update_htaccess("add", $user_ip);                &update_htaccess("add", $user_ip);
           }            }
           &fatal_error("clike_reason");            &fatal_error("clike_reason");
       }        }
   }    }
   
   # Check for SCRIPTING attack    # Check for SCRIPTING attack
   if ($script_on) {    if ($script_on) {
       while (($key, $secvalue) = each(%INFO)) {        while (($key, $secvalue) = each(%INFO)) {
           $secvalue = lc($secvalue);            $secvalue = lc($secvalue);
           &str_replace("%3c", "<", $secvalue);            &str_replace("%3c", "<", $secvalue);
           &str_replace("%3e", ">", $secvalue);            &str_replace("%3e", ">", $secvalue);
           if (($secvalue =~ m/<[^>]script*\"?[^>]*>/) || ($secvalue =~ m/<[^>]*object*\"?[^>]*>/) || ($secvalue =~ m/<[^>]*iframe*\"?[^>]*>/) || ($secvalue =~ m/<[^>]*applet*\"?[^>]*>/) || ($secvalue =~ m/<[^>]*meta*\"?[^>]*>/) || ($secvalue =~ m/<[^>]*style*\"?[^>]*>/) || ($secvalue =~ m/<[^>]*form*\"?[^>]*>/) || ($secvalue =~ m/\([^>]*\"?[^)]*\)/) || ($secvalue =~ m/\"/)) {            if (($secvalue =~ m/<[^>]script*\"?[^>]*>/) || ($secvalue =~ m/<[^>]*object*\"?[^>]*>/) || ($secvalue =~ m/<[^>]*iframe*\"?[^>]*>/) || ($secvalue =~ m/<[^>]*applet*\"?[^>]*>/) || ($secvalue =~ m/<[^>]*meta*\"?[^>]*>/) || ($secvalue =~ m/<[^>]*style*\"?[^>]*>/) || ($secvalue =~ m/<[^>]*form*\"?[^>]*>/) || ($secvalue =~ m/\([^>]*\"?[^)]*\)/) || ($secvalue =~ m/\"/)) {
               if ($script_notify) {                if ($script_notify) {
                   &LoadLanguage('Guardian');                    &LoadLanguage('Guardian');
                   $not_subject = qq~$guardian_txt{'main'}-($mbname): $guardian_txt{'script_abuse'} $guardian_txt{'abuse'}~;                    $not_subject = qq~$guardian_txt{'main'}-($mbname): $guardian_txt{'script_abuse'} $guardian_txt{'abuse'}~;
                   $not_body    = qq~$guardian_txt{'script_abuse'} $guardian_txt{'abuse'} $maintxt{'30'} $abuse_time\n\n~;                    $not_body    = qq~$guardian_txt{'script_abuse'} $guardian_txt{'abuse'} $maintxt{'30'} $abuse_time\n\n~;
                   $not_body .= qq~$guardian_txt{'abuse_user'}: $username -> (${$uid.$username}{'realname'})\n~;                    $not_body .= qq~$guardian_txt{'abuse_user'}: $username -> (${$uid.$username}{'realname'})\n~;
                   $not_body .= qq~$guardian_txt{'abuse_ip'}: $user_ip\n~;                    $not_body .= qq~$guardian_txt{'abuse_ip'}: $user_ip\n~;
                   if ($use_htaccess && $script_htaccess && !$iamadmin && !$iamgmod) {                    if ($use_htaccess && $script_htaccess && !$iamadmin && !$iamgmod) {
                       $not_body .= qq~$guardian_txt{'htaccess_added'}: $user_ip,\n~;                        $not_body .= qq~$guardian_txt{'htaccess_added'}: $user_ip,\n~;
                   }                    }
                   $not_body .= qq~$guardian_txt{'abuse_url_environment'}: $secvalue\n\n~;                    $not_body .= qq~$guardian_txt{'abuse_url_environment'}: $secvalue\n\n~;
                   $not_body .= qq~$mbname, $guardian_txt{'main'}~;                    $not_body .= qq~$mbname, $guardian_txt{'main'}~;
                   $not_subject =~ s~\&trade\;~~g;                    $not_subject =~ s~\&trade\;~~g;
                   $not_body    =~ s~\&trade\;~~g;                    $not_body    =~ s~\&trade\;~~g;
                   &guardian_notify($not_to, $not_subject, $not_body, $not_from);                    &guardian_notify($not_to, $not_subject, $not_body, $not_from);
               }                }
               if ($use_htaccess && $script_htaccess && !$iamadmin && !$iamgmod) {                if ($use_htaccess && $script_htaccess && !$iamadmin && !$iamgmod) {
                   &update_htaccess("add", $user_ip);                    &update_htaccess("add", $user_ip);
               }                }
               &fatal_error("script_reason");                &fatal_error("script_reason");
           }            }
       }        }
       while (($key, $secvalue) = each(%FORM)) {        while (($key, $secvalue) = each(%FORM)) {
           $secvalue = lc($secvalue);            $secvalue = lc($secvalue);
           $secvalue =~ s/\[code.*?\/code\]//gs if $key eq 'message' and $action =~ /^(post|modify|imsend)2$/;            $secvalue =~ s/\[code.*?\/code\]//gs if $key eq 'message' and $action =~ /^(post|modify|imsend)2$/;
           &str_replace("%3c", "<", $secvalue);            &str_replace("%3c", "<", $secvalue);
           &str_replace("%3e", ">", $secvalue);            &str_replace("%3e", ">", $secvalue);
           if (($secvalue =~ m/<[^>]script*\"?[^>]*>/) || ($secvalue =~ m/<[^>]style*\"?[^>]*>/)) {            if (($secvalue =~ m/<[^>]script*\"?[^>]*>/) || ($secvalue =~ m/<[^>]style*\"?[^>]*>/)) {
               if ($script_notify) {                if ($script_notify) {
                   &LoadLanguage('Guardian');                    &LoadLanguage('Guardian');
                   $not_subject = qq~$guardian_txt{'main'}-($mbname): $guardian_txt{'script_abuse'} $guardian_txt{'abuse'}~;                    $not_subject = qq~$guardian_txt{'main'}-($mbname): $guardian_txt{'script_abuse'} $guardian_txt{'abuse'}~;
                   $not_body    = qq~$guardian_txt{'script_abuse'} $guardian_txt{'abuse'} $maintxt{'30'} $abuse_time\n\n~;                    $not_body    = qq~$guardian_txt{'script_abuse'} $guardian_txt{'abuse'} $maintxt{'30'} $abuse_time\n\n~;
                   $not_body .= qq~$guardian_txt{'abuse_user'}: $username -> (${$uid.$username}{'realname'})\n~;                    $not_body .= qq~$guardian_txt{'abuse_user'}: $username -> (${$uid.$username}{'realname'})\n~;
                   $not_body .= qq~$guardian_txt{'abuse_ip'}: $user_ip\n~;                    $not_body .= qq~$guardian_txt{'abuse_ip'}: $user_ip\n~;
                   if ($use_htaccess && $script_htaccess && !$iamadmin && !$iamgmod) {                    if ($use_htaccess && $script_htaccess && !$iamadmin && !$iamgmod) {
                       $not_body .= qq~$guardian_txt{'htaccess_added'}: $user_ip,\n~;                        $not_body .= qq~$guardian_txt{'htaccess_added'}: $user_ip,\n~;
                   }                    }
                   $not_body .= qq~$guardian_txt{'abuse_form_environment'}: $secvalue\n\n~;                    $not_body .= qq~$guardian_txt{'abuse_form_environment'}: $secvalue\n\n~;
                   $not_body .= qq~$mbname, $guardian_txt{'main'}~;                    $not_body .= qq~$mbname, $guardian_txt{'main'}~;
                   $not_subject =~ s~\&trade\;~~g;                    $not_subject =~ s~\&trade\;~~g;
                   $not_body    =~ s~\&trade\;~~g;                    $not_body    =~ s~\&trade\;~~g;
                   &guardian_notify($not_to, $not_subject, $not_body, $not_from);                    &guardian_notify($not_to, $not_subject, $not_body, $not_from);
               }                }
               if ($use_htaccess && $script_htaccess && !$iamadmin && !$iamgmod) {                if ($use_htaccess && $script_htaccess && !$iamadmin && !$iamgmod) {
                   &update_htaccess("add", $user_ip);                    &update_htaccess("add", $user_ip);
               }                }
               &fatal_error("script_reason");                &fatal_error("script_reason");
           }            }
       }        }
   }    }
   return;    return;
} }
   
   
sub guardian_notify { sub guardian_notify {
   require "$sourcedir/Mailer.pl";    require "$sourcedir/Mailer.pl";
   my ($to, $subject, $body, $from) = @_;    my ($to, $subject, $body, $from) = @_;
   my $result = &sendmail($to, $subject, $body, $from);    my $result = &sendmail($to, $subject, $body, $from);
} }
   
sub get_remote_port { sub get_remote_port {
   if ($ENV{'REMOTE_PORT'}) {    if ($ENV{'REMOTE_PORT'}) {
       return $ENV{'REMOTE_PORT'};        return $ENV{'REMOTE_PORT'};
   } else {    } else {
       return "empty";        return "empty";
   }    }
} }
   
sub get_request_method { sub get_request_method {
   if ($ENV{'REQUEST_METHOD'}) {    if ($ENV{'REQUEST_METHOD'}) {
       return $ENV{'REQUEST_METHOD'};        return $ENV{'REQUEST_METHOD'};
   } else {    } else {
       return "empty";        return "empty";
   }    }
} }
   
sub get_script_name { sub get_script_name {
   if ($ENV{'SCRIPT_NAME'}) {    if ($ENV{'SCRIPT_NAME'}) {
       return $ENV{'SCRIPT_NAME'};        return $ENV{'SCRIPT_NAME'};
   } else {    } else {
       return "empty";        return "empty";
   }    }
} }
   
sub get_http_host { sub get_http_host {
   if ($ENV{'HTTP_HOST'}) {    if ($ENV{'HTTP_HOST'}) {
       return $ENV{'HTTP_HOST'};        return $ENV{'HTTP_HOST'};
   } else {    } else {
       return "empty";        return "empty";
   }    }
} }
   
sub get_query_string { sub get_query_string {
   if ($ENV{'QUERY_STRING'}) {    if ($ENV{'QUERY_STRING'}) {
       my $tempstring = &str_replace("%09", "%20", $ENV{'QUERY_STRING'});        my $tempstring = &str_replace("%09", "%20", $ENV{'QUERY_STRING'});
       return &str_replace("%09", "%20", $ENV{'QUERY_STRING'});        return &str_replace("%09", "%20", $ENV{'QUERY_STRING'});
   } else {    } else {
       return "empty";        return "empty";
   }    }
} }
   
sub get_user_agent { sub get_user_agent {
   if ($ENV{'HTTP_USER_AGENT'}) {    if ($ENV{'HTTP_USER_AGENT'}) {
       return $ENV{'HTTP_USER_AGENT'};        return $ENV{'HTTP_USER_AGENT'};
   } else {    } else {
       return "empty";        return "empty";
   }    }
} }
   
sub get_referer { sub get_referer {
   if ($ENV{'HTTP_REFERER'}) {    if ($ENV{'HTTP_REFERER'}) {
       return $ENV{'HTTP_REFERER'};        return $ENV{'HTTP_REFERER'};
   } else {    } else {
       return "empty";        return "empty";
   }    }
} }
   
sub get_ip { sub get_ip {
   $client_ip   = &get_client_ip;      ## HTTP_CLIENT_IP    $client_ip   = &get_client_ip;      ## HTTP_CLIENT_IP
   $x_forwarded = &get_x_forwarded;    ## HTTP_X_FORWARDED_FOR    $x_forwarded = &get_x_forwarded;    ## HTTP_X_FORWARDED_FOR
   $x_ip_client = &get_x_ip_client;    ## X_IP_CLIENT    $x_ip_client = &get_x_ip_client;    ## X_IP_CLIENT
   $http_via    = &get_http_via;       ## HTTP_VIA    $http_via    = &get_http_via;       ## HTTP_VIA
   $remote_addr = &get_remote_addr;    ## REMOTE_ADDR    $remote_addr = &get_remote_addr;    ## REMOTE_ADDR
   if ($client_ip && $client_ip !~ m/empty/ && $client_ip !~ m/unknown/) {    if ($client_ip && $client_ip !~ m/empty/ && $client_ip !~ m/unknown/) {
       return $client_ip;        return $client_ip;
   } elsif ($x_forwarded && $x_forwarded !~ m/empty/ && $x_forwarded !~ m/unknown/) {    } elsif ($x_forwarded && $x_forwarded !~ m/empty/ && $x_forwarded !~ m/unknown/) {
       return $x_forwarded;        return $x_forwarded;
   } elsif ($x_ip_client && $x_ip_client !~ m/empty/ && $x_ip_client !~ m/unknown/) {    } elsif ($x_ip_client && $x_ip_client !~ m/empty/ && $x_ip_client !~ m/unknown/) {
       return $x_ip_client;        return $x_ip_client;
   } elsif ($http_via && $http_via !~ m/empty/ && $http_via !~ m/unknown/) {    } elsif ($http_via && $http_via !~ m/empty/ && $http_via !~ m/unknown/) {
       return $http_via;        return $http_via;
   } elsif ($remote_addr && $remote_addr !~ m/empty/ && $remote_addr !~ m/unknown/) {    } elsif ($remote_addr && $remote_addr !~ m/empty/ && $remote_addr !~ m/unknown/) {
       return $remote_addr;        return $remote_addr;
   } else {    } else {
       return "empty";        return "empty";
   }    }
} }
   
sub get_client_ip { sub get_client_ip {
   if ($ENV{'HTTP_CLIENT_IP'} && $ENV{'HTTP_CLIENT_IP'} ne "127.0.0.1") {    if ($ENV{'HTTP_CLIENT_IP'} && $ENV{'HTTP_CLIENT_IP'} ne "127.0.0.1") {
       return $ENV{'HTTP_CLIENT_IP'};        return $ENV{'HTTP_CLIENT_IP'};
   } else {    } else {
       return "empty";        return "empty";
   }    }
} }
   
sub get_x_ip_client { sub get_x_ip_client {
   if ($ENV{'X_CLIENT_IP'} && $ENV{'X_CLIENT_IP'} ne "127.0.0.1") {    if ($ENV{'X_CLIENT_IP'} && $ENV{'X_CLIENT_IP'} ne "127.0.0.1") {
       return $ENV{'X_CLIENT_IP'};        return $ENV{'X_CLIENT_IP'};
   } else {    } else {
       return "empty";        return "empty";
   }    }
} }
   
sub get_http_via { sub get_http_via {
   if ($ENV{'HTTP_VIA'} && $ENV{'HTTP_VIA'} ne "127.0.0.1") {    if ($ENV{'HTTP_VIA'} && $ENV{'HTTP_VIA'} ne "127.0.0.1") {
       return $ENV{'HTTP_VIA'};        return $ENV{'HTTP_VIA'};
   } else {    } else {
       return "empty";        return "empty";
   }    }
} }
   
sub get_x_forwarded { sub get_x_forwarded {
   if ($ENV{'HTTP_X_FORWARDED_FOR'} && $ENV{'HTTP_X_FORWARDED_FOR'} ne "127.0.0.1") {    if ($ENV{'HTTP_X_FORWARDED_FOR'} && $ENV{'HTTP_X_FORWARDED_FOR'} ne "127.0.0.1") {
       return $ENV{'HTTP_X_FORWARDED_FOR'};        return $ENV{'HTTP_X_FORWARDED_FOR'};
   } else {    } else {
       return "empty";        return "empty";
   }    }
} }
   
sub get_remote_addr { sub get_remote_addr {
   if ($ENV{'REMOTE_ADDR'}) {    if ($ENV{'REMOTE_ADDR'}) {
       return $ENV{'REMOTE_ADDR'};        return $ENV{'REMOTE_ADDR'};
   } else {    } else {
       return "empty";        return "empty";
   }    }
} }
   
sub str_replace { sub str_replace {
   my ($org, $repl, $target) = @_;    my ($org, $repl, $target) = @_;
   $target =~ s~$org~$repl~ig;    $target =~ s~$org~$repl~ig;
   return $target;    return $target;
} }
   
sub update_htaccess { sub update_htaccess {
   my ($action, $value) = @_;    my ($action, $value) = @_;
   my ($htheader, $htfooter, @denies, @htout);    my ($htheader, $htfooter, @denies, @htout);
   if (!$action) { return 0; }    if (!$action) { return 0; }
   fopen(HTA, ".htaccess");    fopen(HTA, ".htaccess");
   my @htlines = <HTA>;    my @htlines = <HTA>;
   fclose(HTA);    fclose(HTA);
   
   # header to determine only who has access to the main script, not the admin script    # header to determine only who has access to the main script, not the admin script
   $htheader = qq~<Files YaBB*>~;    $htheader = qq~<Files YaBB*>~;
   $htfooter = qq~</Files>~;    $htfooter = qq~</Files>~;
   $start = 0;    $start = 0;
   foreach (@htlines) {    foreach (@htlines) {
       chomp $_;        chomp $_;
       if ($_ eq $htheader) { $start = 1; }        if ($_ eq $htheader) { $start = 1; }
       if ($start == 0 && $_ !~ m/#/ && $_ ne "") { push(@htout, "$_\n"); }        if ($start == 0 && $_ !~ m/#/ && $_ ne "") { push(@htout, "$_\n"); }
       if ($_ eq $htfooter) { $start = 0; }        if ($_ eq $htfooter) { $start = 0; }
       if ($start == 1 && $_ =~ s/Deny from //g) {        if ($start == 1 && $_ =~ s/Deny from //g) {
           push(@denies, $_);            push(@denies, $_);
       }        }
   }    }
   if ($use_htaccess && ($action eq "add" || $action eq "remove")) {    if ($use_htaccess && ($action eq "add" || $action eq "remove")) {
       fopen(HTA, ">.htaccess");        fopen(HTA, ">.htaccess");
       print HTA "# Last modified by The Guardian: " . &timeformat($date, 1) . " #\n\n";        print HTA "# Last modified by The Guardian: " . &timeformat($date, 1) . " #\n\n";
       print HTA @htout;        print HTA @htout;
       if ($value) {        if ($value) {
           print HTA "\n$htheader\n";            print HTA "\n$htheader\n";
           foreach (@denies) {            foreach (@denies) {
               if ($_ ne $value) { print HTA "Deny from $_\n"; }                if ($_ ne $value) { print HTA "Deny from $_\n"; }
           }            }
           if ($action eq "add") { print HTA "Deny from $value\n"; }            if ($action eq "add") { print HTA "Deny from $value\n"; }
           print HTA "$htfooter\n";            print HTA "$htfooter\n";
       }        }
       fclose(HTA);        fclose(HTA);
   }    }
} }
   
1; 1;