짧은
로그인 시스템에서 작동하고 Remember Me 기능을 구현하려고합니다.PHP의 "Remember me"기능을 올바르게 사용하는 방법
최근에 나는 기사, 게시물, 이야기, 소설, 동화 등을 읽으며 (이 중 일부는 1 줄의 코드도 포함되어 있지 않으므로 너무 많이 부르기 때문에)이 주제에 대한 연구를 수행했습니다. 등 고정, 납치 ... 같은 쿠키 취약점에 대한
은 그리고 (bruteforce 공격을 방지하기 위해) 및 시도 을 계산 제한 로그인 시도 사이의 시간 지연을 설정하려면 다음과 같은 목표
- 을 달성하기로 결정
- 거의 모든 작업에서 세션 ID를 다시 생성하려면
그러나 나는 내 주요 문제에 대해 정말로 혼란 스럽다. "기억하는"기능을 위해 어떤 방법이 적절합니까? 쿠키/세션/데이터베이스를 사용 하시겠습니까?
그리고 코드에 대한 당신의 생각을 설명해주십시오.
은 자세한
는 현재, 내 코드는 동안 그
처럼 보이는 (내가 코드없이 명확하게 이해할 수) 로그인에 내가 사용하고 있습니다 기능을 다음과 같은 모든 중요한을 가져 user_id를 사용하여 user_id
확인, 보안 사용자 페이지에
protected function validateUser($userid, $ckey=0, $rememmber=0) {
session_start();
session_regenerate_id(true); //this is a security measure
$_SESSION['user_id'] = $userid;
$_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']);
if (isset($remember) && $rememmber == 'on') {
setcookie("user_id", $_SESSION['user_id'], time() + 60 * 60 * 24 * COOKIE_TIME_OUT, "/");
setcookie("user_key", sha1($ckey), time() + 60 * 60 * 24 * COOKIE_TIME_OUT, "/");
}
return true;
}
그리고 쿠키와 세션을 설정합니다 당신이 코드는 "나를 기억"기능의 예를 원하는 경우
public function protect() {
session_start();
/* Secure against Session Hijacking by checking user agent */
if (isset($_SESSION['HTTP_USER_AGENT'])) {
if ($_SESSION['HTTP_USER_AGENT'] != md5($_SERVER['HTTP_USER_AGENT'])) {
$this->signout();
exit;
}
}
// before we allow sessions, we need to check authentication key - ckey and ctime stored in database
/* If session not set, check for cookies set by Remember me */
if (!isset($_SESSION['user_id'])) {
if (isset($_COOKIE['user_id']) && isset($_COOKIE['user_key'])) {
/* we double check cookie expiry time against stored in database */
$cookie_user_id = $_COOKIE['user_id'];
$stmt = $this->db->prepare("select `ckey`,`ctime` from `users` where `id` =?") or die($this->db->error);
$stmt->bind_param("i", $cookie_user_id) or die(htmlspecialchars($stmt->error));
$stmt->execute() or die(htmlspecialchars($stmt->error));
$stmt->bind_result($ckey, $ctime) or die($stmt->error);
$stmt->close() or die(htmlspecialchars($stmt->error));
// coookie expiry
if ((time() - $ctime) > 60 * 60 * 24 * COOKIE_TIME_OUT) {
$this->signout();
}
/* Security check with untrusted cookies - dont trust value stored in cookie.
/* We also do authentication check of the `ckey` stored in cookie matches that stored in database during login */
if (!empty($ckey) && is_numeric($_COOKIE['user_id']) && $_COOKIE['key'] == sha1($ckey)) {
session_regenerate_id(); //against session fixation attacks.
$_SESSION['user_id'] = $_COOKIE['user_id'];
$_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']);
} else {
$this->signout();
}
} else {
if ($page != 'main') {
header('Location:' . wsurl);
exit();
}
}
}
단지 의견 : UX 관점에서 "로그인 상태 유지"또는 "내 신원 기억"이라는 의미인지 사용자에게 알려주는 것이 좋은 지적이라고 생각합니다. – PapaFreud
가능성이있는 복제본 : http://stackoverflow.com/questions/244882/what-is-the-best-way-to-implement-remember-me-for-a-website – ThinkingMonkey
@ThinkingMonkey 좋습니다. :) –