我正在开发自己的应用程序,需要用户登录。所有用户和密码(加密)都存储在数据库中。当用户尝试登录时,它会在数据库中搜索用户名和密码。如果一切正常,那么我将username
存储在$_SESSION["username"]
中,用户role
(管理员,作者等)存储在$_SESSION["role"]
中,用户website
存储在$_SESSION["website"]
中(我需要存储网站,因为应用程序就像“多站点” - 我的应用程序托管在客户端托管上,但管理在我的服务器上)。
我读了Can a user alter the value of $_SESSION in PHP?,我不明白。这种方法是安全的(存储数据以及用户是否已登录)$_SESSION
?
用户可以更改会话内容吗? (例如,如果用户已登录且$_SESSION["website"]
是“example.com”,用户是否可以将会话$_SESSION["website"]
更改为“example.org”以破坏其他网站?如果是,则如何避免或者什么是会话的安全替代方案?)。
请告诉我什么是会话劫持,这对我的网站有什么影响,以及如何使session_id以动态方式进行更改?
非常感谢你!
答案 0 :(得分:10)
$ _ SESSION保存在服务器中,因此用户无法对其进行修改(会话劫持除外)
答案 1 :(得分:5)
Session()是服务器端,如@ kd0807所述。有关Session Hijacking&& amp;& amp;&固定:
旁注...... 随着变量的数量,我推荐一个用于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.
以下是我使用的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(); }
}
}
答案 2 :(得分:2)
用户可以更改会话内容吗? (例如,如果用户已登录且$ _SESSION ["用户名"]为" example.com"),用户是否可以更改会话$ _SESSION ["用户名&#34 ;]到" example.org"破坏另一个网站?
否即可。会话存储在您的服务器上,因此无法直接更改会话。另一方面,这一切都取决于开发人员以及如何解释客户端请求。例如,制作
$_SESSION['last_website'] = isset($_SERVER['HTTP_REFERER'])
? $_SERVER['HTTP_REFERER']
: $_SERVER['REQUEST_URI'];
最终会覆盖$_SESSION['last_website']
。
答案 3 :(得分:2)
不,除非PHP代码本身显示PHP会话,可以用于会话窃取,并且会话无法从用户端更改,除非您自己提供某些功能以进行更改来自前端的会议。
答案 4 :(得分:2)
浏览器中通常存储一个cookie PHPSESSID
,用于标识用户正在使用的服务器会话。如果用户能够窃取它(这通常通过XSS vulnerabilities发生),则用户可能会控制另一个用户会话。
会话数据本身存储在服务器上,只有在用户以某种方式上传并执行服务器中的恶意脚本时才能修改
答案 5 :(得分:2)
`$_SESSION` variables are stored in the server and hence cannot be modified by the user.
最佳做法之一是我们必须不断更改session id
。
这就是我们使用名为session_regenerate_id()
的函数的原因。
此功能将使用新会话ID替换当前会话ID,并保留当前会话信息,因此不会注销使用。
在评论中回答您的问题:
每当你开始一个会话时,服务器都会发回一个包含session id
的cookie,cookie名称将是PHPSESSID
,这是默认名称。您也可以选择更改它。因此,当您使用session_regenerate_id
函数时,此ID就会不断变化。
为什么要使用它
这主要有助于防止session fixation
攻击。在此攻击中,恶意用户将尝试修复其他用户的会话ID(SID)。如果他获得成功,用户将获得原始用户的所有访问权限,并且能够执行合法用户可以执行的任何操作。
因此,如果您重新生成session id
,之前的old session id
将不再有效
您可以获得有关会话固定的更多信息IN OWASP WEBSITE
答案 6 :(得分:1)
是用户无法更改会话变量 ...
如果它被黑了就可以改变......
您需要获取用户ID才能更改当前域中的$_SESSION["website"]
并使用严格验证...
否则他们可以破解它......