我存储了这样的会话:
$_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 }
jeroen.. 5
不,不要将用户密码以纯文本形式存储,甚至不加密; 不在会话中,也不在数据库中.密码应该加盐和散列,例如参见SO上的这个问题.
您根本不需要会话中的密码; 在您检查一次正确的凭据后,无需存储它.如果您再次保护自己的会话劫持,会话中存储的信息(例如用户名)足以验证访问者.
不,不要将用户密码以纯文本形式存储,甚至不加密; 不在会话中,也不在数据库中.密码应该加盐和散列,例如参见SO上的这个问题.
您根本不需要会话中的密码; 在您检查一次正确的凭据后,无需存储它.如果您再次保护自己的会话劫持,会话中存储的信息(例如用户名)足以验证访问者.