Want more features on Pastebin? Sign Up, it's FREE!
Guest

osC_Sec 5.0.7

By: a guest on May 15th, 2012  |  syntax: PHP  |  size: 61.84 KB  |  views: 70  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. <?php
  2.  
  3.   /**
  4.    * @package osC_Sec Security Class for Oscommerce
  5.    * @author Te Taipo <rohepotae@gmail.com>
  6.    * @copyright (c) Hokioi-IT
  7.    * @license http://opensource.org/licenses/gpl-license.php GNU Public License
  8.    * @version $Id: osC_Sec.php 5.0.7
  9.    * @see readme.htm
  10.    * @link http://addons.oscommerce.com/info/8283/
  11.    **/
  12.  
  13.   # switch off server error 'notices'
  14.  error_reporting( 6135 );
  15.  
  16.   # make sure $_SERVER[ "REQUEST_URI" ] is set
  17.  fix_server_vars();
  18.  
  19.   # prevent direct viewing of osC_Sec.php
  20.  if ( false !== strpos( strtolower( $_SERVER[ "SCRIPT_NAME" ] ), osCSec_selfchk() ) ) senda404Header();
  21.  
  22.   # include the settings file osc.php
  23.  $oscfilepath = rtrim( dirname( __file__ ), '/\\' ) . DIRECTORY_SEPARATOR . 'osc.php';
  24.   if ( file_exists( $oscfilepath ) ) {
  25.       require_once( $oscfilepath );
  26.   } else {
  27.       # if osc.php missing
  28.      $osC_Sec = new osC_Sec();
  29.       $osC_Sec->Sentry( $timestampOffset = 0,
  30.                         $nonGETPOSTReqs = 0,
  31.                         $spiderBlock = 0,
  32.                         $banipaddress = 0,
  33.                         $useIPTRAP = 0,
  34.                         $ipTrapBlocked="",
  35.                         $emailenabled = 0,
  36.                         $youremail = "",
  37.                         $fromemail = "",
  38.                         $disable_tellafriend = NULL );
  39.   }
  40.  
  41.   class osC_Sec {
  42.    
  43.     var $_fullreport = true;
  44.    
  45.     function Sentry( $timestampOffset = 0,
  46.                      $nonGETPOSTReqs = 0,
  47.                      $spiderBlock = 0,
  48.                      $banipaddress = 0,
  49.                      $useIPTRAP = 0,
  50.                      $ipTrapBlocked = "",
  51.                      $emailenabled = 0,
  52.                      $youremail = "",
  53.                      $fromemail = "",
  54.                      $disable_tellafriend = NULL ) {
  55.      
  56.       $this->_nonGETPOSTReqs = ( bool )$this->fINT( $nonGETPOSTReqs );
  57.       $this->_banipaddress = ( bool )$this->fINT( $banipaddress );
  58.       $this->_useIPTRAP = ( bool )$this->fINT( $useIPTRAP );
  59.       $this->_emailenabled = ( bool )$this->fINT( $emailenabled );
  60.       $this->_currentVersion = "5.0.7";
  61.       $spiderBlock = ( bool )$this->fINT( $spiderBlock );
  62.       $this->rprefix = "osC_Sec detected ";
  63.      
  64.       $this->_disable_tellafriend = 0;
  65.       if ( isset( $disable_tellafriend ) ) $this->_disable_tellafriend = ( bool )$this->fINT( $disable_tellafriend );
  66.  
  67.       $this->setIPTrapBlocked( $ipTrapBlocked );
  68.  
  69.       if ( false !== ( bool )$this->fINT( $this->_emailenabled ) ) {
  70.           $this->_youremail = $youremail;
  71.           $this->_fromemail = $fromemail;
  72.           $this->_timestampOffset = $this->fINT( $timestampOffset );
  73.       }
  74.      
  75.       # if open_basedir is not set in php.ini then set it in the local scope
  76.      # only available for version 2.3.1 of osCommerce
  77.      $this->setOpenBaseDir();
  78.      
  79.       # check settings are correct
  80.      $this->chkSetup();
  81.      
  82.       # reliably set $PHP_SELF as a filename
  83.      global $PHP_SELF;
  84.       $PHP_SELF = $this->phpSelfFix();
  85.  
  86.       # prevent the version of php being discovered
  87.      $this->x_powered_by();
  88.      
  89.       # ban bad harvesting spiders
  90.      if ( false !== $spiderBlock ) $this->badArachnid();
  91.  
  92.       # set the host address to be used in the email notification and htaccess
  93.      if ( ( false !== $this->_emailenabled )
  94.          || ( false !== $this->_banipaddress ) ) {
  95.          $this->_httphost = preg_replace( "/^(?:([^\.]+)\.)?domain\.com$/", "\1", $_SERVER[ "SERVER_NAME" ] );
  96.       }
  97.       # set the path to the htaccess in the root catalog
  98.      if ( $this->_banipaddress ) $this->_htaccessfile = $this->strCharsfrmStr( $this->getDir() . ".htaccess", "//", "/" );
  99.      
  100.       # set the path to the IP_Trapped.txt file
  101.      if ( false !== $this->_useIPTRAP ) {
  102.          $this->_ipTrappedURL = $this->strCharsfrmStr( $this->getDir() . "banned/IP_Trapped.txt", "//", "/" );
  103.          # if ip address already in the trapped banlist, redirect to blocked.php
  104.         if ( false !== $this->ipTrapped() ) {
  105.              header( "Location: " . $this->_ipTrapBlocked );
  106.              exit;
  107.          }
  108.       }
  109.  
  110.       # check for the specific attempt to exploit osCommerce
  111.      # no requests are exempt from this filter
  112.      $this->osCAdminLoginBypass();
  113.      
  114.       # filters either _GET or _POST requests
  115.      $this->_REQUEST_Shield();
  116.  
  117.       # check for database injection attempts
  118.      $this->dbShield();
  119.  
  120.       # check _GET requests against the blacklist
  121.      $this->getShield();
  122.  
  123.       # check _POST requests against the blacklist
  124.      $this->postShield();
  125.  
  126.       # run through $_COOKIE checking against blacklists
  127.      $this->cookieShield();
  128.  
  129.       # prevent non-standard requests:
  130.      $this->checkReqType();
  131.  
  132.       # prevent tell_a_friend.php spam
  133.      # by disabling guest emailing
  134.      $this->disable_tellafriend();
  135.  
  136.       # PHP5 with register_long_arrays off? From SoapCMS Core Security Class
  137.      $this->setGlobals();
  138.  
  139.       # merge $_REQUEST with cleaned _GET and _POST excluding _COOKIE data
  140.      $_REQUEST = array_merge( $_GET, $_POST );
  141.     } // end of osC_Sec Sentry function
  142.  
  143.     /**
  144.      * banChecker()
  145.      *
  146.      * @return
  147.      */
  148.     function banChecker( $r = "", $t = false ) {
  149.          if ( false === $this->byPass() ) return;
  150.             if ( false !== ( bool )$t ) {
  151.                       return $this->tinoRahui( $r );
  152.             } else $this->senda403Header();
  153.     }
  154.     /**
  155.      * osCEmailer()
  156.      *
  157.      * @return
  158.      */
  159.     function osCEmailer( $r, $fullreport = true ) {
  160.          # disable the emailer if htaccess not writable when .htaccess banning is enabled
  161.         if ( false !== $this->_banipaddress ) {
  162.             if ( false === $this->hCoreFileChk( $this->_htaccessfile ) ) return;
  163.          }
  164.          # if the default install 'to' email has not changed or is empty, then disable the emailer
  165.         if ( ( false !== strpos( $this->_youremail, "youremail@yourdomain.com" ) )
  166.               || empty( $this->_youremail ) ) return;
  167.  
  168.          # send the notification
  169.         if ( ( ( false !== $this->_banipaddress )
  170.                || ( false !== $this->_useIPTRAP ) )
  171.                && ( false !== $this->_emailenabled ) ) {
  172.             global $PHP_SELF;
  173.             if ( ( false !== $this->_banipaddress )
  174.                 && ( false !== $this->hCoreFileChk( $this->_htaccessfile ) ) ) {
  175.                 $banAction = "htaccess banned";
  176.             } elseif ( ( false !== $this->_useIPTRAP ) ) {
  177.                 $banAction = "IP Trap banned";
  178.             }
  179.             if ( !isset( $this->_timestampOffset ) ) $this->_timestampOffset = 0;
  180.             $timestamp = gmdate( "D, d M Y H:i:s", time() + ( $this->_timestampOffset * 3600 ) );
  181.             $to = $this->_youremail;
  182.             $subject = $this->_httphost . " " . ( substr( $r, 0, 60 ) ) . "...";
  183.             $body = "This IP [ " . $this->getRealIP() . " ] has been " . $banAction . " on the http://" . $this->_httphost .
  184.                 " website by osC_Sec.php version " . $this->_currentVersion . "\n\nREASON FOR BAN: " . $r . "\n\nTime of ban: " .
  185.                 $timestamp . "\n";
  186.             $body .= "\n.------------[ ALL \$_GET VARIABLES ]-------------\n#\n";
  187.             if ( !empty( $_GET ) ) {
  188.                 $sDimGET = $this->array_flatten( $_GET, true );
  189.                 foreach ( $sDimGET as $k => $v ) {
  190.                     if ( empty( $v ) ) $v = "NULL";
  191.                     if ( !is_array( $k ) && !is_array( $v ) ) $body .= "# - " . $k . " = " . htmlspecialchars( $v ) . "\n";
  192.                 }
  193.             } else {
  194.                 $body .= "# - No \$_GET data\n";
  195.             }
  196.             $body .= "#\n`--------------------------------------------------------\n";
  197.             $body .= "\n.---------[ ALL \$_POST FORM VARIABLES ]-------\n#\n";
  198.             if ( ( isset( $_POST ) ) && ( $_SERVER[ "REQUEST_METHOD" ] == "POST" ) ) {
  199.                 $sDimPOST = $this->array_flatten( $_POST, true );
  200.                 foreach ( $sDimPOST as $k => $v ) {
  201.                     if ( empty( $v ) ) $v = "NULL";
  202.                     if ( !is_array( $k ) && !is_array( $v ) ) $body .= "# - " . $k . " = " . htmlspecialchars( $v ) . "\n";
  203.                 }
  204.             } else {
  205.                 $body .= "# - No POST form data\n";
  206.             }
  207.             $body .= "#\n`--------------------------------------------------------\n";
  208.             $body .= "\n.------------[ \$_SERVER VARIABLES ]--------------\n#\n";
  209.             if ( false !== $fullreport ) {
  210.                 $sDimSERVER = $this->array_flatten( $_SERVER, true );
  211.                 foreach ( $sDimSERVER as $k => $v ) {
  212.                     if ( empty( $v ) ) $v = "NULL";
  213.                     if ( !is_array( $k ) && !is_array( $v ) ) $body .= "# - " . $k . " = " . htmlspecialchars( $v ) . "\n";
  214.                 }
  215.             } else {
  216.                 # short report
  217.                $serverVars = new ArrayIterator( array( "HTTP_HOST", "HTTP_USER_AGENT", "SERVER_ADDR", "REMOTE_ADDR",
  218.                     "DOCUMENT_ROOT", "SCRIPT_FILENAME", "REQUEST_METHOD", "REQUEST_URI", "SCRIPT_NAME", "QUERY_STRING",
  219.                     "HTTP_X_CLUSTER_CLIENT_IP", "HTTP_X_FORWARDED_FOR", "HTTP_X_ORIGINAL_URL", "ORIG_PATH_INFO",
  220.                     "HTTP_X_REWRITE_URL", "HTTP_CLIENT_IP", "HTTP_PROXY_USER", "REDIRECT_URL", "SERVER_SOFTWARE" ) );
  221.                 while ( $serverVars->valid() ) {
  222.                     if ( array_key_exists( $serverVars->current(), $_SERVER ) && !empty( $_SERVER[$serverVars->current()] ) ) {
  223.                         $body .= "# - \$_SERVER[ \"" . $serverVars->current() . "\" ] = " . $_SERVER[$serverVars->current()] .
  224.                             "\n";
  225.                     }
  226.                     $serverVars->next();
  227.                 }
  228.    
  229.             }
  230.    
  231.             $body .= "# - \$PHP_SELF filename ( osC_Sec ) = " . $PHP_SELF . "\n";
  232.             $body .= "#\n`--------------------------------------------------------\n\n";
  233.             $body .= "OTHER INFO\n";
  234.             $body .= $this->_htaccessfile;
  235.             $body .= "\n";
  236.             $body .= "is htaccess writeable = " . ( false !== $this->hCoreFileChk( $this->_htaccessfile ) );
  237.             $body .= "\n\nResolve IP address: http://en.utrace.de/?query=" . $this->getRealIP() . "\n";
  238.             $body .= "Search Project Honeypot: http://www.projecthoneypot.org/ip_" . $this->getRealIP() . "\n\n";
  239.             $body .= "This email was generated by osC_Sec. To disable email notifications," .
  240.                 " open osc.php file, and in the Settings section change \$emailenabled" . " = 1 to \$emailenabled = 0\n\n";
  241.             $body .= "Keep up with the latest version of osC_Sec.php at ";
  242.             $body .= "http://addons.oscommerce.com/info/8283 and http://goo.gl/dQ3jH\n";
  243.             $body .= "Email rohepotae@gmail.com with any suggestions.\n\n";
  244.             $from = "From: " . $this->_fromemail;
  245.             mail( $to, $subject, $body, $from );
  246.       }
  247.     return;
  248.     }
  249.     /**
  250.      * setGlobals()
  251.      *
  252.      * @return
  253.      */
  254.     function setGlobals() {
  255.          if ( @phpversion() >= "5.0.0"
  256.             && ( !ini_get( "register_long_arrays" )
  257.             || @ini_get( "register_long_arrays" ) == "0"
  258.             || strtolower( @ini_get( "register_long_arrays" ) ) == "off" ) ) {
  259.             global $HTTP_POST_VARS, $HTTP_GET_VARS, $HTTP_SERVER_VARS, $HTTP_COOKIE_VARS,
  260.                    $HTTP_ENV_VARS, $HTTP_POST_FILES, $HTTP_SESSION_VARS;
  261.    
  262.                    $HTTP_POST_VARS = $_POST;
  263.                    $HTTP_GET_VARS = $_GET;
  264.                    $HTTP_SERVER_VARS = $_SERVER;
  265.                    $HTTP_COOKIE_VARS = $_COOKIE;
  266.                    $HTTP_ENV_VARS = $_ENV;
  267.                    $HTTP_POST_FILES = $_FILES;
  268.    
  269.                    # _SESSION is the only superglobal which is conditionally set
  270.                   if ( isset( $_SESSION ) ) $HTTP_SESSION_VARS = $_SESSION;
  271.          }
  272.     return;
  273.     }
  274.     /**
  275.      * senda403Header()
  276.      *
  277.      * @return
  278.      */
  279.     function senda403Header() {
  280.         $header = array( "HTTP/1.1 403 Access Denied", "Status: 403 Access Denied by osC_Sec", "Content-Length: 0" );
  281.         foreach ( $header as $sent ) {
  282.             header( $sent );
  283.         }
  284.         die();
  285.     }
  286.  
  287.     /**
  288.      * tinoRahui()
  289.      *
  290.      * @return
  291.      */
  292.     function tinoRahui( $r ) {
  293.          if ( false === $this->byPass() ) return;
  294.          if ( ( false !== $this->_banipaddress ) && ( false !== $this->hCoreFileChk( $this->_htaccessfile ) ) ) {
  295.              # send an email
  296.             if ( false !== $this->_emailenabled ) $this->osCEmailer( $r, $this->_fullreport );
  297.              # add ip to htaccess
  298.             $this->htaccessbanip( $this->getRealIP() );
  299.              # call an access denied header
  300.             return $this->senda403Header();
  301.          } elseif ( false !== $this->_useIPTRAP ) {
  302.              if ( isset( $this->_ipTrappedURL ) && ( false !== $this->hCoreFileChk( $this->_ipTrappedURL ) ) ) {
  303.                  # send an email
  304.                 $this->osCEmailer( $r, $this->_fullreport );
  305.                  # add ip to iptrap ban file
  306.                 $this->ipTrapban( $this->getRealIP() );
  307.                  # redirect to blocked.php
  308.                 header( "Location: " . $this->_ipTrapBlocked );
  309.                  exit;
  310.              } else {
  311.                  # if non-wrtiable iptrap file then call an access denied header
  312.                 header( "Location: " . $this->_ipTrapBlocked );
  313.                  exit;
  314.              }
  315.          } elseif ( false !== $this->_banipaddress ) {
  316.              if ( false === $this->hCoreFileChk( $this->_htaccessfile ) ) {
  317.                  # if non-wrtiable htaccess then call an access denied header
  318.                 return $this->senda403Header();
  319.              }
  320.          } elseif ( ( false === $this->_banipaddress ) && ( !$this->_useIPTRAP ) ) {
  321.              # if no banip or iptrap then call an access denied header
  322.             die( $r ); //return $this->senda403Header();
  323.          } else die();
  324.     }
  325.     /**
  326.      * osCAdminLoginBypass()
  327.      * @return
  328.      */
  329.     function osCAdminLoginBypass() {
  330.          # $this->byPass() is not called here
  331.         if ( false !== strpos( $this->getREQUEST_URI(), ".php/login" ) ) {
  332.             $r = $this->rprefix . "an attempt to exploit the admin login bypass exploit. ";
  333.             $this->banChecker( $r, true );
  334.             return;
  335.          } else return;
  336.     }
  337.  
  338.     /**
  339.      * disable_tellafriend()
  340.      * @return
  341.      */
  342.     function disable_tellafriend() {
  343.          if ( false === $this->_disable_tellafriend
  344.              || empty( $this->_disable_tellafriend )
  345.              || 0 == $this->_disable_tellafriend ) return;
  346.          global $PHP_SELF;
  347.          $errlevel = ini_get( 'error_reporting' );
  348.          if ( false === strpos( $PHP_SELF, "tell_a_friend.php" ) ) {
  349.               return;
  350.          } elseif ( false !== strpos( $PHP_SELF, "tell_a_friend.php" )
  351.            && ( "POST" == $_SERVER[ "REQUEST_METHOD" ] )
  352.            && isset( $_GET[ "products_id" ] ) ) {
  353.               $r = $this->rprefix . "an attempt to send spam via the tell_a_friend.php file. ";
  354.               $this->banChecker( $r, true );
  355.               return;
  356.          } elseif ( false !== strpos( $PHP_SELF, "tell_a_friend.php" )
  357.            && isset( $_GET[ "products_id" ] ) ) {
  358.               error_reporting( 0 );
  359.               header( "Location: ./index.php" );
  360.               return error_reporting( $errlevel );
  361.          }
  362.     }
  363.     /**
  364.      * databaseShield()
  365.      * @return
  366.      */
  367.     function dbShield() {
  368.          if ( false === $this->byPass() || empty( $_SERVER[ "QUERY_STRING" ] ) ) return;
  369.          $_query = stripslashes( $_SERVER[ "QUERY_STRING" ] );
  370.          if ( false !== $this->injectionMatch( strtolower( $_query ) ) ) {
  371.                $r = $this->rprefix . "a database injection attempt: [ " . $_query . " ]. ";
  372.                $this->banChecker( $r, true );
  373.                return;
  374.          }
  375.          if ( ( strlen( $_SERVER[ "HTTP_USER_AGENT" ] ) > 1 )
  376.               && false !== $this->injectionMatch( $_SERVER[ "HTTP_USER_AGENT" ] ) ) {
  377.                 $r = $this->rprefix . "\$_SERVER[ \"HTTP_USER_AGENT\" ] which contains a database injection attempt: [ " . $_SERVER[ "HTTP_USER_AGENT" ] . " ]. ";
  378.                 $this->banChecker( $r, true );
  379.                 return;
  380.          }
  381.     }
  382.     /**
  383.      * postShield()
  384.      *
  385.      * @return
  386.      */
  387.     function postShield() {
  388.          if ( ( !isset( $_POST ) ) || ( "POST" !== $_SERVER[ "REQUEST_METHOD" ] )
  389.              || ( false === $this->byPass() ) ) return;
  390.          $postvar_blacklist = array( "eval(base64_decode", "concat(@@" );
  391.  
  392.          $pnodes = $this->array_flatten( $_POST, false );
  393.          $i = 0;
  394.          while ( $i < count( $pnodes ) ) {
  395.              foreach ( $postvar_blacklist as $blacklisted ) {
  396.                  $pnodes[$i] = strtolower( $pnodes[$i] );
  397.                  if ( ( is_string( $pnodes[$i] ) ) && ( strlen( $pnodes[$i] ) > 0 ) ) {
  398.                      if ( ( false !== strpos( $pnodes[$i], $blacklisted ) )
  399.                          || ( false !== strpos( urldecode( $pnodes[$i] ), urldecode( $blacklisted ) ) ) ) {
  400.                          $r = $this->rprefix . "an attempt to post malicious content: " . htmlspecialchars( stripslashes( $blacklisted ) ) . ". ";
  401.                          $this->banChecker( $r, true );
  402.                          return;
  403.                      }
  404.                  }
  405.              }
  406.              $i++;
  407.          }
  408.     }
  409.     /**
  410.      * getShield()
  411.      *
  412.      * @return
  413.      */
  414.     function getShield() {
  415.          if ( ( false === $this->byPass() ) || empty( $_SERVER[ "QUERY_STRING" ] ) ) return;
  416.          $reqvar_blacklist = array(
  417.          "php/login", "eval(base64_decode", "asc%3Deval", "fromCharCode", "; base64", "base64,","_START_",
  418.          "onerror=alert(", "mysql_query", "../cmd", "rush=", "pwtoken_get", "EXTRACTVALUE(", "phpinfo(", "%000",
  419.          "php_uname", "%3Cform", "passthru(", "sha1(", "sha2(", "<%3Fphp", "}%00.", "/iframe", "\$_GET",
  420.          "ob_starting", ") limit", "%20and%201=1", "document.cookie", "document.write(", "onload%3d",
  421.          "document.location", "window.location", "location.replace\(", "document.write",
  422.          "onunload%3d", "PHP_SELF", "shell_exec", "\$_SERVER", "substr(", "\$_POST", "\$_SESSION", "\$_REQUEST",
  423.          "\$_ENV", "GLOBALS[", "\$HTTP_", ".php/admin", "mosConfig_", "%3C@replace(", "hex_ent", "inurl:",
  424.          "replace(", "/iframe>", "return%20clk", "login.php?action=backupnow", "php/password_for", "@@datadir",
  425.          "unhex(", "error_reporting(", "HTTP_CMD", "=alert(", "version()", "localhost", "})%3B", "/FRAMESET",
  426.          "Set-Cookie", "%27%a0%6f%72%a0%31%3d%31", "%bf%5c%27", "%bf%27", "%ef%bb%bf", "%8c%5c",
  427.          "%a3%27", "%20regexp%20", "JHs=", "HTTP/1.", "{\$_", "PRINT @@variable", "xp_cmdshell",
  428.          "xp_availablemedia", "*(|(objectclass=", "||UTL_HTTP.REQUEST", "<script>" );
  429.  
  430.          $injectattempt = false;
  431.          
  432.          $thenode = strtolower( $this->getREQUEST_URI() );
  433.  
  434.          $v = $this->cleanString( 1, $this->url_decoder( $thenode ) );
  435.          
  436.          # run through a specific set of tests on the REQUEST_URI irregardless of REQUEST_METHOD
  437.         if ( ( false !== ( bool )preg_match( "/onmouse(?:down|over)/i", $v ) )
  438.              && ( 2 < ( int )preg_match_all( "/c(?:path|tthis|t\(this)|http:|(?:forgotte|admi)n|sqlpatch|,,|ftp:|(?:aler|promp)t/i", $v, $matches ) ) ) {
  439.              $injectattempt = true;
  440.          } elseif ( ( ( false !== strpos( $v, "ftp:" ) ) && ( substr_count( $v, "ftp" ) > 1 ) )
  441.              && ( 2 < ( int )preg_match_all( "/@|\/\/|:/i", $v, $matches ) ) ) {
  442.              $injectattempt = true;
  443.          } elseif ( ( "POST" == $_SERVER[ "REQUEST_METHOD" ] )
  444.                    && ( false !== ( bool )preg_match( "/(?:showimg|cookie|cookies)=/i", $v ) ) ) {
  445.                    $injectattempt = true;
  446.          } elseif ( ( substr_count( $v, "../" ) > 2 )
  447.              || ( substr_count( $v, "..//" ) > 2 ) ) {
  448.              $sqlfilematchlist = "access_|access.|\balias\b|apache|bin|\bboot\b|config|\benviron\b|error_|error.|etc|
  449.                        httpd|.log|_log|\.(?:js|txt|exe|ht|ini|bat)|\blib\b|log|\bproc\b|\bsql\b|tmp|\busr\b|
  450.                        \bvar\b|(?:uploa|passw)d";
  451.              $sqlfilematchlist = preg_replace( "/[\s]/i", "", $sqlfilematchlist );
  452.              if ( false !== ( bool )preg_match( "/$sqlfilematchlist/i", $v ) ) {
  453.                 $injectattempt = true;
  454.              }
  455.          } elseif ( ( false !== ( bool )preg_match( "/%0D%0A/i", $thenode ) )
  456.              && ( false !== strpos( $thenode, "utf-7" ) ) ) {
  457.              $injectattempt = true;
  458.          } elseif ( false !== ( bool )preg_match( "/php:\/\/filter|convert.base64-(?:encode|decode)|zlib.(?:inflate|deflate)/i", $v )
  459.              || false !== ( bool )preg_match( "/data:\/\/filter|text\/plain|http:\/\/(?:127.0.0.1|localhost)/i", $v ) ) {
  460.              $injectattempt = true;
  461.          }
  462.          if ( false !== ( bool )$injectattempt ) {
  463.              $r = $this->rprefix . "an attempt to read or include unauthorized file content. ";
  464.              $this->banChecker( $r, true );
  465.              return;
  466.          }
  467.          foreach ( $reqvar_blacklist as $blacklisted ) {
  468.              $blacklisted = strtolower( $this->url_decoder( $blacklisted ) );
  469.              # simple check of the request_uri against the blacklist irregardless of REQUEST_METHOD
  470.  
  471.              if ( ( false !== strpos( $thenode, $blacklisted ) ) ||
  472.                   ( false !== strpos( $this->url_decoder( urldecode( $thenode ) ), $this->url_decoder( $blacklisted ) ) ) ) {
  473.                  $r = $this->rprefix . "a banned blacklist request_uri item: " . htmlspecialchars( $blacklisted ) . ". ";
  474.                  $this->banChecker( $r, true );
  475.                  return;
  476.              }
  477.              # simple check of the http_user_agent against the blacklist irregardless of REQUEST_METHOD
  478.             if ( ( false !== strpos( strtolower( $_SERVER[ "HTTP_USER_AGENT" ] ), $blacklisted ) )
  479.                  || ( false !== strpos( $this->url_decoder( $_SERVER[ "HTTP_USER_AGENT" ] ), $this->url_decoder( $blacklisted ) ) ) ) {
  480.                   $r = $this->rprefix . "\$_SERVER[ \"HTTP_USER_AGENT\" ] which contains a banned string: " . htmlspecialchars( $blacklisted ) . ". ";
  481.                   $this->banChecker( $r, true );
  482.                   return;
  483.              }
  484.          }
  485.          # check each part of the $_GET query string against the list
  486.         if ( !empty( $_SERVER[ "QUERY_STRING" ] ) ) {
  487.              $gnodes = explode( "&", $_SERVER[ "QUERY_STRING" ] );
  488.              $i = 0;
  489.              while ( $i < count( $gnodes ) ) {
  490.                if ( false === is_string( $gnodes[$i] ) ) {
  491.                   continue;
  492.                } else {
  493.                   if ( false !== strpos( $gnodes[$i], "=" ) ) {
  494.                      $tmp = explode( "=", $gnodes[$i] );
  495.                      if ( is_array( $tmp ) ) {
  496.                          $gvar = strtolower( $tmp[count( $tmp ) - count( $tmp )] );
  497.                          $gval = $tmp[count( $tmp ) - 1];
  498.                      }
  499.                   } else {
  500.                     $gvar = $gnodes[$i];
  501.                     $gval = "";
  502.                   }
  503.                   $gfvar = $this->cleanString( 2, $gvar );
  504.                   if ( !empty( $gval ) )  {
  505.                      $gval64 = strtolower( base64_decode( $gval ) );
  506.                      $gvalhexcheck = strtolower( $this->hextoascii( $gval ) );
  507.                      $gval = strtolower( $gval );
  508.                      $gfval = $this->cleanString( 2, $gval );
  509.                   }
  510.                   foreach ( $reqvar_blacklist as $blacklisted ) {
  511.                       $blacklisted = strtolower( $this->url_decoder( $blacklisted ) );
  512.                       if ( false !== $this->issetStrlen( $gfvar ) && ( false !== strpos( $gfvar, $blacklisted ) )
  513.                           || ( false !== strpos( $this->url_decoder( urldecode( $gfvar ) ), $this->url_decoder( $blacklisted ) ) ) ) {
  514.                            $r = $this->rprefix . "a getShield() listed banned query_string filtered variable: " . htmlspecialchars( $blacklisted ) . ". ";
  515.                            $this->banChecker( $r, true );
  516.                            return;
  517.                       }
  518.                       if ( false !== $this->issetStrlen( $gvalhexcheck )
  519.                            && ( ( false !== strpos( $gvalhexcheck, $blacklisted ) )
  520.                            || ( false !== strpos( $this->url_decoder( urldecode( $gvalhexcheck ) ), $this->url_decoder( $blacklisted ) ) ) ) ) {
  521.                            $r = $this->rprefix . "a banned hexcode query_string value: " . htmlspecialchars( $blacklisted ) . ". ";
  522.                            $this->banChecker( $r, true );
  523.                            return;
  524.                       }
  525.                       if ( false !== $this->issetStrlen( $gvalhexcheck )
  526.                            && false !== $this->injectionMatch( $gvalhexcheck ) ) {
  527.                            $r = $this->rprefix . "a hexcode database injection attempt: [ " . $gvalhexcheck . " ]. ";
  528.                            $this->banChecker( $r, true );
  529.                            return;
  530.                        }
  531.                       if ( false !== $this->issetStrlen( $gval64 ) && ( false !== strpos( $gval64, $blacklisted ) ) ) {
  532.                            $r = $this->rprefix . "a base64 encoded blacklisted query_string value: " . htmlspecialchars( $blacklisted ) . ". ";
  533.                            $this->banChecker( $r, true );
  534.                            return;
  535.                       }
  536.                       if ( false !== $this->issetStrlen( $gfval ) && ( ( false !== strpos( $gfval, $blacklisted ) ) ||
  537.                            ( false !== strpos( $this->url_decoder( urldecode( $gfval ) ), $this->url_decoder( $blacklisted ) ) ) ) ) {
  538.                            $r = $this->rprefix . "a blacklist query_string filtered value: " . htmlspecialchars( $blacklisted ) . ". ";
  539.                            $this->banChecker( $r, true );
  540.                            return;
  541.                       }
  542.                   }
  543.                }
  544.              $i++;
  545.              }
  546.          }
  547.     }
  548.     /**
  549.      * _REQUEST_Shield()
  550.      *
  551.      * @return
  552.      */
  553.     function _REQUEST_Shield() {
  554.  
  555.          # this filter will only be affective on patched webservers to catch the PHP
  556.         # code execution bug (CVE-2012-1823) See: http://www.php.net/archive/2012.php#id2012-05-08-1
  557.         if ( false !== strpos( $this->getREQUEST_URI(), "?" ) ) {
  558.             $v = substr( $this->getREQUEST_URI(), strpos( $this->getREQUEST_URI(), "?" ), strlen( $this->getREQUEST_URI() ) );
  559.             if ( false !== strpos( $v, "-" )
  560.                 && ( ( false !== strpos( $v, "?-" ) )
  561.                     || ( false !== strpos( $v, "?+-" ) )
  562.                     || ( false !== strpos( $this->url_decoder( $v ), "?+-" ) ) )
  563.                 && ( false === strpos( $this->url_decoder( $v ), "=" ) ) ) {
  564.                 $r = $this->rprefix . "an attempt to exploit a PHP bug. (CVE-2012-1823)";
  565.                 $this->banChecker( $r, true );
  566.                 return;
  567.             }
  568.          }
  569.     }
  570.     /**
  571.      * cookieShield()
  572.      *
  573.      * @return
  574.      */
  575.     function cookieShield() {
  576.          if ( ( false === $this->byPass() ) || ( false !== empty( $_COOKIE ) ) ) return;
  577.  
  578.          $_cookie_blacklist = "eval\(base64_|fromCharCode|prompt\(|ZXZhbCg=|ZnJvbUNoYXJDb2Rl|U0VMRUNULyoqLw==|Ki9XSEVSRS8q";
  579.  
  580.          $injectattempt = false;
  581.          $cnodekeys = array_keys( $_COOKIE );
  582.          $cnodevals = array_values( $_COOKIE );
  583.          $v = implode( " ", $cnodevals );
  584.          $orig_v = $v;
  585.          $injectattempt = ( bool )$this->injectionMatch( $v );
  586.          if ( false !== ( bool )$injectattempt ) {
  587.              $r = $this->rprefix . "malicious \$_COOKIE content: [ " . stripslashes( $orig_v ) . " ].";
  588.              $this->banChecker( $r, true );
  589.              return;
  590.          }
  591.          $i = 0;
  592.          while ( $i < count( $cnodekeys ) ) {
  593.              $cnodekey = strtolower( $cnodekeys[$i] );
  594.              $cnodeval = rawurldecode( strtolower( $cnodevals[$i] ) );
  595.              if ( ( is_string( $cnodekey ) ) ) {
  596.                 if ( false !== ( bool )preg_match( "/$_cookie_blacklist/i", ( $cnodeval ) ) ) {
  597.                    $r = $this->rprefix . "a banned \$_Cookie string: " . $cnodekey . "=" . $cnodeval;
  598.                    $this->banChecker( $r, true );
  599.                    return;
  600.                 }
  601.              }
  602.              $i++;
  603.          }
  604.     }
  605.     /**
  606.      * injectionMatch()
  607.      *
  608.      * @param mixed $string
  609.      * @return
  610.      */
  611.     function injectionMatch( $string ) {
  612.          $string = $this->url_decoder( $string );
  613.          $string = $this->cleanString( 1, $string ); // urldecode twice
  614.          $string = strtolower( $string );
  615.          $string = str_replace( "//", " ", $string );
  616.          $sqlmatchlist = "(?:abs|ascii|base64|bin|cast|chr|char|charset|collation|concat|concat_ws|
  617.                           conv|convert|count|curdate|database|date|decode|diff|distinct|elt|encode|encrypt|
  618.                           extract|field|floor|format|hex|if|in|insert|instr|interval|lcase|left|
  619.                           length|load_file|locate|lock|log|lower|lpad|ltrim|max|md5|mid|mod|name|now|
  620.                           null|ord|password|position|quote|rand|repeat|replace|reverse|right|rlike|
  621.                           round|row_count|rpad|rtrim|_set|schema|sha1|sha2|sleep|soundex|space|strcmp|
  622.                           substr|substr_index|substring|sum|time|trim|truncate|ucase|unhex|upper|
  623.                           _user|user|values|varchar|version|while|xor)\(|\(0x|@@|cast|integer";
  624.                            $sqlmatchlist = preg_replace( "/[\s]/i", "", $sqlmatchlist );
  625.                            
  626.          $sqlupdatelist = "\bcolumn\b|\bdata\b|concat\(|\bemail\b|\blogin\b|\bname\b|\bpass\b|sha1|sha2|\btable\b|\bwhere\b|\buser\b|\bval\b|0x";
  627.          
  628.          if ( false !== ( bool )preg_match( "/\bdrop\b/i", $string )
  629.              && false !== ( bool )preg_match( "/\btable\b|\buser\b/i", $string )
  630.              && false !== ( bool )preg_match( "/--|\//i", $string ) ) {
  631.                return true;
  632.          } elseif ( ( false !== strpos( $string, "grant" ) )
  633.                  && ( false !== strpos( $string, "all" ) )
  634.                  && ( false !== strpos( $string, "privileges" ) ) ) {
  635.                return true;
  636.          } elseif ( false !== ( bool )preg_match( "/(?:(sleep\((\s*)(\d*)(\s*)\)|benchmark\((.*)\,(.*)\)))/i", $string ) ) {
  637.                return true;
  638.          } elseif ( false !== preg_match_all( "/\bload\b|\bdata\b|\binfile\b|\btable\b|\bterminated\b/i", $string, $matches ) > 3 ) {
  639.                return true;
  640.          } elseif ( ( ( false !== ( bool )preg_match( "/select|declare|ascii\(substring|length\(/i", $string ) )
  641.            && ( false !== ( bool )preg_match( "/\band\b|\bif\b|\bfrom\b/i", $string ) )
  642.            && ( false !== ( bool )preg_match( "/$sqlmatchlist/", $string ) ) ) ) {
  643.                return true;
  644.          } elseif ( false !== preg_match_all( "/$sqlmatchlist/", $string, $matches ) > 2 ) {
  645.                return true;
  646.          } elseif ( false !== strpos( $string, "update" ) && false !== ( bool )preg_match( "/\bset\b/i", $string )
  647.                && ( false !== ( bool )preg_match( "/$sqlupdatelist/i", $string ) ) ) {
  648.                return true;
  649.          # tackle the noDB / js issue
  650.         } elseif ( ( substr_count( $string, "var" ) > 1 ) && ( false !== ( bool )preg_match( "/date\(|while\(|sleep\(/i", $string ) ) ) {
  651.                return true;
  652.          }
  653.          $string = $this->cleanString( 2, $string );
  654.          $sqlmatchlist = "@@|_and|ascii|b(?:enchmark|etween|in|itlength|ulk)|c(?:ast|har|ookie|ollate|oncat|urrent)|\bdate\b|dump|
  655.                          e(?:lt|xport)|false|\bfield\b|fetch|format|function|\bhaving\b|i(?:dentity|nforma|nstr)|\bif\b|\bin\b|
  656.                          l(?:case|eft|ength|ike|imit|oad|ocate|ower|pad|trim)|join|m(:?ake|atch|d5|id)|not_like|not_regexp|order|outfile|
  657.                          p(?:ass|ost|osition|riv)|\bquote\b|\br(?:egexp\b|ename\b|epeat\b|eplace\b|equest\b|everse\b|eturn\b|ight\b|like\b|pad\b|trim\b)|
  658.                          \bs(?:ql\b|hell\b|leep\b|trcmp\b|ubstr\b)|\bt(?:able\b|rim\b|rue\b|runcate\b)|u(?:case|nhex|pdate|pper|ser)|
  659.                          values|varchar|\bwhen\b|where|with|\(0x|_(?:decrypt|encrypt|get|post|server|cookie|global|or|request|xor)|
  660.                          (?:column|db|load|not|octet|sql|table|xp)_";
  661.                          $sqlmatchlist = preg_replace( "/[\s]/i", "", $sqlmatchlist );
  662.                          
  663.          if ( false !== strpos( $string, "by" )
  664.              && ( false !== ( bool )preg_match( "/\border\b|\bgroup\b/i", $string ) )
  665.              && ( false !== ( bool )preg_match( "/\bcolumn\b|\bdesc\b|\berror\b|\bfrom\b|hav|\blimit\b|\boffset\b|\btable\b|\/|--/i", $string )
  666.              || ( false !== ( bool )preg_match( "/\b[0-9]\b/i", $string ) ) ) ) {
  667.                return true;
  668.          } elseif ( ( false !== ( bool )preg_match( "/\btable\b|\bcolumn\b/i", $string  ) ) && false !== strpos( $string, "exists" )
  669.              && ( false !== ( bool )preg_match( "/\bif\b|\berror\b|\buser\b|\bno\b/i", $string ) ) ) {
  670.                return true;
  671.          } elseif ( ( ( false !== strpos( $string, "waitfor" ) && false !== strpos( $string, "delay" ) && ( ( bool )preg_match( "/(:)/i", $string ) ) )
  672.              || false !== strpos( $string, "nowait" ) )
  673.              && ( false !== ( bool )preg_match( "/--|\/|\blimit\b|\bshutdown\b|\bupdate\b|\bdesc\b/i", $string ) ) ) {
  674.                return true;
  675.          } elseif ( false !== ( bool )preg_match( "/\binto\b/i", $string )
  676.              && ( false !== ( bool )preg_match( "/\boutfile\b/i", $string ) ) ) {
  677.                return true;
  678.          } elseif ( false !== ( bool )preg_match( "/\bdrop\b/i", $string )
  679.              && ( false !== ( bool )preg_match( "/\buser\b/i", $string ) ) ) {
  680.                return true;
  681.          } elseif ( ( ( false !== strpos( $string, "create" ) && false !== ( bool )preg_match( "/\btable\b|\buser\b|\bselect\b/i", $string ) )
  682.              || ( false !== strpos( $string, "delete" ) && false !== strpos( $string, "from" ) )
  683.              || ( false !== strpos( $string, "insert" ) && ( false !== ( bool )preg_match( "/\bexec\b|\binto\b|from/i", $string ) ) )
  684.              || ( false !== strpos( $string, "select" ) && ( false !== ( bool )preg_match( "/\bby\b|\bcase\b|from|\bif\b|\binto\b|\bord\b|union/i", $string ) ) ) )
  685.              && ( ( false !== ( bool )preg_match( "/$sqlmatchlist/i", $string ) ) || ( 2 < substr_count( $string, "," ) ) ) ) {
  686.                return true;
  687.          } elseif ( ( false !== strpos( $string, "union" ) )
  688.                   && ( false !== strpos( $string, "select" ) )
  689.                   && ( false !== strpos( $string, "from" ) ) ) {
  690.                   return true;
  691.          } elseif ( false !== strpos( $string, "null" ) ) {
  692.                $nstring = preg_replace( "/[^a-z]/i", "", $this->url_decoder( $string ) );
  693.                if ( false !== ( bool )preg_match( "/(null){2,}/i", $nstring ) ) {
  694.                    return true;
  695.                } else return false;
  696.          } else return false;
  697.     return false;
  698.     }
  699.     function hextoascii( $str ) {
  700.          if ( ( substr_count( $str, "%" ) < 3 ) && ( substr_count( $str, "\x" ) < 1 ) ) return;
  701.          $p = "";
  702.          for ( $i = 0; $i < strlen( $str ); $i = $i + 2 ) {
  703.              $p .= chr( hexdec( substr( $str, $i, 2 ) ) );
  704.          }
  705.          return $this->cleanString( 1, $p );
  706.     }
  707.     function cleanString( $b, $s ) {
  708.          switch( $b ) {
  709.              case( 1 ):
  710.                   return preg_replace( "/[^\s{}a-z0-9_?,()=@%:{}\/.-]/i", "", $this->url_decoder( $s ) );
  711.                   break;
  712.              case ( 2 ):
  713.                   return preg_replace( "/[^\s{}a-z0-9_?,=@%:{}\/.-]/i", "", $this->url_decoder( $s ) );
  714.                   break;
  715.              case ( 3 ):
  716.                   return preg_replace( "/[^a-z0-9]/i", "", $this->url_decoder( $s ) );
  717.                   break;
  718.              default:
  719.                   return $this->url_decoder( $s );
  720.          }
  721.     }
  722.     function notemptisarr( $var ) {
  723.          return ( bool )( !empty( $var ) && is_array( $var ) );
  724.     }
  725.     /**
  726.      * htaccessbanip()
  727.      *
  728.      * @param mixed $banip
  729.      * @return
  730.      */
  731.     function htaccessbanip( $banip ) {
  732.          if ( false === $this->byPass() ) return;
  733.          if ( !isset( $this->_htaccessfile ) ) return $this->senda403Header();
  734.          $limitend = "# End of $this->_httphost Osc_Sec Ban\n";
  735.          $newline = "deny from $banip\n";
  736.          if ( file_exists( $this->_htaccessfile ) ) {
  737.              $mybans = file( $this->_htaccessfile );
  738.              $lastline = "";
  739.              if ( in_array( $newline, $mybans ) ) exit();
  740.              if ( in_array( $limitend, $mybans ) ) {
  741.                  $i = count( $mybans ) - 1;
  742.                  while ( $mybans[$i] != $limitend ) {
  743.                      $lastline = array_pop( $mybans ) . $lastline;
  744.                      $i--;
  745.                  }
  746.                  $lastline = array_pop( $mybans ) . $lastline;
  747.                  $lastline = array_pop( $mybans ) . $lastline;
  748.                  array_push( $mybans, $newline, $lastline );
  749.              } else {
  750.                  array_push( $mybans, "\n\n# $this->_httphost Osc_Sec Ban\n", "order allow,deny\n", $newline,
  751.                      "allow from all\n", $limitend );
  752.              }
  753.          } else {
  754.              $mybans = array( "# $this->_httphost Osc_Sec Ban\n", "order allow,deny\n", $newline, "allow from all\n", $limitend );
  755.          }
  756.          if ( ini_get( 'allow_url_fopen' ) == 1 ) @ini_set( 'allow_url_fopen', '0' );
  757.          if ( ini_get( 'allow_url_include' ) == 1 ) @ini_set( 'allow_url_include', '0' );
  758.          $myfile = fopen( $this->_htaccessfile, "w" );
  759.          fwrite( $myfile, implode( $mybans, "" ) );
  760.          fclose( $myfile );
  761.     }
  762.     /**
  763.      * ipTrapped()
  764.      *
  765.      * @return
  766.      */
  767.     function ipTrapped() {
  768.          if ( ( false !== $this->_useIPTRAP )
  769.              && ( !empty( $this->_ipTrappedURL )
  770.                  && file_exists( $this->_ipTrappedURL ) ) ) {
  771.                 # if IP is already in IP Trap list then redirect
  772.                $mybans = file( $this->_ipTrappedURL );
  773.                 if ( false === $mybans ) return false;
  774.                 $mybans = array_values( $mybans );
  775.                 foreach ( $mybans as $i => $value ) {
  776.                     if ( strlen( $mybans[$i] > 0 ) ) {
  777.                         # find IP address in IP Trap ban list
  778.                        if ( false !== strpos( $mybans[$i], $this->getRealIP() ) ) {
  779.                             $this->_emailenabled = 0;
  780.                             return true;
  781.                         }
  782.                     }
  783.                 }
  784.          }
  785.          return false;
  786.     }
  787.    
  788.     function setIPTrapBlocked( $ipTrapBlocked ) {
  789.          if ( false !== ( bool )$this->fINT( $this->_useIPTRAP ) ) {
  790.             if ( false !== $this->fURL( $ipTrapBlocked ) ) {
  791.                 $this->_ipTrapBlocked = $ipTrapBlocked;
  792.                 return;
  793.             } else {
  794.                 $this->_ipTrapBlocked = "";
  795.                 return;
  796.             }
  797.          } else return;
  798.     }
  799.     /**
  800.      * my_array_filter_fn()
  801.      *
  802.      * @param mixed $val
  803.      * @return
  804.      */
  805.     function my_array_filter_fn( $val ) {
  806.          $val = trim( $val );
  807.          $allowed_vals = array( "0" );
  808.          return in_array( $val, $allowed_vals, true ) ? true : ( $val ? true : false );
  809.     }
  810.     /**
  811.      * ipTrapban()
  812.      *
  813.      * @param mixed $banip
  814.      * @return
  815.      */
  816.     function ipTrapban( $banip ) {
  817.          if ( false === $this->byPass() ) return;
  818.          $bannedAlready = false;
  819.          $limitend = "\n";
  820.          $newline = "$banip";
  821.          if ( !empty( $this->_ipTrappedURL ) && file_exists( $this->_ipTrappedURL ) ) {
  822.              $mybans = file( $this->_ipTrappedURL );
  823.              $lastline = "";
  824.              $mybans = array_filter( $mybans, array( "osC_Sec", "my_array_filter_fn" ) );
  825.              $mybans = array_values( $mybans );
  826.              $endIPTrapIP = "999.999.999.999";
  827.              foreach ( $mybans as $i => $value ) {
  828.                  if ( strlen( $mybans[$i] > 0 ) ) {
  829.                      if ( false !== strpos( $mybans[$i], $newline ) ) $bannedAlready = true;
  830.                  }
  831.              }
  832.              foreach ( $mybans as $i => $value ) {
  833.                  if ( false !== strpos( $mybans[$i], " " ) ) $mybans[$i] = preg_replace( "/[\s\r\n]/i", "", $mybans[$i] );
  834.                  if ( ( false === ( bool )preg_match( "`[\r\n]`", $mybans[$i] ) ) ) $mybans[$i] = $mybans[$i] . "\n";
  835.              }
  836.              if ( false !== ( bool )$bannedAlready ) {
  837.                  if ( ini_get( 'allow_url_fopen' ) == 1 ) @ini_set( 'allow_url_fopen', '0' );
  838.                  if ( ini_get( 'allow_url_include' ) == 1 ) @ini_set( 'allow_url_include', '0' );
  839.                  $myfile = fopen( $this->_ipTrappedURL, "w" );
  840.                  fwrite( $myfile, implode( $mybans, "" ) );
  841.                  fclose( $myfile );
  842.              }
  843.              if ( false === ( bool )$bannedAlready ) {
  844.                  if ( ( false !== strpos( $mybans[$i], $endIPTrapIP ) ) ) unset( $mybans[$i] );
  845.                  if ( in_array( $limitend, $mybans ) ) {
  846.                      $i = count( $mybans ) - 1;
  847.                      while ( $mybans[$i] != $limitend ) {
  848.                          $lastline = array_pop( $mybans ) . $lastline;
  849.                          $i--;
  850.                      }
  851.                      array_push( $mybans, $newline, $endIPTrapIP );
  852.                  } else {
  853.                      array_push( $mybans, "\n", $newline, $endIPTrapIP );
  854.                  }
  855.              } else {
  856.                  if ( false === ( bool )$bannedAlready ) {
  857.                      $mybans = array( "\n", $newline, $endIPTrapIP );
  858.                  }
  859.              }
  860.              if ( false === ( bool )$bannedAlready ) {
  861.                  $mybans = array_filter( $mybans, array( "osC_Sec", "my_array_filter_fn" ) );
  862.                  $mybans = array_values( $mybans );
  863.                  $i = 0;
  864.                  foreach ( $mybans as $i => $value ) {
  865.                      if ( false !== strpos( $mybans[$i], " " ) ) $mybans[$i] = str_replace( " ", "", $mybans[$i] );
  866.                      if ( ( false === ( bool )preg_match( "`[\r\n]`", $mybans[$i] ) ) ) $mybans[$i] = $mybans[$i] . "\n";
  867.                  }
  868.                  if ( ini_get( 'allow_url_fopen' ) == 1 ) @ini_set( 'allow_url_fopen', '0' );
  869.                  if ( ini_get( 'allow_url_include' ) == 1 ) @ini_set( 'allow_url_include', '0' );
  870.                  $myfile = fopen( $this->_ipTrappedURL, "w" );
  871.                  fwrite( $myfile, implode( $mybans, "" ) );
  872.                  fclose( $myfile );
  873.              }
  874.          }
  875.     }
  876.     /**
  877.      * hCoreFileChk()
  878.      *
  879.      * @param mixed $filename
  880.      * @return
  881.      */
  882.     function hCoreFileChk( $filename ) {
  883.          if ( ( file_exists( $filename ) )
  884.              && ( is_readable( $filename ) )
  885.              && ( is_writable( $filename ) ) ) {
  886.              return true;
  887.          }
  888.          return false;
  889.     }
  890.     /**
  891.      * checkfilename()
  892.      *
  893.      * @param mixed $fname
  894.      * @return
  895.      */
  896.     function checkfilename( $fname ) {
  897.          if ( ( !empty( $fname ) )
  898.              && ( substr_count( $fname, ".php" ) == 1 )
  899.              && ( ".php" == substr( $fname, -4 ) ) ) {
  900.              if ( ( ( strlen( $fname ) ) - ( strpos( $fname, "." ) ) ) <> 4 ) {
  901.                  return false;
  902.              } elseif ( ( false !== file_exists( $fname )
  903.                        && false !== is_readable( $fname ) )
  904.                        || ( false !== strpos( $_SERVER[ "SCRIPT_NAME" ], "ext/modules/" ) ) ) return true;
  905.          } else return false;
  906.          return false;
  907.     }
  908.     /**
  909.      * phpSelfFix()
  910.      *
  911.      * @return
  912.      */
  913.     function phpSelfFix() {
  914.          if ( false !== ( bool )ini_get( "register_globals" )
  915.              || ( !isset( $HTTP_SERVER_VARS ) ) ) $HTTP_SERVER_VARS = $_SERVER;
  916.          $filename = NULL;
  917.          # this is the RC3 standard code
  918.         $filename = ( ( ( strlen( ini_get( "cgi.fix_pathinfo" ) ) > 0 )
  919.                       && ( ( bool )ini_get( "cgi.fix_pathinfo" ) == false ) )
  920.                       || !isset( $HTTP_SERVER_VARS[ "SCRIPT_NAME" ] ) ) ?
  921.                       basename( $HTTP_SERVER_VARS[ "PHP_SELF" ] ) :
  922.                       basename( $HTTP_SERVER_VARS[ "SCRIPT_NAME" ] );
  923.                      if ( false === $this->checkfilename( $filename ) ) {
  924.                          $filename = NULL;
  925.                      } else return $filename;
  926.  
  927.          # if RC3 fails then try a version of FWR Media's $PHP_SELF code.
  928.         if ( empty( $filename ) && ( false !== strpos( $_SERVER[ "SCRIPT_NAME" ], ".php" ) ) ) {
  929.              preg_match( "@[a-z0-9_]+\.php@i", $_SERVER[ "SCRIPT_NAME" ], $matches );
  930.              if ( is_array( $matches ) && ( array_key_exists( 0, $matches ) )
  931.                  && ( substr( $matches[0], -4, 4 ) == ".php" )
  932.                  && ( is_readable( $matches[0] )
  933.                  || ( false !== strpos( $_SERVER[ "SCRIPT_NAME" ], "ext/modules/" ) ) ) ) {
  934.                  $filename = $matches[0];
  935.              }
  936.              if ( false === $this->checkfilename( $filename ) ) {
  937.                  $filename = NULL;
  938.              } else return $filename;
  939.          }
  940.    
  941.          # if that fails then try osC_Sec $PHP_SELF code
  942.         if ( empty( $filename ) && false !== $this->issetStrlen( $_SERVER[ "SCRIPT_FILENAME" ] ) ) {
  943.              $tmp = explode( "/", $_SERVER[ "SCRIPT_FILENAME" ] );
  944.              if ( is_array( $tmp ) ) {
  945.                  $filename = $tmp[count( $tmp ) - 1];
  946.              }
  947.              if ( false !== $this->checkfilename( $filename ) ) {
  948.                  return $filename;
  949.              }
  950.          } elseif ( ( $_SERVER[ "PHP_SELF" ] == "/" ) || ( $_SERVER[ "SCRIPT_NAME" ] == "/" ) ) {
  951.           return "index.php";
  952.          } else die(); // prevent the page from executing
  953.     }
  954.     /**
  955.      * array_flatten()
  956.      *
  957.      * @param mixed $array
  958.      * @param bool $preserve_keys
  959.      * @return
  960.      */
  961.     function array_flatten( $array, $preserve_keys = false ) {
  962.          if ( false === $preserve_keys ) {
  963.              $array = array_values( $array );
  964.          }
  965.          $flattened_array = array();
  966.          foreach ( $array as $k => $v ) {
  967.              if ( is_array( $v ) ) {
  968.                  $flattened_array = array_merge( $flattened_array, $this->array_flatten( $v, $preserve_keys ) );
  969.              } elseif ( $preserve_keys ) {
  970.                  $flattened_array[ $k ] = $v;
  971.              } else {
  972.                  $flattened_array[] = $v;
  973.              }
  974.          }
  975.          return $flattened_array;
  976.     }
  977.  
  978.     /**
  979.      * byPass()
  980.      *
  981.      * @return
  982.      */
  983.     function byPass() {
  984.        
  985.          $filename_bypass = array();
  986.          $dir_bypass = array();
  987.          $exfrmBanlist = array();
  988.    
  989.          # list of files to bypass. I have added a few for consideration. Try to keep this list short
  990.         $filename_bypass = array( "sitemonitor", "protx_process.php", "dps_pxpay_result_handler.php",
  991.                                    "ipn.php", "express_payflow.php", "quickpay.php", "xml.php",
  992.                                    "xml2.php" );
  993.          
  994.          # bypass all files in a directory. Use this sparingly
  995.         $dir_bypass = array( "/ext/modules/payment" );
  996.    
  997.          # list of IP exceptions. Add bypass ips and uncomment for use
  998.         # $exfrmBanlist = array( '', '', '' );
  999.        
  1000.          $realip = $this->getRealIP();
  1001.          if ( false === empty( $exfrmBanlist ) ) {
  1002.            foreach ( $exfrmBanlist as $exCeptions ) {
  1003.                if ( false !== ( strlen( $realip ) == strlen( $exCeptions ) )
  1004.                    && ( false !== strpos( $realip, $exCeptions ) ) ) {
  1005.                    return false;
  1006.                }
  1007.            }
  1008.          }
  1009.          if ( false === empty( $filename_bypass ) ) {
  1010.            global $PHP_SELF;
  1011.            foreach ( $filename_bypass as $filename ) {
  1012.                if ( false !== strpos( $PHP_SELF, $filename ) ) {
  1013.                    return false;
  1014.                }
  1015.            }
  1016.          }
  1017.          if ( false === empty( $dir_bypass ) ) {
  1018.            foreach ( $dir_bypass as $dirname ) {
  1019.                if ( false !== strpos( $_SERVER[ "SCRIPT_NAME" ], $dirname ) ) {
  1020.                    return false;
  1021.                }
  1022.            }
  1023.          }
  1024.          return true;
  1025.     }
  1026.     /**
  1027.      * checkReqType()
  1028.      *
  1029.      * @return
  1030.      */
  1031.     function checkReqType() {
  1032.          if ( false === $this->byPass() || ( false === $this->_nonGETPOSTReqs ) ) return;
  1033.          $reqType = $_SERVER[ "REQUEST_METHOD" ];
  1034.          $req_whitelist = array( "GET", "OPTIONS", "HEAD", "POST" );
  1035.          # first check for numbers in REQUEST_METHOD
  1036.         if ( false !== ( bool )preg_match( "/[0-9]+/", $reqType ) ) {
  1037.              $r = $this->rprefix . "a request method [ " . $_SERVER[ "REQUEST_METHOD" ] . " ] which should not contain numbers. ";
  1038.              $this->banChecker( $r, true );
  1039.          }
  1040.          # then make sure its all UPPERCASE (for servers that do not filter the case of the request method)
  1041.         if ( false === ctype_upper( $reqType ) ) {
  1042.              $r = $this->rprefix . "a request method [ " . $_SERVER[ "REQUEST_METHOD" ] . " ] should be in all uppercase letters. ";
  1043.              $this->banChecker( $r, true );
  1044.              # lastly check against the whitelist
  1045.         } elseif ( false === in_array( $reqType, $req_whitelist ) ) {
  1046.              $r = $this->rprefix . "a request method [ " . $_SERVER[ "REQUEST_METHOD" ] . " ] that is neither GET, OPTIONS, HEAD or POST. ";
  1047.              $this->banChecker( $r, true );
  1048.          }
  1049.     }
  1050.     /**
  1051.      * chkSetup()
  1052.      *
  1053.      * @return
  1054.      */
  1055.     function chkSetup() {
  1056.          # Make sure $banipaddress and $useIPTRAP are not both activated at the same time
  1057.         if ( ( $this->_banipaddress ) && ( $this->_useIPTRAP ) ) die( "<p align=center><font face=verdana size=1>" .
  1058.                  "<strong>WARNING</strong>: Choose either \$banipaddress or \$useIPTRAP, not both thanks.</font></p>" );
  1059.          # if using IPTrap, Make sure $ipTrapBlocked is set
  1060.         if ( ( $this->_useIPTRAP ) && empty( $this->_ipTrapBlocked ) ) die( "<p align=center><font face=verdana size=1>" .
  1061.                  "<strong>WARNING</strong>: Check the \$ipTrapBlocked url to the IP Trap blocked.php file in the osc.php file for errors.<br />".
  1062.                  "\$ipTrapBlocked cannot be left empty if IP Trap is enabled. If not empty then check that the URL is correct." );
  1063.      return;
  1064.     }
  1065.     /**
  1066.      * getDir()
  1067.      *
  1068.      * @return
  1069.      */
  1070.     function getDir() {
  1071.          if ( defined( "DIR_FS_CATALOG" )
  1072.             && false === strpos( DIR_FS_CATALOG, "http://" ) ) {
  1073.             if ( "/" !== substr( DIR_FS_CATALOG, -1 ) ) return DIR_FS_CATALOG . "/";
  1074.                return DIR_FS_CATALOG;
  1075.          } elseif ( !defined( "DIR_FS_CATALOG" )
  1076.             || ( defined( "DIR_FS_CATALOG" )
  1077.                && false !== strpos( DIR_FS_CATALOG, "http://" ) ) ) {
  1078.                $rootDir = $_SERVER[ "SCRIPT_NAME" ];
  1079.                if ( false !== strpos( $rootDir, "/" ) ) {
  1080.                   if ( $rootDir[0] == "/" ) {
  1081.                      $rootDir = substr( $rootDir, 1 );
  1082.                      $pos = strpos( strtolower( $rootDir ), strtolower( "/" ) );
  1083.                      $pos += strlen( "." ) - 1;
  1084.                      $rootDir = substr( $rootDir, 0, $pos );
  1085.                      if ( "/" !== substr( $rootDir, -1 ) ) $rootDir = "/" . $rootDir . "/";
  1086.                   }
  1087.                }
  1088.                $dirFS = $_SERVER[ "DOCUMENT_ROOT" ] . $rootDir;
  1089.                while ( ( false !== strpos( $dirFS, "//" ) ) ) {
  1090.                    $dirFS = str_replace( "//", "/", $dirFS );
  1091.                }
  1092.          return $dirFS;
  1093.          }
  1094.     }
  1095.     /**
  1096.      * check_ip()
  1097.      *
  1098.      * @param mixed $ip
  1099.      * @return
  1100.      */
  1101.     function check_ip( $ip ) {
  1102.          # simple ip format check
  1103.         if ( function_exists( 'filter_var' )
  1104.              && defined( 'FILTER_VALIDATE_IP' )
  1105.              && defined( 'FILTER_FLAG_IPV4' )
  1106.              && defined( 'FILTER_FLAG_IPV6' ) ) {
  1107.              if ( filter_var( $ip, FILTER_VALIDATE_IP,
  1108.                                    FILTER_FLAG_IPV4 ||
  1109.                                    FILTER_FLAG_IPV6 ) === false ) {
  1110.                      return $this->senda403Header();
  1111.              } else return true;
  1112.          }
  1113.          if ( preg_match( '/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/', $ip ) ) {
  1114.            $parts = explode( '.', $ip );
  1115.            foreach ( $parts as $ip_parts ) {
  1116.              if ( !is_numeric( $ip_parts ) || ( ( int )( $ip_parts ) > 255 ) || ( ( int )( $ip_parts ) < 0 ) ) {
  1117.                  return $this->senda403Header();
  1118.              }
  1119.            }
  1120.          return true;
  1121.          } else return false;
  1122.     }
  1123.    
  1124.     /**
  1125.      * getRealIP()
  1126.      *
  1127.      * @return
  1128.      */
  1129.     function getRealIP() {
  1130.          global $_SERVER;
  1131.          $ip_addresses = array();
  1132.          if ( isset( $_SERVER ) ) {
  1133.          // check for IPs passing through proxies
  1134.             if ( !empty( $_SERVER[ 'HTTP_X_FORWARDED_FOR' ] ) ) {
  1135.              // check if multiple ips exist in var
  1136.               $iplist = explode( ',', $_SERVER[ 'HTTP_X_FORWARDED_FOR' ] );
  1137.               foreach ( $iplist as $ip ) {
  1138.                  $HTTP_X_FORWARDED_FOR = $this->url_decoder( $ip );
  1139.               }
  1140.               $this->check_ip( $HTTP_X_FORWARDED_FOR );
  1141.             }
  1142.          }
  1143.          if ( ( !empty( $_SERVER[ 'HTTP_CLIENT_IP' ] )
  1144.                && false !== $this->check_ip( $_SERVER[ 'HTTP_CLIENT_IP' ] ) )
  1145.            || ( isset( $HTTP_X_FORWARDED_FOR  ) && ( !empty( $HTTP_X_FORWARDED_FOR ) ) )
  1146.            || ( !empty( $_SERVER[ 'HTTP_X_FORWARDED' ] )
  1147.                && false !== $this->check_ip( $_SERVER[ 'HTTP_X_FORWARDED' ] ) )
  1148.            || ( !empty( $_SERVER[ 'HTTP_PROXY_USER' ] )
  1149.                && false !== $this->check_ip( $_SERVER[ 'HTTP_PROXY_USER' ] ) )
  1150.            || ( !empty( $_SERVER[ 'HTTP_X_CLUSTER_CLIENT_IP' ] )
  1151.                && false !== $this->check_ip( $_SERVER[ 'HTTP_X_CLUSTER_CLIENT_IP' ] ) )
  1152.            || ( !empty( $_SERVER[ 'HTTP_FORWARDED' ] )
  1153.                && false !== $this->check_ip( $_SERVER[ 'HTTP_FORWARDED' ] ) )
  1154.            || ( !empty( $_SERVER[ 'HTTP_CF_CONNECTING_IP' ] )
  1155.                && false !== $this->check_ip( $_SERVER[ 'HTTP_CF_CONNECTING_IP' ] ) )
  1156.            || ( !empty( $_SERVER[ 'HTTP_FORWARDED_FOR' ] )
  1157.                && false !== $this->check_ip( $_SERVER[ 'HTTP_FORWARDED_FOR' ] ) ) ) {
  1158.                   # just disable the ban IP function so as not to
  1159.                  # accidentally ban an upstream proxy server
  1160.                  # however osC_Sec can still block any
  1161.                  # malicious requests irregardless
  1162.                  $this->_banipaddress = 0;
  1163.                   $this->_useIPTRAP = 0;
  1164.          }
  1165.          return ( false !== $this->check_ip( $_SERVER[ "REMOTE_ADDR" ] ) ) ? $_SERVER[ "REMOTE_ADDR" ] : $this->senda403Header();
  1166.     }
  1167.     function fINT( $integ ) {
  1168.       # check input is an integer and no lower than 0 in value
  1169.       if ( function_exists( 'filter_var' ) && defined( 'FILTER_SANITIZE_NUMBER_INT' ) ) {
  1170.               $integ_filtered = ( int )filter_var( $integ, FILTER_SANITIZE_NUMBER_INT );
  1171.               if ( isset( $integ )
  1172.                   && $integ_filtered
  1173.                   && is_int( $integ_filtered )
  1174.                   && 0 <= $integ_filtered ) {
  1175.                 return $integ_filtered;
  1176.               } else return 0;
  1177.        } elseif ( isset( $integ )
  1178.                   && is_int( $integ )
  1179.                   && 0 <= ( int )$integ ) {
  1180.                 return ( int )$integ;
  1181.        } else return 0;
  1182.     }
  1183.     function fURL( $url ) {
  1184.          if ( function_exists( 'filter_var' ) && defined( 'FILTER_SANITIZE_URL' ) ) {
  1185.                 $url_filtered = filter_var( $url, FILTER_SANITIZE_URL );
  1186.                 return true;
  1187.          }
  1188.          if ( !isset( $url_filtered ) ) {
  1189.            if ( preg_match( "#^http(s)?://[a-z0-9-_.]+\.[a-z]{2,4}#i", $url ) ) {
  1190.                return true;
  1191.            } else return false;
  1192.          }
  1193.          return false;
  1194.     }
  1195.     /**
  1196.      * strCharsfrmStr()
  1197.      *
  1198.      * @param mixed $string
  1199.      * @param mixed $strip
  1200.      * @param mixed $replace
  1201.      * @return
  1202.      */
  1203.     function strCharsfrmStr( $string, $strip, $replace ) {
  1204.          $x = ( false !== strpos( $string, $strip ) ) ? true : false;
  1205.          while ( false !== $x ) {
  1206.              $string = str_replace( $strip, $replace, $string );
  1207.              $x = ( false !== strpos( $string, $strip ) ) ? true : false;
  1208.          }
  1209.          return $string;
  1210.     }
  1211.     /**
  1212.      * Bad Spider Block
  1213.      */
  1214.     function badArachnid() {
  1215.          if ( false === $this->byPass() ) return;
  1216.          if ( false !== $this->issetStrlen( $_SERVER[ "HTTP_USER_AGENT" ] ) ) {
  1217.            $badagentlist = array( "Baidu", "WebLeacher", "autoemailspider", "MSProxy", "Yeti", "Twiceler", "blackhat", "Mail.Ru", "fuck" );
  1218.            $lcUserAgent = strtolower( $_SERVER[ "HTTP_USER_AGENT" ] );
  1219.            foreach ( $badagentlist as $badagent ) {
  1220.                $badagent = strtolower( $badagent );
  1221.                if ( false !== strpos( $lcUserAgent, $badagent ) ) {
  1222.                    $header = array( "HTTP/1.1 404 Not Found", "HTTP/1.1 404 Not Found", "Content-Length: 0" );
  1223.                    foreach ( $header as $sent ) {
  1224.                        header( $sent );
  1225.                    }
  1226.                    die();
  1227.                }
  1228.            }
  1229.          } else return;
  1230.      return;
  1231.     }
  1232.     function get_version() {
  1233.          if ( false !== file_exists( $this->getDir() . 'includes/version.php' )
  1234.             && false !== is_readable( $this->getDir() . 'includes/version.php' ) ) {
  1235.             return trim( implode( '', file( $this->getDir() . 'includes/version.php' ) ) );
  1236.          }
  1237.       return false;
  1238.     }
  1239.     function setOpenBaseDir() {
  1240.          if ( false !== $this->get_version()
  1241.             && $this->get_version() == "2.3.1" ) {
  1242.             if ( strlen( ini_get( 'open_basedir' ) == 0 ) ) {
  1243.                 return @ini_set( 'open_basedir', $this->getDir() );
  1244.             }
  1245.          } else return;
  1246.     }
  1247.    /**
  1248.     * x_powered_by()
  1249.     */
  1250.     function x_powered_by() {
  1251.          $errlevel = ini_get( 'error_reporting' );
  1252.          error_reporting( 0 );
  1253.          if ( false !== ( bool )ini_get( 'expose_php' ) ) {
  1254.             header( "X-Powered-By: osC_Sec" );
  1255.          }
  1256.          error_reporting( $errlevel );
  1257.          return;
  1258.     }
  1259.    /**
  1260.     * url_decoder()
  1261.     */
  1262.     function url_decoder( $var ) {
  1263.          return rawurldecode( urldecode( $var ) );
  1264.     }
  1265.     function getREQUEST_URI() {
  1266.          if ( false !== getenv( 'REQUEST_URI' ) ) {
  1267.             return getenv( 'REQUEST_URI' );
  1268.          } else {
  1269.             return $_SERVER[ "REQUEST_URI" ];
  1270.          }
  1271.     }
  1272.     function issetStrlen( $str ) {
  1273.         if ( isset( $str ) && ( strlen( $str ) > 0 ) ) {
  1274.            return true;
  1275.         } else {
  1276.            return false;
  1277.         }
  1278.     }
  1279.   } // end of class
  1280.  
  1281.   /**
  1282.    * osCSec_selfchk()
  1283.    *
  1284.    * @return
  1285.    */
  1286.   function osCSec_selfchk() {
  1287.       $oscsecfilepath = str_replace( DIRECTORY_SEPARATOR, urldecode( "%2F" ), __file__ );
  1288.       $oscsecfilepath = explode( "/", $oscsecfilepath );
  1289.       if ( is_array( $oscsecfilepath ) ) {
  1290.           $fileself = $oscsecfilepath[count( $oscsecfilepath ) - 1];
  1291.           if ( $fileself[0] == "/" ) {
  1292.               return $fileself;
  1293.           } else {
  1294.               return "/" . $fileself;
  1295.           }
  1296.       }
  1297.   }
  1298.   /**
  1299.    * senda404Header()
  1300.    *
  1301.    * @return
  1302.    */
  1303.   function senda404Header() {
  1304.          $header = array( "HTTP/1.1 404 Not Found", "HTTP/1.1 404 Not Found", "Content-Length: 0" );
  1305.          foreach ( $header as $sent ) {
  1306.              header( $sent );
  1307.          }
  1308.          die();
  1309.   }
  1310.  /**
  1311.   * fix_server_vars()
  1312.   *
  1313.   * @return
  1314.   */
  1315.   function fix_server_vars() {
  1316.          $_request_uri = "";
  1317.          if ( empty( $_SERVER[ "REQUEST_URI" ] )
  1318.              || ( php_sapi_name() != "cgi-fcgi"
  1319.                  && false !== ( bool )preg_match( "/^Microsoft-IIS\//", $_SERVER[ "SERVER_SOFTWARE" ] ) ) ) {
  1320.             if ( false !== getenv( 'REQUEST_URI' ) ) {
  1321.                $_request_uri = getenv( 'REQUEST_URI' );
  1322.             } elseif ( isset( $_SERVER[ "HTTP_X_ORIGINAL_URL" ] ) ) {
  1323.                    $_request_uri = $_SERVER[ "HTTP_X_ORIGINAL_URL" ];
  1324.             } elseif ( isset( $_SERVER[ "HTTP_X_REWRITE_URL" ] ) ) {
  1325.                        $_request_uri = $_SERVER[ "HTTP_X_REWRITE_URL" ];
  1326.             } else {
  1327.                if ( !isset( $_SERVER[ "PATH_INFO" ] )
  1328.                    && isset( $_SERVER[ "ORIG_PATH_INFO" ] ) ) $_SERVER[ "PATH_INFO" ] = $_SERVER[ "ORIG_PATH_INFO" ];
  1329.                if ( isset( $_SERVER[ "PATH_INFO" ] ) ) {
  1330.                    if ( $_SERVER[ "PATH_INFO" ] == $_SERVER[ "SCRIPT_NAME" ] ) {
  1331.                        $_request_uri = $_SERVER[ "PATH_INFO" ];
  1332.                    } else {
  1333.                        $_request_uri = $_SERVER[ "SCRIPT_NAME" ] . $_SERVER[ "PATH_INFO" ];
  1334.                    }
  1335.                }
  1336.             }
  1337.             if ( !empty( $_SERVER[ "QUERY_STRING" ] ) ) {
  1338.                 $_request_uri .= "?" . $_SERVER[ "QUERY_STRING" ];
  1339.             }
  1340.             $_SERVER[ "REQUEST_URI" ] = $_request_uri;
  1341.          }
  1342.          # fix php.cgi in script_filename
  1343.         if ( isset( $_SERVER[ "SCRIPT_FILENAME" ] )
  1344.              && isset( $_SERVER[ "PATH_TRANSLATED" ] )
  1345.              && ( strpos( $_SERVER[ "SCRIPT_FILENAME" ], "php.cgi" ) == strlen( $_SERVER[ "SCRIPT_FILENAME" ] ) - 7 ) ) {
  1346.              $_SERVER[ "SCRIPT_FILENAME" ] = $_SERVER[ "PATH_TRANSLATED" ];
  1347.          }
  1348.   }
  1349. ?>
clone this paste RAW Paste Data