我正在创建自己的自定义cookie类,我似乎无法弄清楚我做错了什么。这是我的cookie类:
<?php
class Cookie implements CookieHandlerInterface {
private $_domain;
private $_secure;
public function __construct(array $config = array()) {
$this->_domain = isset($config['domain']) ? $config['domain'] : 'localhost';
$this->_secure = isset($config['secure']) ? $config['secure'] : false;
}
public function set($name, $value = null, $timeLength) {
if (!is_null($value)) {
if (is_array($value)) {
if ($this->__isMultiArray($array)) {
return null;
} else {
$value = $this->__arrayBuild($value);
$value = 'array(' . $value . ')';
}
} elseif (is_bool($value)) {
if ($value) {
$value = 'bool(true)';
} else {
$value = 'bool(false)';
}
} elseif (is_int($value)) {
$value = 'int(' . strval($value) . ')';
} elseif (is_float($value)) {
$value = 'float(' . strval($value) . ')';
} elseif (is_string($value)) {
$value = 'string(' . $value . ')';
} else {
return null;
}
} else {
$value = 'null(null)';
}
setcookie($name, $value, (time() + $timeLength), '/', $this->_domain, $this->_secure, true);
}
public function get($name, $defualtOutput = null) {
if (isset($_COOKIE[$name])) {
$output = rtrim($_COOKIE[$name], ')');
$xr1 = mb_substr($output, 0, 1);
if (equals($xr1, 'a')) {
$output = ltrim($output, 'array(');
return $this->__arrayBreak($output);
}
if (equals($xr1, 'b')) {
$output = ltrim($output, 'bool(');
if (equals($output, 'true')) {
return true;
} else {
return false;
}
}
if (equals($xr1, 'i')) {
$output = ltrim($output, 'int(');
return (int) $output;
}
if (equals($xr1, 'f')) {
$output = ltrim($output, 'float(');
return (float) $output;
}
if (equals($xr1, 's')) {
$output = ltrim($output, 'string(');
return $output;
}
if (equals($output, 'null(null)')) {
return null;
}
}
if (
!is_array($defualtOutput)
&& !is_bool($defualtOutput)
&& !is_int($defualtOutput)
&& !is_float($defualtOutput)
&& !is_string($defualtOutput)
&& !is_null($defualtOutput)
) {
trigger_error(
'The $defualtOutput var needs to be only certain types of var types. Allowed (array, bool, int, float, string, null).',
E_USER_ERROR
);
}
return $defualtOutput;
}
public function delete($name) {
if (isset($_COOKIE[$name])) {
setcookie($name, '', time() - 3600, '/', $this->_domain, $this->_secure, true);
}
}
private function __arrayBuild($array) {
$out = '';
foreach ($array as $index => $data) {
$out .= ($data != '') ? $index . '=' . $data . '|' : '';
}
return rtrim($out, '|');
}
private function __arrayBreak($cookieString) {
$array = explode('|', $cookieString);
foreach ($array as $i => $stuff) {
$stuff = explode('=', $stuff);
$array[$stuff[0]] = $stuff[1];
unset($array[$i]);
}
return $array;
}
private function __isMultiArray($array) {
foreach ($array as $key => $value) {
if (is_array($value)) {
return true;
}
}
return false;
}
}
?>
我设置了一个测试Cookie,例如app('cookie')->set('test', 'hello', 0);
果然它创造了像预期的cookie。所以cookie读取string(hello)
当我尝试回应它时,它会回显默认值而不是实际变量,因此app('cookie')->get('test', 'test');
会返回test
get函数应检查cookie是否存在isset($_COOKIE[$cookieName])
然后它应该修剪额外的rtrim($_COOKIE[$cookieName], ')')
然后它应该抓取字符串中的第一个字符mb_substr($_COOKIE[$cookieName], 0, 1)
0从头开始,1只抓住第一个字符。
将它与默认值(a,b,i,f,s)进行比较后,例如,默认情况下,如果它以s
字符串开头,如果它是i
,则会被发送默认为int等等。
如果它们都是假的,它会检查它是否作为null发送,如果是这样它返回null,否则它返回传递的默认值。
equals函数与$var1 == $var2
相同,它是计时攻击安全的。
因此它会一直返回默认值null,任何帮助都会提前感谢。
答案 0 :(得分:0)
大声笑我觉得真傻我把0作为第三个参数,认为它会告诉cookie在浏览器会话关闭时到期,但它确实(time()+ 0)不等于0.所以它设置为它在创建时过期的cookie。所以我做了time() - (time() * 2)
。我实现了我想要的目标。