【问题标题】:PHP serialized data stored in mysql db errorPHP序列化数据存储在mysql db错误
【发布时间】:2015-09-28 16:22:15
【问题描述】:

我有一个基于数据库的会话存储解决方案。效果很好!但是,我在存储特定类型的数据时遇到了问题。

我有一个使用 CSRF 令牌的应用程序。创建表单时,它将为该表单创建一个令牌。令牌是不同类型值的散列 (sha256) 值。一份副本进入表单,另一份副本存储在会话中。提交表单后,它会比较令牌以确保它们匹配。

以下是使用新数据更新数据库的 destruct 函数示例

UPDATE session_manager SET variables= :variables  WHERE 1=1  AND id = :id
array(2) {
  [":variables"]=>
      string(152) "a:1:{s:4:"CSRF";a:1:{s:8:"register";a:2:{s:5:"token";s:64:"e749603241dec1911ef3a40d98b2f5185d389434060483297394b504cc904ede";s:4:"time";i:1443456816;}}}"
  [":id"]=>
      string(2) "49"
}

更新语句很好并且工作正常。这是我遇到的问题,数据已更新,但是您可以在上面的数据中看到的“令牌”值与下面的 db 中的值不同(这是数据的二进制下载):

a:1:{s:4:"CSRF";a:1:{s:8:"register";a:2:{s:5:"token";s:64:"b48fc79fc2f51eff765c05476895238a42d9d45b2c1aeb7c6e4582d0381b7f4f";s:4:"time";i:1443456817;}}}

似乎 mysql 正在改变值,我终其一生都无法弄清楚这个问题。我尝试过的解决方案包括:

  • 序列化
  • json_encode
  • base64

更改数据库的字符集等等。在数据库中尝试了不同的字段类型,例如 TEXT、Longtext 和 BLOB。这似乎对我不起作用:(

这是 db 的 sql

CREATE TABLE session_manager(
    id BIGINT(11) PRIMARY KEY AUTO_INCREMENT NOT NULL,
    session_id VARCHAR(200),
    user_agent TINYTEXT NOT NULL,
    variables BLOB NOT NULL,
    initial_time DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,
    regenerate_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL
);

你想到了什么原因?

【问题讨论】:

  • 我不认为 MySQL 正在改变你的价值。您必须在 php 代码中为更新提供不同的字符串...您正在使用准备好的语句进行更新...在更新语句之前尝试 echo $tokenValue; 以验证值
  • 您在更新语句之后看到的数组是执行 db 查询之前绑定参数的转储。
  • 使用Text 作为类型,它可能无法解决问题,但这是解决问题的建议之一。我面对它。
  • 另外,以下代码取自我的一个工作项目$this->attributes['options'] = base64_encode(serialize($options)); 供阅读return unserialize(base64_decode($options));
  • 我会试一试的。就像一个有趣的问题一样,添加 base64 不会增加服务器的负载吗?还是可以忽略不计?

标签: php mysql mariadb


【解决方案1】:

您查看过数组的time 索引吗?好像也变了。这使我认为保存会话的方法(至少)执行了两次。第二次更新会话并覆盖旧值。

在附加调试器的情况下运行此代码,或在每次调用您的函数时打印/记录堆栈跟踪。当值再次更新时,这应该会给你一个很好的主意。

PS:更新查询是否会在下一次请求时再次调用,然后才能检索到值?

【讨论】:

  • 是的,我在尝试寻找解决方案后注意到了这一点。我已经解决了我的问题。不,更新在破坏函数中。干杯
【解决方案2】:

好的。因此,经过进一步调查并听取了大家的意见(顺便干杯)。我解决了我的问题。

原来它与 mysql 完全没有关系。它实际上与“favicon.ico”有关。我像你一样使用花哨的 url,因为我在开发中,所以我从不打扰 favicon。默认情况下,在加载页面时,它会尝试查找图标 (http://localhost/favicon.ico)。系统假定用户正在尝试访问控制器(我使用 mvc),并且由于控制器不存在,它会重定向到主页。主页需要生成令牌,因为上面有一个表单,因此它会第二次生成一个令牌,使原始令牌无效。这是我通过开发者控制台查看所有网络连接后才意识到的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 2014-10-22
    • 2014-02-19
    相关资源
    最近更新 更多