PHP中的Cookie对象

时间:2013-11-20 13:06:25

标签: php

我正在开始学习PHP并且我遇到了一个应用程序问题: 我需要在PHP中为一个cookie放置一个对象的信息,然后在另一个页面上再次接收一个cookie。 任何人都有解决这个问题的方法吗?

我想要存储在cookie中的信息只是一些信息,最好是客户作为背景颜色,窗口大小。

<?php  
class Client {    

private $id;
private $pSize;    
private $color;

function __construct($id) {
    $this->id = $id;
}

public function getPSize() {
    return $this->pSize;
}

public function setPSize($pSize) {
    $this->pSize = $pSize;
}

public function getColor() {
    return $this->color;
}

public function setColor($color) {
    $this->color = $color;
}
}
?> 

在页面index.php中我有:

<?php      
  include_once 'Client.class.php';
    //Test Preference Client
    $client = new Client(1);
    $client->setColor("#000000");        
    $client->setPSize(200);       

    //using Serialize to put to Cookie
    $StringClient = serialize($client);

    //Store to Cookie
    $_COOKIE['PreferenceClient'] = $StringClient;

&GT;

在另一页中我得到了信息:

 if(isset($_COOKIE['PreferenceClient'])){
       // Unsing Unserialize to Object
        $objClient = unserialize($_COOKIE['PreferenceClient']);

        //Test data:
        echo $objClient->getColor();            
        //Continue with Performing changes to the client if the information exists...
    }

我解决了这个问题。感谢所有帮助过的人。 在我尝试之前只获取没有序列化的cookie信息 伙计们,这是我的第一篇文章,如果我做错了,我道歉。 我必须为你做点什么吗?

4 个答案:

答案 0 :(得分:4)

您可以通过序列化,反序列化将对象存储在字符串中(如cookie)。

setcookie ($name, serialize($object));   // set object

$object = unserialize($_COOKIE[$name]);   // get object

但请记住,使用这种方法可能很危险。 PHP Object Injection

您可以使用json代替serialization来存储stdClass,这样就足够安全了。

setcookie ($name, json_encode($object));   // set object stdClass

$object = json_decode($_COOKIE[$name]);   // get object stdClass

但它更喜欢使用session来存储您的数据。您甚至可以存储对象而无需调用序列化,反序列化。但是__sleep__wakeup魔法仍然有用。

setcookie$_COOKIEserializemagic with serialization

答案 1 :(得分:2)

答案是:你没有。

每当您从客户端获取数据并在代码中使用它时, 您必须实现安全性,以防止用户更改其客户端数据并向服务器注入意外情况时的情况。客户端可以轻松伪造和更改cookie数据,从而更改您的对象。

示例:

如果我们从Alma Do的答案序列化对象并将值存储在cookie中,则客户端/用户可以从

中看到我们的数据库身份验证设置
public function __sleep() {
    return array('server', 'username', 'password', 'db');
}

客户端现在可以更改他的cookie以使用虚假服务器而不是服务器,伪造您的登录/用户表并伪装成管理员。

我认为这是XY Problem的情况,请告诉我们您的目标究竟是什么。

答案 2 :(得分:1)

这听起来更像会话功能。您不应该通过Cookie传输数据。在Cookies中,您只能保存会话令牌或散列或某些设置等简短信息。要传输和保存数据,PHP会话功能要好得多。

http://www.php.net/manual/de/book.session.php

在您的会话中,您可以根据需要序列化某些数据,或仅保存数组或值。

session_start(); // on every page

$_SESSION['test'] = "123123";

echo $_SESSION['test'];

答案 3 :(得分:0)

要发送序列化对象,您必须使用time()之类的指定内容绕过SPAM并控制timeOut!

session_start();  

setcookie('myobject',serialize("Myvalue"),(time()+(3600*24*30)));

一定要存储在会话中:

     unset($_SESSION['myobject']);

存储您的对象

     $_SESSION['myobject'] = unserialize($_COOKIE['myobject']);

恢复你的Obecjt:

$mySeriaLizedObject = $_SESSION['myobject'];