2017-01-14 2 views
-1

PHP에서 사용자의 잊어 버린 암호 페이지를 만들려고하지만 코드를 입력하면 페이지가 새로 고침되고 아무 일도 일어나지 않습니다. 오류가 없습니다.PHP는 암호를 잊어 버렸습니다

if($submit){ 
    $email = mysqli_real_escape_string($conn, $_POST["email"]); 
    $submit = $_POST['submit']; 

    $email_check = mysqli_query($conn ,"SELECT * FROM users WHERE email='" . $email. "'"); 
    $count = mysqli_num_rows($email_check); 

    if($count != 0){ 
     // generate a new password 
     $random = rand(72891, 92729); 
     $new_password = $random; 

     $email_password = $new_password; 

     $new_password = password_hash($new_password, PASSWORD_BCRYPT, array('cost' => 14));   

     $new_password = password_hash($new_password); 

     mysqli_query("update users set pw='" . $new_password. "' WHERE email='" . $email. "'"); 

     $subject = "Login information"; 
     $message = "Your password has been changed to $email_password"; 
     $from = "From: example.me"; 

     mail($email, $subject, $message, $from); 
     echo "Your new password has been sent to you"; 
    } else { 
     echo"This email does not exists"; 
    } 
} 
+0

당신은 이중 해싱이고 업데이트를 한 번도 묻지 않았습니다. –

+0

은'$ submit'에 진실 가치가 있습니까? 진실이라고 확신시켜 줬어? –

+0

오류가 없습니다. 왜냐하면 당신이 그들을 확인하지 않았기 때문입니다. 조건 아래의 코드가 실행되면 잘못한 것을 볼 수 있습니다. 많이. –

답변

-1

당신은 $submit을 테스트하지만 너무 $submit 가능성이 참으로 평가되지 않고, 시험의 내부 $submit를 정의하고 있습니다. 외부 if ($submit)

+0

당신은 많은 것을 놓쳤으며이 질문을 해결하지 못할 것입니다. –

0

$submitif (!empty($_POST))에 변화

시도는 if 문의 검증이 끝날 때까지 선언되지 않았습니다.

다른 변수를 사용하여 유효성을 검사하십시오. $_POST가 DB에 저장된 암호를 두 번 해시 된

$message = "Your password has been changed to $email_password"; 

$message = "Your password has been changed to {$email_password}"; 

에 암호 변경에게 이메일을 보내려면
if ($_SERVER['REQUEST_METHOD'] == 'POST') 

를 제출하면 시작하는 좋은 장소를 확인하고보고하는 것입니다 .

$new_password = password_hash($new_password); 

는 SQL 데이터베이스에 암호 해시를 업데이트 실행해야을 제거합니다.

$sql = "update users set pw='" . $new_password. "' WHERE email='" . $email. "'"; 
if (mysqli_query($conn, $sql)) { 
    echo "Password updated successfully"; 
} else { 
    echo "Error updating record: " . mysqli_error($conn); 
} 

mysqli_close($conn); 
+0

당신은 또한 물건을 많이 놓친 –

+0

@ 프레드 - 제발 정교한주세요? 왜 오류가 없는지 질문하지 않습니까? – nrm

+0

아주 깊은 토끼 구멍에 빠졌습니다. 그들의 코드를 다시주의 깊게 살펴보십시오. 그런 다음 질문에 남긴 의견을 살펴보십시오. 당신이 말할 수 있듯이, 나는 이것 때문에 대답을 게시하지 않았다. 내 뜻을 알 수있을거야. –

2

여기에 코드로 어떤 일이 벌어지고 있는지 정확히 알려 드리겠습니다.

파트 1 :

if($submit){ 
    $email = mysqli_real_escape_string($conn, $_POST["email"]); 
    $submit = $_POST['submit']; 
  • $submit = $_POST['submit'];은 당신의 개방 if($submit) 후 할당됩니다.
  • 결과가 error reporting 인 경우 : 변수가 정의되지 않았습니다.

2 부 :

$new_password = password_hash($new_password, PASSWORD_BCRYPT, array('cost' => 14));   
$new_password = password_hash($new_password); 

당신은 당신에게 추가 혜택을 제공하지 않습니다 나중에 verify에 시도 때도 실패를 두 번 해시에 노력하고 있습니다. 여기서 일어난 일은 두 번째 것이 실패하고 전혀 사용되지 않아야한다는 것입니다.

왜 실패 했나요? 매개 변수가 누락되었습니다.

  • 결과 :

    경고 : password_hash()에서 예상/패스 /로/파일 주어진 적어도 2 개 개의 파라미터, 1.php on line x

  • 추가 결과 : 빈 암호 행 (UPDATE가 발생하면 "3 부"참조).

제 3 부 :

mysqli_query("update users set pw='" . $new_password. "' WHERE email='" . $email. "'"); 

쿼리가에 대한 데이터베이스 연결을 포함하지 않습니다.

  • 결과 :

    경고 : mysqli_query()는 예상 적어도 2 개 개의 파라미터, 1 X

에 관해서 행 /path/to/file.php 주어진 변수 및 사용 된 연결 API는 알 수 없으므로 동일한 MySQL API를 사용하여 연결하고 변수 및 POST 배열에 값이 포함되어 있는지 확인해야합니다.

오류에 대한 오류 검사와 마찬가지로 오류보고가 도움이 될 것입니다.

참고 :


최종 노트 :

사용하는 대신 준비된 문, 훨씬 더 안전

; 사용자는 고유 한/한 번만 토큰을 사용하여 재설정 할 때 자신의 비밀번호를 선택하게하고 두 번이 아니라 "한 번"해시 할 수있게해야하며 많은 이유로 비밀번호를 발송해서는 안됩니다. 이것은 가장 일반적인 관행입니다. 사용자의 이메일 계정이 손상되어 로그인 비밀번호가 포함 된 이메일을 삭제하지 않은 경우 로그인 계정도 해킹 당할 위험이 있습니다.

관련 문제