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

标签 php

我听说在同一台服务器上跨多个域共享 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/

相关文章:

php - Laravel Auth 重复电子邮件

javascript - clipboardjs 在用空格分配类时不起作用

php - 使用 ajax 和 GET 请求实现搜索而无需重新加载(例如 Amazon.com)

php - 这是一个 MySQL 错误还是我疯了?查询未返回足够的结果

php - 如何在 virustotal api v2 for php 中获取 div 命令结构化结果?

php - laravel 数据透视表获取错误记录

php - 使 jquery 片段以 IP 为条件

PHP/MYSQL 查询返回引用 ID 而不是 INT 值

php - 如何将 php 7.0 更新为 php 7.1+ ubuntu

javascript - 为什么在 PHP 中使用 intval 和 hexdec 内置函数的十六进制到十进制字符串输出不同?