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所述。有关会话劫持和固定的更多信息:
$_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的更改?回答您的问题