feat: 메일 인증 링크 유효시간 설정 추가
This commit is contained in:
1 parent
7b3c2e845b
commit
d111100856
11 files changed
+105
-14
No files matched your search
@@ -2696,6 +2696,54 @@ function get_email_cert_key($mb_id, $mb_datetime)
|
||||
return hash_hmac('sha256', $payload, $key);
|
||||
}
|
||||
|
||||
/**
|
||||
* 발급 시각을 포함한 메일 인증용 일회용 토큰을 생성한다.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function get_email_certify_token()
|
||||
{
|
||||
return get_random_token_string(16) . '.' . G5_SERVER_TIME;
|
||||
}
|
||||
|
||||
/**
|
||||
* 메일 인증 토큰의 일치 여부와 유효시간을 확인한다.
|
||||
*
|
||||
* 발급 시각이 없는 기존 토큰은 회원가입 시각을 기준으로 만료 여부를 확인한다.
|
||||
*
|
||||
* @param string $token
|
||||
* @param string $stored_token
|
||||
* @param string $mb_datetime
|
||||
* @param int $valid_minutes
|
||||
* @param int|null $now
|
||||
* @return bool
|
||||
*/
|
||||
function is_valid_email_certify_token($token, $stored_token, $mb_datetime, $valid_minutes, $now = null)
|
||||
{
|
||||
if (!$token || !$stored_token || !hash_equals((string) $stored_token, (string) $token)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$valid_minutes = (int) $valid_minutes;
|
||||
if ($valid_minutes < 1) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (preg_match('/\.([0-9]{10})$/', $stored_token, $matches)) {
|
||||
$issued_at = (int) $matches[1];
|
||||
} else {
|
||||
$issued_at = strtotime($mb_datetime);
|
||||
}
|
||||
|
||||
if (!$issued_at) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$now = $now === null ? G5_SERVER_TIME : (int) $now;
|
||||
|
||||
return $issued_at + ($valid_minutes * 60) >= $now;
|
||||
}
|
||||
|
||||
/**
|
||||
* CSRF 방지용 Origin/Referer 검증 (OWASP 권장 패턴).
|
||||
*
|
||||
|
||||
Reference in new issue
Block a user