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

php会话从用户端是不可更改的吗?,php,session,Php,Session,我正在开发自己的应用程序,需要用户登录。所有用户和密码(加密)都存储在数据库中。当用户尝试登录时,它会在数据库中搜索用户名和密码。如果一切正常,那么我将用户名存储在$\u会话[“用户名”],用户角色(管理员、作者等)存储在$\u会话[“角色”]中,用户网站存储在$\u会话[“网站”(我需要存储网站,因为应用程序类似于“多站点”-我的应用程序在客户端托管,但管理在我的服务器上) 我读了这个,我不明白。在$\u会话中,此方法是否安全(存储数据和用户是否登录) 用户能否更改会话内容?(例如,如果用户登

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

我读了这个,我不明白。在
$\u会话
中,此方法是否安全(存储数据和用户是否登录)

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

请告诉我什么是会话劫持,这会对我的网站产生什么影响,以及如何使会话id自动更改

非常感谢你

用户能否更改会话内容?(例如,如果用户已登录,$_SESSION[“username”]为“example.com”,用户是否可以将会话$_SESSION[“username”]更改为“example.org”以破坏另一个网站

。会话存储在您的服务器上,因此无法直接更改会话。另一方面,这完全取决于开发人员以及开发人员如何解释客户端请求。例如

$_SESSION['last_website'] = isset($_SERVER['HTTP_REFERER']) 
    ? $_SERVER['HTTP_REFERER'] 
    : $_SERVER['REQUEST_URI'];

最终将覆盖
$\u会话['last\u website']

否,除非php代码本身显示php会话(可用于会话窃取),并且在用户端无法更改会话,除非您自己提供了一些功能,可以从前端更改会话。

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

用户无法更改会话变量

如果它被黑客攻击,它可以改变

您需要获取用户id才能更改当前域中的
$\u会话[“网站”]
,并使用严格的验证


否则,他们可以破解它。

浏览器中存储有一个cookie,通常是
PHPSESSID
,用于标识用户正在使用的服务器会话。如果用户能够窃取它(通常通过),则用户可能会控制另一个用户会话

会话数据本身存储在服务器上,只有在用户能够在服务器中上传并执行恶意脚本的情况下,才能对其进行修改

`$_SESSION` variables are stored in the server and hence cannot be modified by the user.
其中一个最佳实践是,我们必须不断地从一端更改
会话id

这就是为什么我们使用一个名为
session\u regenate\u id()
的函数

此功能将用新会话ID替换当前会话ID,并保留当前会话信息,因此不会注销使用

在评论中回答您的问题:

每当您启动会话时,服务器将发回一个cookie,其中包含
会话id
,cookie名称将为
phpsesid
,这是默认名称。您也可以选择更改它。因此,当您使用
会话重新生成\u id
功能时,此id会不断更改

使用原因:

这主要有助于防止会话固定攻击。在此攻击中,恶意用户将尝试修复另一个用户的会话ID(SID)。如果成功,该用户将获得原始用户的所有访问权限,并能够执行合法用户可以执行的任何操作

因此,如果重新生成
会话id
,以前的
旧会话id
将不再有效

您可以获得有关会话固定的更多信息。

会话()是服务器端,如@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(); }
    }

}

否..$\u会话保存在服务器中..并且$\u COOKIE保存在浏览器端。重新会话劫持:等等,你正在存储加密密码?但你正在数据库中存储加密密码?这就是我的意思。请取下加密并使用散列函数,如
sha1
,加上盐。你可能想看看
password\u hash
函数()。然后,您可以验证哈希是否相同(通过重新哈希并使用
===
进行检查),或者根据您的PHP版本和使用的哈希函数,您可以使用函数
password\u verify
()但是会话不是以cookie的形式存储在broser中?@MMPP浏览器上存储了cookie,但它被用作会话的链接(因此我想您可以“更改”到其他会话)。数据本身存储在服务器上。我理解,谢谢!但是会话劫持是什么?如何避免?@MM PP例如,避免显示$_会话['password;']在代码中的任何位置,或者如果您的代码在存储在浏览器中时公开了PHPSESSIDcookie@MMPP会话劫持是指如果一个用户设法看到另一个用户的cookie,那么他们可以更改自己的会话cookie以匹配另一个用户的会话cookie,并使用该用户的会话。这通过DB条目(会话id和IP)被阻止.将cookie与session和db进行比较。如果不匹配…新session id.@Brian一个好主意,我喜欢it@Brian您能告诉我更多信息吗?我是否需要将用户会话id和用户ip存储在数据库中,并阻止ip的更改?回答您的问题