php会话是否可以从用户端无法更改?

MM *_* PP 18 php session

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

我读过这个用户可以在PHP中改变$ _SESSION的值吗?我不明白 这种方法是安全的(存储数据,如果用户登录)$_SESSION

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

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

非常感谢!

kd0*_*807 10

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

  • @MMPP cookie存储在浏览器中,但它被用作会话的链接(所以我猜你可以"改变"到另一个会话").数据本身存储在服务器上. (2认同)

Bri*_*ian 5

Session()是服务器端,如@ kd0807所述.有关Session Hijacking && Fixation的更多信息:

旁注...随着变量的数量,我推荐一个数组用于session ['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.
Run Code Online (Sandbox Code Playgroud)

这是我使用的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(); }
    }

}
Run Code Online (Sandbox Code Playgroud)