php会话在用户端是不可更改的吗?

2022-08-30 21:09:18

我正在开发自己的应用程序,需要用户登录。所有用户和密码(加密)都存储在数据库中。当用户尝试登录时,它会在数据库中搜索用户名和密码。如果一切正常,那么我存储在,用户(管理员,作者等)和用户中(我需要存储网站,因为应用程序就像“多站点” - 我的应用程序托管在客户端托管上,但管理在我的服务器上)。username$_SESSION["username"]role$_SESSION["role"]website$_SESSION["website"]

我读到这个 用户可以改变PHP中_SESSION美元的价值吗?我不明白。此方法是否安全(存储数据以及用户是否已登录)在 ?$_SESSION

用户是否可以更改会话内容?(例如,如果用户已登录并且“example.com”,用户是否可以将会话更改为“example.org”以破坏另一个网站?如果是,如何避免或会话的安全替代方案是什么?$_SESSION["website"]$_SESSION["website"]

请告诉我什么是会话劫持,这对我的网站有什么影响,以及如何使session_id改变?

非常感谢!


答案 1

$_SESSION保存在服务器中,因此用户无法修改它(会话劫持的情况除外)


答案 2

Session() 是服务器端,如前所述@kd0807。有关会话劫持和固定的更多信息:

附注...有了变量的数量,我推荐一个数组用于会话['user']。例。。。。

$_SESSION['user'] => Array(
'userid'=> '123',
'username'=> 'some_joe',
'role' => 'customer', // user, customer, admin, moderator etc.
'website' => 'http://www.example.com'
);

// reading variables from array
$userid = $_SESSION['user']['userid'];
$username = $_SESSION['user']['username'];
// etc. etc.

以下是我使用的3个非常简化的函数。

// determine if session has started
Function HasSessionStarted() {

    $result = false; // default to false

    // Check if session has started
    IF ((session_status() == PHP_SESSION_NONE) || (session_id() == '')) { 
        $result = true; 
    }

    return $result;

}

// Set a session value
Function Set_Session($name, $value) {
    /* @params value: can be a string or an array */
    $new_session = HasSessionStarted(); // Check Session Status

    IF ((isset($name)) && (isset($value))) {
        IF ($new_session) { session_start(); }
        $_SESSION[$name] = $value;
        IF ($new_session) { session_write_close(); }
    }

}

Function Unset_Session($name) {

    $new_session = HasSessionStarted(); // Check Session Status

    IF (isset($_SESSION[$name])) {
        IF ($new_session) { session_start(); }
        unset($_SESSION[$name]);
        IF ($new_session) { session_write_close(); }
    }

}

推荐