Php自定义会话安全处理程序安全数据为json

时间:2014-08-08 06:05:58

标签: php session

我正在尝试设置一个到目前为止有效的自定义会话安全处理程序。但我不想以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()
  • 的serialize()
  • 反序列化()

修改

如果我没有尝试对数据进行json_encode,则会按以下格式写入db:

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

1 个答案:

答案 0 :(得分:2)

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

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

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;
}