存储$ _SESSION时的安全性

Dav*_*vid 0 php security session

我存储了这样的会话:

$_SESSION['user'] = $_POST['u_name'];
$_SESSION['pass'] = $_POST['u_pass'];
Run Code Online (Sandbox Code Playgroud)

这样安全吗?

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

    // user exists

}else{

    // user does not exist

}
Run Code Online (Sandbox Code Playgroud)

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

  • $_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

    }
Run Code Online (Sandbox Code Playgroud)

jer*_*oen 5

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

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

  • @divad你没有.您在登录时从用户提供的密码生成哈希值,并将其与数据库中的哈希值进行比较.请参阅第一段中我链接的问题,并查看已接受答案的"未来实践". (3认同)
  • 您应该使用名为bcrypt或scrypt的专用哈希方法,而不是基本的盐渍哈希.PHP 5.5有这些内置功能.较旧的PHP版本可以使用phpass库. (2认同)
  • @divad绝对,但请注意,它仅在PHP 5.5之后可用.对于早期版本(5.3.7+),您需要兼容层:https://github.com/ircmaxell/password_compat (2认同)