2016-06-12 2 views
-1

클라이언트의 라이브 웹 사이트를 개선하고 있지만 요구 사항을 고수했습니다. 현재 사용자가 암호를 잊어 버리면 암호화 된 암호로 전자 메일을 받게됩니다. 그런 다음 사이트를 통해 로그인 할 수 있습니다. 사용자가 암호 변경 페이지 (changepassword.php)로 이동하지 않는 한 암호는 영구적으로 유지됩니다.기본 페이지로 새 세션을 설정하는 방법

클라이언트가 원하는 것은 기본 회원 페이지 (subjects.php) 대신 암호화 된 비밀번호를 사용하는 경우 사용자가 비밀번호 변경 페이지로 곧바로 이동하도록하는 것입니다.

MYSQL users 테이블의 경우 값 1 또는 NULL 만 보유 할 새로운 열 (temp_password)을 만들었습니다. 잊어 버린 암호 요청을 받으면 열의 값이 1로 업데이트됩니다. 따라서 사용자 이메일과 비밀번호가 temp_password의 값 1과 일치하는 경우에만 새 세션 (사용자를 changepassword.php로 안내)이 시작됩니다.

내가 겪고있는 문제는 기본 세션이 어떻게 작동하는지 또는 어떻게 설정해야하는지에 대해 머리를 감쌀 수 없다는 것입니다. 아래 두 개의 PHP 소스 파일 (user.class.phplogincheck.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, "/"); 
    }  
} 
+0

잠깐, 암호가 데이터베이스에 저장되어 있다고 말하는 것입니까? 그건 큰 노 - 아니야. 암호를 암호화해야합니다. bcrypt와 같은 강력한 알고리즘을 사용하는 것이 더 좋을 것입니다. –

+0

아니요, 암호가 암호화되어 있습니다. – ozzysmith

+0

고유 한 해시를 만듭니다. 사용자 테이블에 저장합니다. 전송 한 이메일에 예를 들어 링크가 포함되어 있습니다. 'new_password.php? h = '그리고 URL에 제공된 해시를 사용하여 어떤 사용자가 자신의 비밀번호를 재설정하려하는지 알 수 있습니다. – DarkBee

답변

0

대신 데이터베이스에 값을 저장 한 후 무대 뒤에서 모든 일을 당신은 임시 비밀번호가 이메일에 비밀번호 페이지를 변경할 수있는 링크를 제공 할 수 있습니다.

데이터베이스에서 암호의 만료 날짜를 제어하십시오. 따라서 데이터베이스에 새로운 필드가없고 새로운 코드가 제한적입니다.

+0

감사합니다. MySQL에서 어떻게 할 수 있습니까? 만료 시간을 설정하려면 password_expired를 시도하고 있지만 작동하지 않습니다. "password_expired = '1', password = '$ reset_password'여기서 email_id = '$ email_id'" – ozzysmith

+0

죄송합니다. 죄송합니다. 사용자 테이블이나 암호 테이블에 필드를 만들거나 데이터베이스에 암호가 저장되어있는 날짜/시간 필드의 계정을 pw_creationDate 및 pw_expirationDate 필드로 지정하십시오. 코드에서 현재 날짜와 만료 날짜를 확인하거나 생성 날짜에 수학을 수행 할 수 있습니다. 예를 들어, 생성 일이 90 일 이상 지난 경우이를 플래그하고 비밀번호/사용자 페이지로 리디렉션하십시오. 또는 이메일을 보내십시오 ... –

관련 문제