我存储了这样的会话:
$_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
}
答案 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,那就更好了。