gpt4 book ai didi

php - 同一服务器上跨多个域的 session 共享

转载 作者:可可西里 更新时间:2023-11-01 13:12:44 25 4
gpt4 key购买 nike

我听说在同一台服务器上跨多个域共享 session 的最佳方法是使用自定义 php session 处理程序。 (即域名不同,如 abc.com、xyz.com 但单一应用。)

但在我尝试之后,当我尝试从不同域读取 cookie 值时,即使是在 1 个服务器上使用相同数据库的自定义 php session 处理程序也无法共享 session 。

这是我的自定义 session 处理程序,请检查或修复此处是否缺少某些内容。因为我已经试了一个星期了。无法正常工作

附言要获取以前的 session ID,我使用如下链接:newdomain.com/?ssid=[SESSION_ID]


SESSION_INCLUDE.PHP

<?php 

// config
$m_host = "localhost"; //MySQL Host
$m_user = "db_user"; //MySQL User
$m_pass = "db_pass"; //MySQL Pass
$m_db = "db_name"; //MySQL Database
$table = "sess_data";

$session_expire = 600; // Session expire time, in seconds (minutes * 60 = seconds)

$gc_probability = 100; // Probability that the garbage collection function will be called. 50% chance by default

ini_set("session.gc_probability",$gc_probability);

/* Open function; Opens/starts session

Opens a connection to the database and stays open until specifically closed
This function is called first and with each page load */

function open ($s,$n) // do not modify function parameters
{
global $session_connection, $m_host, $m_user, $m_pass, $m_db;
$session_connection = mysql_pconnect($m_host,$m_user,$m_pass);
mysql_select_db($m_db,$session_connection);
return true;
}

/* Read function; downloads data from repository to current session

Queries the mysql database, unencrypts data, and returns it.
This function is called after 'open' with each page load. */
function read ($id) // do not modify function parameters
{
global $session_connection,$session_read,$table;
$query = "SELECT data FROM `$table` WHERE id=\"{$id}\"";
$res = mysql_query($query,$session_connection);
if(mysql_num_rows($res) != 1) return ""; // must return string, not 'false'
else
{
$session_read = mysql_fetch_assoc($res);
$session_read["data"] = base64_decode($session_read["data"]);
return $session_read["data"];
}
}
function write ($id,$data) // do not modify function parameters
{
if(!$data) { return false; }
global $session_connection, $session_read, $session_expire, $table;
$expire = time() + $session_expire;
$data = mysql_real_escape_string(base64_encode($data));
if($session_read) $query = "UPDATE `$table` SET data=\"{$data}\", expire=\"{$expire}\" WHERE id=\"{$id}\"";
else $query = "INSERT INTO sess_data SET id=\"{$id}\", data=\"{$data}\", expire=\"{$expire}\"";
mysql_query($query,$session_connection);
return true;
}
function close ()
{
global $session_connection;
mysql_close($session_connection);
return true;
}
function destroy ($id) // do not modify function parameters
{
global $session_connection,$table;
$query = "DELETE FROM `$table` WHERE id=\"{$id}\"";
mysql_query($query,$session_connection);
return true;
}
function gc ($expire)
{
global $session_connection,$table;
$query = "DELETE FROM `$table` WHERE expire < ".time();
mysql_query($query,$session_connection);
}
// Set custom handlers
session_set_save_handler ("open", "close", "read", "write", "destroy", "gc");

// Start session
session_start();
?>




MySQL数据库说明

create table sess_data (
id2 int not null auto_increment,
id text not null,
data text,
expire int not null,
primary key(id2)
);

最佳答案

您无法从一个域中读取另一个域中的 cookie。这是在浏览器中实现的安全性。为 session 使用数据库允许您让多个服务器在同一域上共享 session ,但不允许在同一服务器上的多个域共享 session 。

如果要在域之间共享 session ,则需要在切换域时实现某种 session 传输方法。最简单的方法是将 session ID 作为 GET 参数从一个域的页面传递到另一个域的页面。然后,在另一个域上,您将获取 session ID 并使用该 ID 创建一个新 session 。

虽然这是一种简单的方法,但它不是很安全并且允许 session 劫持。更好的方法是使用数据库创建一个包含 session ID 的记录,在其上设置一个短超时,并将该记录的 ID 传递给另一个域。然后另一个域将从数据库中获取记录并创建一个 session 。如果数据库中的记录已经过期,它就不会选择 session 。这将更好地防止 session 劫持。

关于php - 同一服务器上跨多个域的 session 共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4759312/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com