Beispiel #1
0
 /**
  * Logs user information to webserver logs.
  *
  * @param string $user   user name
  * @param string $status status message
  *
  * @return void
  */
 public static function logUser($user, $status = 'ok')
 {
     if (function_exists('apache_note')) {
         apache_note('userID', $user);
         apache_note('userStatus', $status);
     }
     if (function_exists('syslog') && $status != 'ok') {
         @openlog('phpMyAdmin', LOG_NDELAY | LOG_PID, LOG_AUTHPRIV);
         @syslog(LOG_WARNING, 'user denied: ' . $user . ' (' . $status . ') from ' . PMA_getIp());
     }
 }
 /**
  * Test for PMA_getIp
  *
  * @return void
  */
 public function testPMA_getIp()
 {
     //$_SERVER['REMOTE_ADDR'] is empty
     $this->assertEquals(false, PMA_getIp());
     $_SERVER['REMOTE_ADDR'] = "101.0.0.25";
     $this->assertEquals("101.0.0.25", PMA_getIp());
     //proxy
     $var_name = "direct_ip";
     $direct_ip = $_SERVER['REMOTE_ADDR'];
     $GLOBALS['cfg']['TrustedProxies'][$direct_ip] = $var_name;
     $_SERVER[$var_name] = "192.168.0.1";
     $this->assertEquals("192.168.0.1", PMA_getIp());
     unset($_SERVER[$var_name]);
     unset($GLOBALS['cfg']['TrustedProxies'][$direct_ip]);
 }
 /**
  * Test for PMA_getIp
  *
  * @return void
  *
  * @dataProvider proxyIPs
  */
 public function testGetIp($remote, $header, $expected, $proxyip = null)
 {
     unset($_SERVER['REMOTE_ADDR']);
     unset($_SERVER['TEST_FORWARDED_HEADER']);
     $GLOBALS['cfg']['TrustedProxies'] = array();
     if (!is_null($remote)) {
         $_SERVER['REMOTE_ADDR'] = $remote;
     }
     if (!is_null($header)) {
         if (is_null($proxyip)) {
             $proxyip = $remote;
         }
         $GLOBALS['cfg']['TrustedProxies'][$proxyip] = 'TEST_FORWARDED_HEADER';
         $_SERVER['TEST_FORWARDED_HEADER'] = $header;
     }
     $this->assertEquals($expected, PMA_getIp());
     unset($_SERVER['REMOTE_ADDR']);
     unset($_SERVER['TEST_FORWARDED_HEADER']);
     $GLOBALS['cfg']['TrustedProxies'] = array();
 }
/**
 * Runs through IP Allow/Deny rules the use of it below for more information
 *
 * @param string $type 'allow' | 'deny' type of rule to match
 *
 * @return bool   Matched a rule ?
 *
 * @access  public
 *
 * @see     PMA_getIp()
 */
function PMA_allowDeny($type)
{
    global $cfg;
    // Grabs true IP of the user and returns if it can't be found
    $remote_ip = PMA_getIp();
    if (empty($remote_ip)) {
        return false;
    }
    // copy username
    $username = $cfg['Server']['user'];
    // copy rule database
    $rules = $cfg['Server']['AllowDeny']['rules'];
    // lookup table for some name shortcuts
    $shortcuts = array('all' => '0.0.0.0/0', 'localhost' => '127.0.0.1/8');
    // Provide some useful shortcuts if server gives us address:
    if (PMA_getenv('SERVER_ADDR')) {
        $shortcuts['localnetA'] = PMA_getenv('SERVER_ADDR') . '/8';
        $shortcuts['localnetB'] = PMA_getenv('SERVER_ADDR') . '/16';
        $shortcuts['localnetC'] = PMA_getenv('SERVER_ADDR') . '/24';
    }
    foreach ($rules as $rule) {
        // extract rule data
        $rule_data = explode(' ', $rule);
        // check for rule type
        if ($rule_data[0] != $type) {
            continue;
        }
        // check for username
        if ($rule_data[1] != '%' && $rule_data[1] != $username) {
            continue;
        }
        // check if the config file has the full string with an extra
        // 'from' in it and if it does, just discard it
        if ($rule_data[2] == 'from') {
            $rule_data[2] = $rule_data[3];
        }
        // Handle shortcuts with above array
        if (isset($shortcuts[$rule_data[2]])) {
            $rule_data[2] = $shortcuts[$rule_data[2]];
        }
        // Add code for host lookups here
        // Excluded for the moment
        // Do the actual matching now
        if (PMA_ipMaskTest($rule_data[2], $remote_ip)) {
            return true;
        }
    }
    // end while
    return false;
}
/**
 * Runs through IP Allow/Deny rules the use of it below for more information
 *
 * @param   string 'allow' | 'deny' type of rule to match
 *
 * @return  bool   Matched a rule ?
 *
 * @access  public
 *
 * @see     PMA_getIp()
 */
function PMA_allowDeny($type)
{
    global $cfg;
    // Grabs true IP of the user and returns if it can't be found
    $remote_ip = PMA_getIp();
    if (empty($remote_ip)) {
        return FALSE;
    }
    // copy username
    $username = $cfg['Server']['user'];
    // copy rule database
    $rules = $cfg['Server']['AllowDeny']['rules'];
    // lookup table for some name shortcuts
    $shortcuts = array('all' => '0.0.0.0/0', 'localhost' => '127.0.0.1/8');
    foreach ($rules as $rule) {
        // extract rule data
        $rule_data = explode(' ', $rule);
        // check for rule type
        if ($rule_data[0] != $type) {
            continue;
        }
        // check for username
        if ($rule_data[1] != '%' && $rule_data[1] != $username) {
            continue;
        }
        // check if the config file has the full string with an extra
        // 'from' in it and if it does, just discard it
        if ($rule_data[2] == 'from') {
            $rule_data[2] = $rule_data[3];
        }
        // Handle shortcuts with above array
        // DON'T use "array_key_exists" as it's only PHP 4.1 and newer.
        if (isset($shortcuts[$rule_data[2]])) {
            $rule_data[2] = $shortcuts[$rule_data[2]];
        }
        // Add code for host lookups here
        // Excluded for the moment
        // Do the actual matching now
        if (PMA_ipMaskTest($rule_data[2], $remote_ip)) {
            return TRUE;
        }
    }
    // end while
    return FALSE;
}
 /**
  * Gets advanced authentication settings
  *
  * this function DOES NOT check authentication - it just checks/provides
  * authentication credentials required to connect to the MySQL server
  * usually with $GLOBALS['dbi']->connect()
  *
  * it returns false if something is missing - which usually leads to
  * auth() which displays login form
  *
  * it returns true if all seems ok which usually leads to auth_set_user()
  *
  * it directly switches to authFails() if user inactivity timeout is reached
  *
  * @return boolean   whether we get authentication settings or not
  */
 public function authCheck()
 {
     global $conn_error;
     // Initialization
     /**
      * @global $GLOBALS['pma_auth_server'] the user provided server to
      * connect to
      */
     $GLOBALS['pma_auth_server'] = '';
     $GLOBALS['PHP_AUTH_USER'] = $GLOBALS['PHP_AUTH_PW'] = '';
     $GLOBALS['from_cookie'] = false;
     if (!empty($_REQUEST['pma_username'])) {
         // Verify Captcha if it is required.
         if (!empty($GLOBALS['cfg']['CaptchaLoginPrivateKey']) && !empty($GLOBALS['cfg']['CaptchaLoginPublicKey'])) {
             if (!empty($_POST["g-recaptcha-response"])) {
                 if (function_exists('curl_init')) {
                     $reCaptcha = new ReCaptcha\ReCaptcha($GLOBALS['cfg']['CaptchaLoginPrivateKey'], new ReCaptcha\RequestMethod\CurlPost());
                 } else {
                     if (ini_get('allow_url_fopen')) {
                         $reCaptcha = new ReCaptcha\ReCaptcha($GLOBALS['cfg']['CaptchaLoginPrivateKey'], new ReCaptcha\RequestMethod\Post());
                     } else {
                         $reCaptcha = new ReCaptcha\ReCaptcha($GLOBALS['cfg']['CaptchaLoginPrivateKey'], new ReCaptcha\RequestMethod\SocketPost());
                     }
                 }
                 // verify captcha status.
                 $resp = $reCaptcha->verify($_POST["g-recaptcha-response"], PMA_getIp());
                 // Check if the captcha entered is valid, if not stop the login.
                 if ($resp == null || !$resp->isSuccess()) {
                     $conn_error = __('Entered captcha is wrong, try again!');
                     return false;
                 }
             } else {
                 $conn_error = __('Please enter correct captcha!');
                 return false;
             }
         }
         // The user just logged in
         $GLOBALS['PHP_AUTH_USER'] = PMA_sanitizeMySQLUser($_REQUEST['pma_username']);
         $GLOBALS['PHP_AUTH_PW'] = $_REQUEST['pma_password'];
         if ($GLOBALS['cfg']['AllowArbitraryServer'] && isset($_REQUEST['pma_servername'])) {
             if ($GLOBALS['cfg']['ArbitraryServerRegexp']) {
                 $parts = explode(' ', $_REQUEST['pma_servername']);
                 if (count($parts) == 2) {
                     $tmp_host = $parts[0];
                 } else {
                     $tmp_host = $_REQUEST['pma_servername'];
                 }
                 $match = preg_match($GLOBALS['cfg']['ArbitraryServerRegexp'], $tmp_host);
                 if (!$match) {
                     $conn_error = __('You are not allowed to log in to this MySQL server!');
                     return false;
                 }
             }
             $GLOBALS['pma_auth_server'] = PMA_sanitizeMySQLHost($_REQUEST['pma_servername']);
         }
         PMA_secureSession();
         return true;
     }
     // At the end, try to set the $GLOBALS['PHP_AUTH_USER']
     // and $GLOBALS['PHP_AUTH_PW'] variables from cookies
     // check cookies
     if (empty($_COOKIE['pmaUser-' . $GLOBALS['server']])) {
         return false;
     }
     $GLOBALS['PHP_AUTH_USER'] = $this->cookieDecrypt($_COOKIE['pmaUser-' . $GLOBALS['server']], $this->_getEncryptionSecret());
     // user was never logged in since session start
     if (empty($_SESSION['last_access_time'])) {
         return false;
     }
     // User inactive too long
     $last_access_time = time() - $GLOBALS['cfg']['LoginCookieValidity'];
     if ($_SESSION['last_access_time'] < $last_access_time) {
         Util::cacheUnset('is_create_db_priv');
         Util::cacheUnset('is_reload_priv');
         Util::cacheUnset('db_to_create');
         Util::cacheUnset('dbs_where_create_table_allowed');
         Util::cacheUnset('dbs_to_test');
         Util::cacheUnset('db_priv');
         Util::cacheUnset('col_priv');
         Util::cacheUnset('table_priv');
         Util::cacheUnset('proc_priv');
         $GLOBALS['no_activity'] = true;
         $this->authFails();
         if (!defined('TESTSUITE')) {
             exit;
         } else {
             return false;
         }
     }
     // check password cookie
     if (empty($_COOKIE['pmaAuth-' . $GLOBALS['server']])) {
         return false;
     }
     $auth_data = json_decode($this->cookieDecrypt($_COOKIE['pmaAuth-' . $GLOBALS['server']], $this->_getSessionEncryptionSecret()), true);
     if (!is_array($auth_data) || !isset($auth_data['password'])) {
         return false;
     }
     $GLOBALS['PHP_AUTH_PW'] = $auth_data['password'];
     if ($GLOBALS['cfg']['AllowArbitraryServer'] && !empty($auth_data['server'])) {
         $GLOBALS['pma_auth_server'] = $auth_data['server'];
     }
     $GLOBALS['from_cookie'] = true;
     return true;
 }