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

时间:2015-06-11 05:35:48

标签: php session

我正在开发自己的应用程序,需要用户登录。所有用户和密码(加密)都存储在数据库中。当用户尝试登录时,它会在数据库中搜索用户名和密码。如果一切正常,那么我将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以动态方式进行更改?

非常感谢你!

7 个答案:

答案 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"]并使用严格验证...

否则他们可以破解它......