在同一服务器上跨多个域的会话共享

PHP*_*bie 6 php

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

但在我尝试之后,即使是使用SAME DATABASE ON 1 SERVER的自定义php会话处理程序也无法共享会话,当我尝试从不同的域读取cookie值时.

这是我的自定义会话处理程序,请检查或修复此处缺少的内容.因为我已经试了一个星期了.无法让它发挥作用

PS要获取以前的会话ID,我使用以下链接:newdomain.com/?sid = [SERVION_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(); 
?>
Run Code Online (Sandbox Code Playgroud)




MySQL数据库描述

create table sess_data (
id2 int not null auto_increment,
id text not null,
data text,
expire int not null,
primary key(id2)
);
Run Code Online (Sandbox Code Playgroud)

Eri*_*lje 11

您无法从另一个域中的一个域读取Cookie.这是浏览器中实现的安全性.使用数据库进行会话可以让多个服务器在同一个域上共享会话,但不允许同一服务器上的多个域共享会话.

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

虽然这是一种简单的方法,但它不是很安全,并且允许会话劫持.更好的方法是使用数据库创建一个包含会话ID的记录,在其上设置一个短暂的超时,并将该记录的ID传递给另一个域.然后,另一个域将从数据库中获取记录并使用它创建会话.如果数据库中的记录超过了它的到期时间,它就不会启动会话.这将提供更好的防止会话劫持的保护.