簡體   English   中英

PHP序列化的數據存儲在mysql db錯誤中

[英]PHP serialized data stored in mysql db error

我有一個基於數據庫的會話存儲解決方案。 很棒! 但是,我在存儲特定類型的數據時遇到了問題。

我有一個使用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。 哪個似乎不適合我:(

這是數據庫的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
);

有什么原因讓我想到嗎?

您是否看過陣列的time索引? 似乎它也發生了變化。 這使我認為保存會話的方法執行了(至少)兩次。 會話第二次更新並覆蓋舊值。

在附加調試器的情況下運行此代碼,或者在每次調用函數時打印/記錄堆棧跟蹤。 當值再次更新時,這應該給您一個很好的主意。

PS:在可以檢索值之前,是否在下一個請求上再次調用更新查詢?

好。 因此,經過進一步調查並吸收了所有人的意見(順便加油)。 我解決了我的問題。

事實證明,它與mysql完全無關。 它實際上與“ favicon.ico”有關。 我像您一樣使用精美的網址,並且因為我在開發人員之內,所以我從不理會該圖標。 默認情況下,在加載頁面時,它會嘗試找到一個圖標( http://localhost/favicon.ico )。 系統假定用戶正在嘗試訪問控制器(我使用mvc),並且由於該控制器不存在,因此它將重定向到主頁。 主頁需要生成令牌,因為它上面有一個表單,因此它第二次生成令牌,使原始令牌無效。 通過開發人員控制台查看所有網絡連接后,我意識到了這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM