存储$ _SESSION时的安全性

时间:2014-04-30 21:37:39

标签: php security session

我存储了这样的会话:

$_SESSION['user'] = $_POST['u_name'];
$_SESSION['pass'] = $_POST['u_pass'];

这安全吗?

if( isset($_SESSION['user']) && isset($_SESSION['pass']) ) {

    // user exists

}else{

    // user does not exist

}

或者我应该检查(在每个文件中)是否

  • $_SESSION['user']
  • $_SESSION['pass']

在数据库中。

像这样:

    // db connection
    $conn = new PDO('mysql:host='.$host.';dbname='.$dbname, $user_db, $pass_db);

    // query string
    $stmt = $conn->prepare("SELECT * FROM users WHERE uname=:u_name AND AES_DECRYPT(upass,'some_key') = :u_pass;");

    // execute
    $statement->execute( array( 'u_name' => $_SESSION['user'], 'u_pass' => $_SESSION['pass']) );

    // does it return something ?
    if( $stmt->fetchColumn() == 1){

        // user exists

    }else{

        // user does not exist

    }

3 个答案:

答案 0 :(得分:5)

不,不要将用户的密码以纯文本形式存储,甚至不加密;不在会话中,也不在数据库中。密码应该加盐和散列,例如参见this question on SO

您根本不需要会话中的密码;在您检查一次正确的凭据后,无需存储它。如果您再次保护自己的会话劫持,会话中存储的信息(例如用户名)足以验证访问者。

答案 1 :(得分:1)

会话文件通常存储在/ tmp中,服务器上的每个人都可以读取。所以存储密码是个坏主意。

/ tmp在共享服务器上更重要,而不是专用于

在任何地方存储密码都是个坏主意。始终哈希密码,然后检查哈希值。自从5.5以来,Php已经内置支持如果你需要它,那么使用一个众所周知的库,如phpass

答案 2 :(得分:0)

您正在$_SESSION直接从$_POST以纯文本格式存储用户密码。你应该避免这样做,明文密码不应该存储在任何地方。

在针对数据库验证用户凭据后,您可以在$_SESSION中设置该用户已登录,如果用户的密码和用户名都存储在$_SESSION中,则无需每次都进行检查,类似于这样:

$_SESSION['logged_in'] = false;
if ($users_credentials_are_valid){
    $_SESSION['logged_in'] = true;
}

之后,您可以在其他文件中使用:

if ($_SESSION['logged_in']){
    // Content for logged in users only
}

我看到您使用AES_DECRYPT,这是错误的,因为在这种情况下,您可以显示用户的纯文本密码。一旦密码在数据库中,任何人都不能以纯文本格式访问它。您应该始终使用一些散列算法,如下所示:

$pass = hash('sha256', $_POST['pass']);

如果添加salt to the password,那就更好了。