【问题标题】:Php Custom session safe handler safe data as jsonPHP 自定义会话安全处理程序安全数据为 json
【发布时间】:2014-08-08 06:05:57
【问题描述】:

我正在尝试设置一个自定义会话安全处理程序,该处理程序到目前为止有效。但我不想以 PHP 会话格式存储数据,而是以纯 JSON 格式存储数据。如何更改读写函数以将 php 会话数据编码/解码为 json。

function write($sessionId, $data) { 
    $db = new PDO("mysql:host=myhost;dbname=mydb", "myuser", "mypassword");

    $sql = "INSERT INTO session SET session_id =" . $db->quote($sessionId) . ", session_data =" . $db->quote($data) . " ON DUPLICATE KEY UPDATE session_data =" . $db->quote($data);
    $db->query($sql)
}

function read($sessionId) { 
    $db = new PDO("mysql:host=myhost;dbname=mydb", "myuser", "mypassword");

    $sql = "SELECT session_data FROM session where session_id =" . $db->quote($sessionId);
    $result = $db->query($sql);
    $data = $result->fetchColumn();
    $result->closeCursor();

    return $data;
}

函数来自tutorial。作者说:

PHP 将序列化的数据传递给 write 函数,并期望它从 read 函数中序列化回来,但这并不意味着您必须以这种方式存储它。您可以在写入回调中立即对数据进行反序列化,然后根据数据执行一些操作或根据需要存储它。

我尝试了以下我认为可以完成工作的功能?

  • json_encode()
  • json_decode()
  • 序列化()
  • 反序列化()

编辑

如果我不尝试对数据进行 json_encode,它会按照以下格式写入 db:

auth|b:1;LAST_ACTIVITY|i:1407480463;

【问题讨论】:

    标签: php session


    【解决方案1】:

    传递给 write 函数的会话数据不是不可序列化的......有一些方法可以手动进行反序列化,但它们有时会失败,具体取决于会话数据的复杂程度。所以,这是我的解决方案。

    步骤 1. 在您的表中创建一个新字段并将其命名为“json” 您必须同时存储 json 数据和 php 序列化格式。您可以随意使用 json 数据,但传入写入函数的 $data 必须完全按照传入的方式返回。并且没有(简单)方法可以正确执行此操作。因此,只需查找 $_SESSION 并对其进行编码。然后将 $data 和 json 编码版本存储在您的表中。您的读取操作只需要返回传递给您的写入函数的 $data。

    function write($sessionId, $data) {
        $db = new PDO("mysql:host=myhost;dbname=mydb", "myuser", "mypassword");
    
        // Convert current $_SESSION to json because it hasn't been destroyed yet.
        $json = json_encode($_SESSION);
    
        $quotedSessId = $db->quote($sessionId);
        $quotedData = $db->quote($data);
        $quotedJson = $db->quote($json);
    
        $sql = "INSERT INTO session SET session_id = $quotedSessionId, session_data = $quotedData, json = $quotedJson ON DUPLICATE KEY UPDATE session_data = $quotedData, json = $quotedJson";
        $db->query($sql);
    }
    
    function read($sessionId) {
        $db = new PDO("mysql:host=myhost;dbname=mydb", "myuser", "mypassword");
    
        $sql = "SELECT session_data FROM session where session_id =" . $db->quote($sessionId);
        $result = $db->query($sql);
    
        $result->closeCursor();
    
        return $data;
    }
    

    【讨论】:

    • 感谢您。是的,这就是它应该如何工作的不幸的是,我的会话列中出现“错误”。
    • 如果您不尝试进行 json 编码而只使用默认函数怎么办?那么,您的列中是否获得了有效的序列化字符串?也许这会让你了解为什么你会弄错。
    • 是的,如果我不使用 json,php 会话格式会按预期写入数据库。 mhhh 但 json 也是像 php 序列化会话一样的字符串,认为这可能是问题所在,不同的数据类型,mhhh
    • 你能发布一个不尝试转换为 json 时写入 db 的 php 会话格式的示例吗?
    • 好的,看起来传递给写函数的数据不是正常格式....还是有可能的,只是需要考虑一些事情。我现在正在编辑我的答案。
    猜你喜欢
    • 1970-01-01
    • 2015-07-18
    • 1970-01-01
    • 2011-03-07
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多