5

我有多个站点的 CentOS LAMP。我使用 PHP 会话变量登录到 wesites。我的问题是,如果您登录一个站点,您可以在同一服务器上打开另一个站点并且您将登录。这些站点是完全独立的,所以我希望它们必须分别登录。每个站点都有不同的用户数据库。

这是我在登录时填充的会话变量。

$_SESSION["username"] = "$username";
$_SESSION["user_id"] = "$user_id";
$_SESSION["act_type"] = "$act_type";

我创建了一个小样本,以便您可以重新创建问题

有 2 个单独的站点: /var/www/html/site1 /var/www/html/site2

每个站点有 2 个页面 index.php,secure.php 如果我登录一个,我可以在另一个站点上打开 secure.php。

/var/www/html/site1/index.php

<?php

session_start();

$user = 'jane';
$pass  = '654321';

if ( $user == $_POST[user] AND $pass == $_POST[pass] ) {

    $_SESSION[user] = $user;
    header("location: secure.php");
}
else {
    echo "Bad Login";
}

?>

<form name="form1" method="post" action="index.php">

    Username: <input name="user" type="text">
    <br />
    Password: <input name="pass" type="password">
    <br /><br />
    <input type="submit" name="Submit" value="Login">
</form>

/var/www/html/site1/secure.php

<?php

session_start();

if ( !isset($_SESSION[user]) ) {

    header("location: index.php");
}

?>
Secure Page

/var/www/html/site2/index.php

<?php

session_start();

$user = 'joe';
$pass  = '123456';

if ( $user == $_POST[user] AND $pass == $_POST[pass] ) {

    $_SESSION[user] = $user;
    header("location: secure.php");
}
else {
    echo "Bad Login";
}

?>

<form name="form1" method="post" action="index.php">

    Username: <input name="user" type="text">
    <br />
    Password: <input name="pass" type="password">
    <br /><br />
    <input type="submit" name="Submit" value="Login">
</form>

/var/www/html/site2/secure.php

<?php

session_start();

if ( !isset($_SESSION[user]) ) {

    header("location: index.php");
}

?>
Secure Page
4

3 回答 3

2

我和你的情况类似,两个站点在同一台服务器上并使用 IP(公司内部网)。有问题他们在哪里登录,如果你登出,也会互相破坏。我的解决方案是使用会话变量的前缀来表示各个站点。

会话变量

站点 1

$_SESSION["s1_username"] = $username;
$_SESSION["s1_user_id"] = $user_id;
$_SESSION["s1_act_type"] = $act_type;

站点 2

$_SESSION["s2_username"] = $username;
$_SESSION["s2_user_id"] = $user_id;
$_SESSION["s2_act_type"] = $act_type;

^这将使两个站点之间的登录信息分开,因此它们不会“流血”到另一个站点。但是当我们注销时呢?不会session_destroy()摆脱所有变量吗?这是我为此所做的:

销毁会话/注销

站点 1

foreach($_SESSION as $key => $value)
{
  if (strpos($key, 's1_') === 0)
  {
   unset($_SESSION[$key]);
  }
}

站点 2

foreach($_SESSION as $key => $value)
{
  if (strpos($key, 's2_') === 0)
  {
   unset($_SESSION[$key]);
  }
}

^这可以防止我的网站在您注销一个而不是另一个时破坏彼此的变量。

希望这可以帮助那里的人不要像我一样浪费6个小时!:D

于 2016-08-26T19:08:35.050 回答
2

你应该使用

session_name( 'site1' );
session_start();

您正在创建一个会话元组,例如site1.user覆盖php.ini 的default PHPSESSID

在您的日志记录页面上调用它index.phpsession.php logout.php。这是最常见的登录文件骨架,或者每次调用时session_start()session_name(<sess_name>)都应该放在前面。

于 2019-08-09T10:03:50.497 回答
0

我猜您在会话 cookie 设置之间存在冲突。您应该为每个站点使用单独的 php.ini 文件(如果可能的话)或在每个站点的入口点使用特定设置。看看http://ar.php.net/manual/en/function.session-set-cookie-params.php

于 2013-01-29T16:58:22.557 回答