클라이언트의 라이브 웹 사이트를 개선하고 있지만 요구 사항을 고수했습니다. 현재 사용자가 암호를 잊어 버리면 암호화 된 암호로 전자 메일을 받게됩니다. 그런 다음 사이트를 통해 로그인 할 수 있습니다. 사용자가 암호 변경 페이지 (changepassword.php)로 이동하지 않는 한 암호는 영구적으로 유지됩니다.기본 페이지로 새 세션을 설정하는 방법
클라이언트가 원하는 것은 기본 회원 페이지 (subjects.php) 대신 암호화 된 비밀번호를 사용하는 경우 사용자가 비밀번호 변경 페이지로 곧바로 이동하도록하는 것입니다.
MYSQL users 테이블의 경우 값 1 또는 NULL 만 보유 할 새로운 열 (temp_password)을 만들었습니다. 잊어 버린 암호 요청을 받으면 열의 값이 1로 업데이트됩니다. 따라서 사용자 이메일과 비밀번호가 temp_password의 값 1과 일치하는 경우에만 새 세션 (사용자를 changepassword.php로 안내)이 시작됩니다.
내가 겪고있는 문제는 기본 세션이 어떻게 작동하는지 또는 어떻게 설정해야하는지에 대해 머리를 감쌀 수 없다는 것입니다. 아래 두 개의 PHP 소스 파일 (user.class.php
및 logincheck.php
)의 부품을 변경해야한다는 것을 알고 있습니다.
나는 어떤 아이디어/도움을 주셔서 감사하겠습니다.
user.class.php
//Check entered login and password. Called From : index.php
function logincheck($dataarray)
{
$email_id = $dataarray['email_id'];
$password = $dataarray['password'];
$query = "select id, email_id, password, phone, user_type, active ";
$query .= "from users ";
$query .= "where email_id= '".$email_id."' and password = '".$password."' ";
$rs = $this->conn->query($query) or die("SQL ERROR ".$this->conn->error); //returns single row
$row = $rs->fetch_array() ;
if((trim($row['email_id']) == $email_id) && (trim($row['password']) == $password))
{
$this->retmsg['error'] = false;
//used to set in session
$this->retmsg['user_id'] = $row['id'] ;
$this->retmsg['email_id'] = $row['email_id'] ;
}
else
{
$this->retmsg['error'] = true;
$this->retmsg['msg'] = 'Invalid Login or Password';
}
return($this->retmsg) ;
}
logincheck.php
//Used to check login user name and password, called from index.php
if($identifier == 'logincheck')
{
$user = new user($appcon) ;
$email_id = trim($data[1]) ;
$password_text = trim($data[2]) ;
$remember = $data[3] ;
//store request variables in local variables
$userarray = array() ;
$userarray['email_id'] = trim($data[1]) ;
$userarray['password'] = trim(md5($data[2])) ;
$userarray['password_text'] = trim($data[2]) ;
$userarray['remember'] = $data[3] ;
$retarr = $user->logincheck($userarray) ;
if(!isset($_SESSION['USER_ID']))
{
$_SESSION['USER_ID'] = $retarr['user_id'] ;
$_SESSION['EMAIL_ID'] = $retarr['email_id'] ;
//$_SESSION['USER_TYPE'] = $retarr['user_type'] ;
//$_SESSION['ACTIVE'] = $retarr['active'] ;
}
if(!isset($_SESSION['REDIRECT_TO']))
$_SESSION['REDIRECT_TO'] = 'subjects.php' ;
$retarr['redirect_to'] = $_SESSION['REDIRECT_TO'];
//if remember me checked set cookie for 100 days
if($remember=='remember'){
setcookie("cookname", $email_id, time()+60*60*24*100, "/");
setcookie("cookpass", $password_text, time()+60*60*24*100, "/");
}
else{
setcookie("cookname", '', time()-60*60*24*100, "/");
setcookie("cookpass", '', time()-60*60*24*100, "/");
}
}
잠깐, 암호가 데이터베이스에 저장되어 있다고 말하는 것입니까? 그건 큰 노 - 아니야. 암호를 암호화해야합니다. bcrypt와 같은 강력한 알고리즘을 사용하는 것이 더 좋을 것입니다. –
아니요, 암호가 암호화되어 있습니다. – ozzysmith
고유 한 해시를 만듭니다. 사용자 테이블에 저장합니다. 전송 한 이메일에 예를 들어 링크가 포함되어 있습니다. 'new_password.php? h ='그리고 URL에 제공된 해시를 사용하여 어떤 사용자가 자신의 비밀번호를 재설정하려하는지 알 수 있습니다. –
DarkBee