먼저 사용자에 대해 이미 알고있는 내용을 알아야합니다. 분명히 사용자 이름과 이전 암호가 있습니다. 또 무엇을 알고 있습니까? 이메일 주소가 있습니까? 사용자가 좋아하는 꽃에 대한 데이터가 있습니까?
사용자 이름, 암호 및 작업 이메일 주소가 있다고 가정하면 사용자 테이블에 두 개의 필드를 추가해야합니다 (데이터베이스 테이블 인 경우) : new_passwd_expire라는 날짜와 new_passwd_id 문자열.
사용자의 이메일 주소가 있다고 가정하고 누군가 비밀번호 재설정을 요청하면 다음과 같이 사용자 테이블을 업데이트합니다.
new_passwd_expire = now() + some number of days
new_passwd_id = some random string of characters (see below)
다음으로 해당 주소로 사용자에게 이메일을 보냅니다.
친애하는 사람들
누군가 <웹 사이트 이름>에서 사용자 계정 <사용자 이름>에 대한 새 암호를 요청했습니다. 이 비밀번호 재설정을 요청한 경우 다음 링크를 따르십시오.
http://example.com/yourscript.lang?update=<new_password_id >
해당 링크가 작동하지 않으면 http://example.com/yourscript.lang으로 이동 하여 양식에 다음을 입력하십시오. <new_password_id>
비밀번호 재설정을 요청하지 않으 셨다면이 이메일을 무시 하셔도됩니다.
고마워 야다 야다
이제 yourscript.lang 코딩 :이 스크립트에는 양식이 필요합니다. var 업데이트가 URL에 전달 된 경우 양식은 사용자의 사용자 이름과 이메일 주소 만 묻습니다. 업데이트가 통과되지 않으면 사용자 이름, 이메일 주소 및 이메일로 전송 된 ID 코드를 요청합니다. 또한 새 비밀번호를 요청합니다 (물론 두 번).
사용자의 새 비밀번호를 확인하려면 사용자 이름, 이메일 주소 및 ID 코드가 모두 일치하는지, 요청이 만료되지 않았는지, 두 개의 새 비밀번호가 일치하는지 확인합니다. 성공하면 사용자의 암호를 새 암호로 변경하고 사용자 테이블에서 암호 재설정 필드를 지 웁니다. 또한 사용자를 로그 아웃하거나 로그인 관련 쿠키를 지우고 사용자를 로그인 페이지로 리디렉션하십시오.
기본적으로 new_passwd_id 필드는 비밀번호 재설정 페이지에서만 작동하는 비밀번호입니다.
한 가지 잠재적 개선 사항 : 이메일에서 <username>을 제거 할 수 있습니다. "누군가가이 이메일 주소로 계정에 대한 비밀번호 재설정을 요청했습니다 ..."따라서 이메일이 도청 된 경우 사용자 만 아는 사용자 이름이됩니다. 누군가가 계정을 공격하는 경우 이미 사용자 이름을 알고 있기 때문에 그렇게 시작하지 않았습니다. 이렇게 추가 된 모호성은 악의적 인 누군가가 이메일을 가로채는 경우 중간자 (man-in-the-middle) 기회 공격을 차단합니다.
귀하의 질문 :
무작위 문자열 생성 : 매우 무작위 일 필요는 없습니다. 모든 GUID 생성기 또는 md5 (concat (salt, current_timestamp ()))이면 충분합니다. 여기서 salt는 타임 스탬프 계정이 생성 된 것과 같은 사용자 레코드에있는 것입니다. 사용자가 볼 수없는 것이어야합니다.
타이머 : 예, 데이터베이스를 정상 상태로 유지하려면이 기능이 필요합니다. 일주일 이상은 필요하지 않지만 이메일 지연이 얼마나 오래 지속 될지 모르기 때문에 최소 2 일은 필요합니다.
IP 주소 : 이메일이 며칠 지연 될 수 있으므로 IP 주소는 유효성 검사가 아닌 로깅에만 유용합니다. 기록하고 싶다면 그렇게하세요. 그렇지 않으면 필요하지 않습니다.
화면 재설정 : 위를 참조하십시오.
그것이 그것을 덮기를 바랍니다. 행운을 빕니다.