我正在开始学习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信息 伙计们,这是我的第一篇文章,如果我做错了,我道歉。 我必须为你做点什么吗?
答案 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
魔法仍然有用。
答案 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'];