我需要在cookie中存储一些数组数据,我一直在研究最好的方法,很多人似乎认为使用serialize
是可行的,但在这个线程中:
PHP如何将数组字符串化并存储在cookie 中
有人建议不要使用它作为"序列化程序将调用序列化类的构造函数。这很糟糕,因为它会导致代码执行。"
所以我想知道我还有什么其他选择?base64_encode
呢?
我不能使用sessions
,因为我需要在浏览器关闭后保留数据;尽管我也担心Cookies 4KB
的限制。
FWIW我正在存储存储在某人购物车中的购物车数据,当他们回来时,需要将其加载回他们的购物车中。
如何生成一个唯一的ID,将其存储在cookie中,并将序列化数组和ID存储在数据库中?
示例:
// ------------ STORING TO COOKIE AND DATABASE ------------ //
$id = uniqid();
setcookie("id", $id, time()+60*60*24); // 1 day
$serialized = serialize($array);
mysql_query("INSERT INTO yourTable (id, array) VALUES ('$id', '$serialized')");
// ------------ SELECTING FROM DATABASE ------------ //
if(!isset($_COOKIE['id'])) die();
$id = mysql_real_escape_string($_COOKIE['id']);
$result = mysql_query("SELECT array FROM yourTable WHERE id = $id LIMIT 1");
if(!is_resource($result)) die();
$serialized = mysql_result($result, 0);
$array = unserialize($serialized);
在扩展以前的注释和answr的基础上,您应该非常努力地避免数据存储在cookie中,而不是指向数据的指针,例如指向数据库行的ID。
假设所有客户端都是敌人(我认为这是合理的假设),一个错误的cookie——无论是恶意的还是有缺陷的——如果它只包含一个指针,都不会造成太大的伤害:
- 无效:悄悄放下
- 错误:通过将ID与请求ID的用户进行比较进行检查;如果是的话,悄悄放下
- 有效;使用它
我最终更喜欢无声投递,而不是错误消息,因为我有一种直觉,那就是这可能会让极少数真正恶意的用户更难投递。
Cookie不是存储用户数据的最佳方式用户必须在您的网站上获得授权,并且所有数据必须通过user_id 存储在数据库中