function connect($isWrite = false) { $this->modality = $this->isWrite ? self::MODALITY_WRITE : ($isWrite ? self::MODALITY_WRITE : self::MODALITY_READ); $connection_key = 'pdo_mysql_' . $this->dbname . '_' . $this->modality . '_'; if (isset(self::$connections[$connection_key])) { return self::$connections[$connection_key]; } $server = Config::get('db', 'mysql'); $dbConfig = Config::get('db', 'database,' . $this->dbname); $dbModalityConfig = self::getModalityConfig($dbConfig); // 置空连接方式 $this->modality = null; $this->resetIsWrite(); $charset = isset($server['charset']) ? $server['charset'] : 'UTF8'; $dbname = isset($dbConfig['dbname']) ? $dbConfig['dbname'] : $this->dbname; $dsn = 'mysql:host=' . $dbModalityConfig['host'] . ';port=' . $dbModalityConfig['port'] . ';dbname=' . $dbname; $options = array(\PDO::ATTR_TIMEOUT => isset($server['timeout']) ? $server['timeout'] : 3, \PDO::ATTR_PERSISTENT => isset($server['persistent']) ? $server['persistent'] : false, \PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES " . $charset); try { self::$connections[$connection_key] = new \PDO($dsn, $dbModalityConfig['username'], $dbModalityConfig['password'], $options); foreach ($this->_attribute as $key => $val) { self::$connections[$connection_key]->setAttribute($key, $val); } } catch (\PDOException $e) { throw new \Exception($e->getMessage(), $e->getCode(), $e->getPrevious()); } return self::$connections[$connection_key]; }
/** * 设置 cookie * * @access public * @param mixed 名 可以是数组 * @param string 值 * @param string 过期时间 * @param string 域 一般设置为: .yourdomain.com * @param string 路径 * @param string 前缀 * @param bool 是否通过安全的 HTTPS 连接来传输 cookie * @return void */ public static function set($name = '', $value = '', $expire = 0, $domain = '', $path = '/', $prefix = '', $secure = FALSE) { if (is_array($name)) { foreach (array('value', 'expire', 'domain', 'path', 'prefix', 'secure', 'name') as $item) { if (isset($name[$item])) { ${$item} = $name[$item]; } } } if ($prefix == '' and Config::get('request', 'cookiePrefix', '') != '') { $prefix = Config::get('request', 'cookiePrefix'); } if ($domain == '' and Config::get('request', 'cookieDomain', '') != '') { $domain = Config::get('request', 'cookieDomain'); } if ($path == '/' and Config::get('request', 'cookiePath', '/') != '/') { $path = Config::get('request', 'cookiePath'); } if ($secure == FALSE and Config::get('request', 'cookieSecure', FALSE) != FALSE) { $secure = Config::get('request', 'cookieSecure'); } // 过期时间设置为非数字或数字字符串,删除 cookie if (!is_numeric($expire)) { $expire = time() - 86500; } else { // 小于等于 0 设置会话 cookie $expire = $expire > 0 ? time() + $expire : 0; } setcookie($prefix . $name, $value, $expire, $path, $domain, $secure); }
/** * 获取 IP Address * * @access public * @return string */ public static function ipAddress() { if (self::$requestInstance->ipAddress !== FALSE) { return self::$requestInstance->ipAddress; } $proxyIps = Config::get('request', 'proxyIps', ''); if (!empty($proxyIps)) { $proxyIps = explode(',', str_replace(' ', '', $proxyIps)); foreach (array('HTTP_X_FORWARDED_FOR', 'HTTP_CLIENT_IP', 'HTTP_X_CLIENT_IP', 'HTTP_X_CLUSTER_CLIENT_IP') as $header) { if (($spoof = self::server($header)) !== FALSE) { if (strpos($spoof, ',') !== FALSE) { $spoof = explode(',', $spoof, 2); $spoof = $spoof[0]; } if (!Validate::ip($spoof)) { $spoof = FALSE; } else { break; } } } self::$requestInstance->ipAddress = $spoof !== FALSE && in_array($_SERVER['REMOTE_ADDR'], $proxyIps, TRUE) ? $spoof : $_SERVER['REMOTE_ADDR']; } else { self::$requestInstance->ipAddress = $_SERVER['REMOTE_ADDR']; } if (!Validate::ip(self::$requestInstance->ipAddress)) { self::$requestInstance->ipAddress = '0.0.0.0'; } return self::$requestInstance->ipAddress; }
/** * 构造函数 * @access private * @return void */ private function __construct() { writeLog('debug', "Http/Request Class Initialized"); $this->allowGetArray = Config::get('request', 'allowGetArray', TRUE); $this->enableXss = Config::get('request', 'globalXssFiltering', FALSE); $this->enableCsrf = Config::get('request', 'csrfProtection', FALSE); // 全局数组处理 $this->sanitizeGlobals(); }
/** * 脚本别名加载 * @param dynamic mixed 配置文件中的别名 * @return string */ public static function js() { $configKey = func_get_arg(0); list($file, $key) = explode('.', $configKey); $args = func_get_args(); array_shift($args); $jsAliases = Config::get($file, $key); $scriptArray = array_map(function ($aliases) use($jsAliases) { if (isset($jsAliases[$aliases])) { return self::script($jsAliases[$aliases]); } }, $args); return implode('', array_filter($scriptArray)); }
function connect() { $environment = defined('ENVIRONMENT') ? ENVIRONMENT : 'development'; $connection_key = $this->dbname . $this->modality . $environment; if (!isset(self::$connections[$connection_key])) { $server = Config::get('db.' . $environment, 'mysql'); $dbConfig = Config::get('db.' . $environment, 'database,' . $this->dbname); $dbHostConfig = explode(':', $dbConfig[$this->modality]); $charset = isset($server['charset']) ? $server['charset'] : 'UTF8'; $dbname = isset($dbConfig['dbname']) ? $dbConfig['dbname'] : $this->dbname; $dsn = 'mysql:host=' . $dbHostConfig['0'] . ';port=' . $dbHostConfig['1'] . ';dbname=' . $dbname; $options = array(\PDO::ATTR_PERSISTENT => isset($server['persistent']) ? $server['persistent'] : true, \PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES " . $charset); try { self::$connections[$connection_key] = new \PDO($dsn, $dbConfig['username'], $dbConfig['password'], $options); foreach ($this->_attribute as $key => $val) { self::$connections[$connection_key]->setAttribute($key, $val); } } catch (\PDOException $e) { throw new \DebugException($e->getMessage(), $e->getCode(), $e->getPrevious()); } } return self::$connections[$connection_key]; }
/** * Set Cross Site Request Forgery Protection Cookie * 在 RequestBase 构造函数中调用,所以不能使用 Request 对象的方法 * @return void */ public static function csrfSetCookie() { writeLog('debug', "Secure::csrfSetCookie() Call."); $expire = time() + self::$csrfExpire; $secure_cookie = Config::get('request', 'cookieSecure', TRUE) === TRUE ? 1 : 0; if ($secure_cookie && (empty($_SERVER['HTTPS']) or strtolower($_SERVER['HTTPS']) === 'off')) { return FALSE; } setcookie(self::$csrfCookieName, self::$csrfHash, $expire, Config::get('request', 'cookiePath', '/'), Config::get('request', 'cookieDomain', ''), $secure_cookie); writeLog('debug', "CRSF cookie Set"); }