PHP Cookie

10/08/2012 01:21 boxxiebabee#1
Servus,

ich hab mal vor längerer Zeit eine Klasse für Cookies geschrieben.
Wollte es grad testen, funktioniert aber nur bedingt.

Unter Firefox wird das Cookie normal gesetzt, unter Chrome jedoch nicht.

Dies funktioniert jedoch einwandfrei:
Code:
setcookie ("test", "value");
Klasse:
Code:
<?php
class SecureCookie
{
    private $name;
    private $secret;
    
    public function __construct($name, $secret)
    {
        $this->name = $name;
        $this->secret = $secret;
    }
    
    private function Generate($id, $expiration)
    {
        $key    = hash_hmac('sha512', $id . $expiration, $this->secret);
        $hash   = hash_hmac('sha512', $id . $expiration, $key);
        $cookie = $id . '|' . $expiration . '|' . $hash;
        return $cookie;
    }
    
    public function Verify()
    {
        if(!empty($_COOKIE[$this->name])) {
            list($id, $expiration, $hmac) = explode('|', $_COOKIE[$this->name]);
            $key  = hash_hmac('sha512', $id . $expiration, $this->secret);
            $hash = hash_hmac('sha512', $id . $expiration, $key);
            if ($hmac != $hash || $expiration < time()) {
                $this->Destroy();
                return false;
            }
            return true;
        }
        return false;
    }
    
    public function getID()
    {
        if (!empty($_COOKIE[$this->name])) {
            list($id, $expiration, $hmac) = explode('|', $_COOKIE[$this->name]);
            return $id;
        }
        return false;
    }
    
    public function Destroy()
    {
        setcookie($this->name, '', time() - 1000, '/');
    }
    
    public function setCookie($id, $remember = false)
    {
        if ($remember) {
            $expiration = time() + 2419200; // 28 days
        } else {
            $expiration = time() + 43200; // 12 hours
        }
        $cookie = $this->Generate($id, $expiration);
        setcookie($this->name, $cookie, $expiration, '/', $_SERVER['HTTP_HOST'], false, true);
    }
}
?>
Jemand ne Idee woran es liegt?
10/08/2012 10:02 NotEnoughForYou#2
Hab da eine Vermutung, editiere es sobald ich zuhause bin.

#Edit: bei mir klappt es im Chrome.

Aufruf
PHP Code:
<?php
$cookie 
= new SecureCookie("testcookie""sss");

$cookie->setCookie(210099999);

if(isset(
$_COOKIE['testcookie'])){
    echo
'existiert';
}
else {
    echo
'existiert nicht';
}
?>
10/08/2012 10:05 kissein#3
Wird auf localhost getestet?
Code:
 setcookie($this->name, $cookie, $expiration, '/', $_SERVER['HTTP_HOST'], false, true);
setzt mal http_host auf 127.0.0.1 beim Chrome test dann müsste es klappen.
10/09/2012 08:40 boxxiebabee#4
Hey,

danke für die Antworten. Nachdem ich es mal auf den Webspace hochgeladen habe kamen gleich mal 2 Fehlermeldungen. Da hat sich anscheinend davor noch irgendein echo versteckt, demzufolge wurden die Header schon gesendet und somit konnte keine Session/Cookie mehr gesetzt werden.
10/09/2012 17:23 dowhile#5
Hast du irgendeinen bestimmten Grund dafür, dass du Generate, Verify und Destroy am Anfang groß, die Setter und Getter aber klein schreibst? Wenn nicht ist es sicher nur vorteilhaft, wenn du dich auf einen "Stil" beschränkst - bestenfalls natürlich für den "üblicheren" Stil (erster Buchstabe klein).
10/09/2012 20:06 boxxiebabee#6
Quote:
Originally Posted by dowhile View Post
Hast du irgendeinen bestimmten Grund dafür, dass du Generate, Verify und Destroy am Anfang groß, die Setter und Getter aber klein schreibst? Wenn nicht ist es sicher nur vorteilhaft, wenn du dich auf einen "Stil" beschränkst - bestenfalls natürlich für den "üblicheren" Stil (erster Buchstabe klein).
Wenn ne Funktionen aus mehreren Wörtern besteht, und das erste ein Verb ist, schreib ich es eig. immer klein, ist einfach eine Angewohnheit.
Man könnte natürlich alles klein / groß oder was auch immer schreiben, aber nachdem mein Editor sowieso die Funktionen vorschlägt, und es vermutlich nicht opensource wird ist mir das eig. relativ egal.