_module = $module; return $this; } public function setControllerName($controller) { $this->_controller = $controller; return $this; } /** * * @param string $action * @return Zeed_Controller_Request */ public function setActionName($action) { $this->_action = $action; return $this; } public function setParam($key, $value) { $key = (string) $key; if ((null === $value) && isset($this->_params[$key])) { unset($this->_params[$key]); } elseif (null !== $value) { $this->_params[$key] = $value; } return $this; } public function getParams() { return $this->_params; } public function setDispatched($flag = true) { $this->_dispatched = $flag ? true : false; return $this; } public function getModuleName() { return $this->_module; } public function getActionName() { return $this->_action; } public function getControllerName() { return $this->_controller; } public function getPathInfo() { return $this->baseUri(); } public function getModuleKey() { return $this->_moduleKey; } public function getControllerKey() { return $this->_controllerKey; } public function getActionKey() { return $this->_actionKey; } /** * 下面是从原 Zeed_Request_Http 中移植过来的 */ /** * 当前请求URL * * @var string */ private $_request_uri; /** * 当前请求URL不包含查询参数的部分 * * @var string */ private $_base_uri; /** * 当前请求URL的目录部分 * * @var string */ private $_base_dir; /** * 当前请求的PATHINFO信息 * * @var string */ private $_pathinfo; private static $_path_parsed_params; /** * 请求协议 * * @var string */ private $_protocol; /** * 当前请求的端口号 * * @var string */ private $_server_port; private $_rewrite_base; public static $token_name = 'ZRH.Tokename'; /** * 访问请求参数 * 查找请求参数的顺行是 Zeed_Request_Http对象附加参数、$_GET 和 $_POST。 * * @param string $parameter 要访问的请求参数 * @param mixed $default 参数不存在时要返回的默认值 * * @return mixed 参数值 */ public static function query($parameter, $default = null) { if (isset($_GET[$parameter])) return $_GET[$parameter]; elseif (isset($_POST[$parameter])) return $_POST[$parameter]; elseif (isset(self::$_path_parsed_params[$parameter])) { return self::$_path_parsed_params[$parameter]; } return $default; } /** * 获得GET数据 * 从 $_GET中获得指定参数,如果参数不存在则返回 $default指定的默认值。 * 如果 $parameter参数为 null,则返回整个$_GET的内容。 * * @param string $parameter 要查询的参数名 * @param mixed $default 参数不存在时要返回的默认值 * @return mixed 参数值 */ public static function get($parameter = null, $default = null) { if (is_null($parameter)) return $_GET; if (isset($_GET[$parameter])) { return $_GET[$parameter]; } elseif (isset(self::$_path_parsed_params[$parameter])) { return self::$_path_parsed_params[$parameter]; } return $default; } /** * 从多个可能的参数中获取参数值,按顺序检查。 $parameterMapping = arrat('cid', 'categoryid') * * @param array $parameterMapping 参数映射 * @return mixed */ public static function smartQuery($parameterMapping) { if (! is_array($parameterMapping)) { return null; } $return = null; foreach ($parameterMapping as $key) { if (! is_null($return = self::query($key, null))) { return $return; } } return null; } /** * 自动处理批量ID参数, 比如: * contentid=1, contentid[]=1&contentid[]=2, contentid=1,2 * * @param string $parameter 请求参数 * @param string $spliter 分割符 * @return array 统一返回数组 */ public static function smartIds($idParameter, $spliter = ',') { $id = self::query($idParameter); $return = array(); if (is_array($id)) { $return = $id; } elseif (is_numeric($id)) { $return[] = $id; } elseif (is_string($id) && strpos($id, $spliter)) { $return = explode($spliter, $id); } return $return; } /** * * @param array $params */ public static function setParsedParams($params) { self::$_path_parsed_params = $params; } /** * 获得POST数据 * 从 $_POST中获得指定参数,如果参数不存在则返回 $default指定的默认值。 * * 如果$parameter参数为 null,则返回整个$_POST的内容。 * * @param string $parameter 要查询的参数名 * @param mixed $default 参数不存在时要返回的默认值 * @return mixed 参数值 */ public static function post($parameter = null, $default = null) { if (is_null($parameter)) return $_POST; return isset($_POST[$parameter]) ? $_POST[$parameter] : $default; } /** * 获得Cookie数据 * 从 $_COOKIE中获得指定参数,如果参数不存在则返回 $default指定的默认值。 * * 如果$parameter参数为 null,则返回整个$_COOKIE的内容。 * * @param string $parameter 要查询的参数名 * @param mixed $default 参数不存在时要返回的默认值 * @return mixed 参数值 */ public static function cookie($parameter, $default = null) { if (is_null($parameter)) return $_COOKIE; return isset($_COOKIE[$parameter]) ? $_COOKIE[$parameter] : $default; } /** * 取得当前请求使用的协议 * 返回值不包含协议的版本。常见的返回值是 HTTP。 * * @return string 当前请求使用的协议 */ public function protocol() { if (is_null($this->_protocol)) { list($this->_protocol) = explode('/', $_SERVER['SERVER_PROTOCOL']); } return $this->_protocol; } /** * 设置 REQUEST_URI * 修改后 requestUri()将返回新值,同时还影响 baseUri()和 baseDir()的返回结果。 * * @param string $request_uri 新的 REQUEST_URI 值 * @return Zeed_Request_Http */ public function changeRequestUri($request_uri) { $this->_request_uri = $request_uri; $this->_base_uri = $this->_base_dir = $this->_pathinfo = null; return $this; } /** * 确定请求的完整 URL * * 几个示例: *
* $token = $this->input->token();
*
*
* This provides a basic, but effective, method of preventing CSRF attacks.
*
* @param boolean force a new token to be generated?
* @return string
* @uses Session::instance
*
* @param $new
*/
public function token($new = false)
{
if (true === $new || ! isset($_SESSION[self::$token_name]) || null === $_SESSION[self::$token_name]) {
$_SESSION[self::$token_name] = base64_encode(Zeed_Encrypt::generateSalt(8));
}
$token = $_SESSION[self::$token_name];
return $token;
}
/**
* 检查 Token
*
* @see self::token()
* @param string $token
* @return boolean
*/
public function checkToken($token, $forceInvaild = false)
{
$result = false;
$token = base64_encode(base64_decode($token));
if (isset($_SESSION[self::$token_name]) && strcmp($_SESSION[self::$token_name], $token) === 0) {
$result = true;
}
if ($forceInvaild) {
$_SESSION[self::$token_name] = null;
}
return $result;
}
/**
* 清除一些垃圾数据,防止 XSS
* Remove XSS from user input.
*
*
* $str = $this->input->xssClean($str);
*
*
* @param mixed string or array to sanitize
* @return string
*/
public function xssClean($str)
{
// http://svn.bitflux.ch/repos/public/popoon/trunk/classes/externalinput.php
// Kohana Modifications:
// * Changed double quotes to single quotes, changed indenting and spacing
// * Removed magic_quotes stuff
// * Increased regex readability:
// * Used delimeters that aren't found in the pattern
// * Removed all unneeded escapes
// * Deleted U modifiers and swapped greediness where needed
// * Increased regex speed:
// * Made capturing parentheses non-capturing where possible
// * Removed parentheses where possible
// * Split up alternation alternatives
// * Made some quantifiers possessive
// * Handle arrays recursively
if (is_array($str)) {
foreach ($str as $k => $s) {
$str[$k] = $this->xssClean($s);
}
return $str;
} /**
* 我们不支持对象的过滤
*/
elseif (is_object($str)) {
return '';
}
// Remove all NULL bytes
$str = str_replace("\0", '', $str);
// Fix &entity\n;
$str = str_replace(array('&', '<', '>'), array('&', '<', '>'), $str);
$str = preg_replace('/(*\w+)[\x00-\x20]+;/u', '$1;', $str);
$str = preg_replace('/(*[0-9A-F]+);*/iu', '$1;', $str);
$str = html_entity_decode($str, ENT_COMPAT, 'utf-8');
// Remove any attribute starting with "on" or xmlns
$str = preg_replace('#(?:on[a-z]+|xmlns)\s*=\s*[\'"\x00-\x20]?[^\'>"]*[\'"\x00-\x20]?\s?#iu', '', $str);
// Remove javascript: and vbscript: protocols
$str = preg_replace('#([a-z]*)[\x00-\x20]*=[\x00-\x20]*([`\'"]*)[\x00-\x20]*j[\x00-\x20]*a[\x00-\x20]*v[\x00-\x20]*a[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iu', '$1=$2nojavascript...', $str);
$str = preg_replace('#([a-z]*)[\x00-\x20]*=([\'"]*)[\x00-\x20]*v[\x00-\x20]*b[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iu', '$1=$2novbscript...', $str);
$str = preg_replace('#([a-z]*)[\x00-\x20]*=([\'"]*)[\x00-\x20]*-moz-binding[\x00-\x20]*:#u', '$1=$2nomozbinding...', $str);
// Only works in IE:
$str = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?expression[\x00-\x20]*\([^>]*+>#is', '$1>', $str);
$str = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?behaviour[\x00-\x20]*\([^>]*+>#is', '$1>', $str);
$str = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:*[^>]*+>#ius', '$1>', $str);
// Remove namespaced elements (we do not need them)
$str = preg_replace('#*\w+:\w[^>]*+>#i', '', $str);
do {
// Remove really unwanted tags
$old = $str;
$str = preg_replace('#*(?:applet|b(?:ase|gsound|link)|embed|frame(?:set)?|i(?:frame|layer)|l(?:ayer|ink)|meta|object|s(?:cript|tyle)|title|xml)[^>]*+>#i', '', $str);
} while ($old !== $str);
return $str;
}
/**
* 创建Zeed_Request_Http对象(单列)
*
* @return Zeed_Controller_Request
*/
public static function instance()
{
static $_instance = null;
if (! $_instance instanceof Zeed_Controller_Request) {
$_instance = new Zeed_Controller_Request();
}
return $_instance;
}
}
// End ^ LF ^ UTF-8