내 사용자 인증 프로세스가 그렇게 보입니다.고유 토큰으로 보안 로그인
서명 프로세스 중에는 다음 코드가 실행됩니다.
$token = sha1(microtime(true) . mt_rand(10000, 90000));
setcookie('auth', $token, $timeout);
그러면 사용자 ID 열 바로 뒤에 데이터베이스 테이블에 token
이 추가됩니다. BTW, $_SESSION
및 $_COOKIE
에만 $token
값을 저장합니다.
protect
라는 이름의 또 다른 기능이있다
:
- 를 먼저 확인의 DB 테이블에
$token
위해이 토큰에는 사용자가없는 경우는, 로그 아웃 - 그런 다음
$_SERVER['HTTP_USER_AGENT']
,$_SERVER['REMOTE_ADDR']
과 db 테이블에 저장된 값을 확인하십시오.
질문
내가 공격자가 동일한 PC와 같은 브라우저를 사용하는 경우, 단순히 "복사 - 붙여 넣기"쿠키에 의해 접근 할 수 있기 때문에이, 안전한 방법이 아니라고 생각합니다. 또한 $ _SERVER [ 'REMOTE_ADDR']은 항상 작동하지 않습니다.
어떻게하면 더 안전하게 로그인 할 수 있습니까? 여기
자세한
기능이
public function protect() {
if (!isset($_SESSION)) {
session_start();
}
$data = array();
if (isset($_SESSION['auth'])) {
$stmt = $this->db->prepare("SELECT l.browser, l.ip, u.ban from log AS l, users AS u WHERE l.token =? AND u.id=l.user_id LIMIT 1") or die($this->db->error);
$stmt->bind_param("i", $_SESSION['auth']) or die($stmt->error);
$stmt->execute() or die($stmt->error);
$stmt->store_result();
if ($stmt->num_rows == 0) {
$this->signout();
}
$stmt->bind_result($data['browser'], $data['ip'], $data['ban']);
$stmt->fetch() or die($stmt->error);
$stmt->close() or die($stmt->error);
$this->validation->check("protection", $data);
} else {
if (!isset($_COOKIE['auth'])) {
header('Location:' . wsurl);
}
$stmt = $this->db->prepare("SELECT l.browser, l.timeout, l.ip, u.ban from log AS l, users AS u where l.token =? AND u.id=l.user_id LIMIT 1") or die($this->db->error);
$stmt->bind_param("s", $_COOKIE['auth']) or die($stmt->error);
$stmt->execute() or die($stmt->error);
$stmt->store_result();
if ($stmt->num_rows == 0) {
$this->signout();
}
$stmt->bind_result($data['browser'], $data['timeout'], $data['ip'], $data['ban']) or die($stmt->error);
$stmt->fetch() or die($stmt->error);
$this->validation->check("protection", $data);
session_regenerate_id();
$_SESSION['auth'] = $_COOKIE['auth'];
$stmt->close() or die($stmt->error);
}
}
을 보호되고 검증 훨씬 당신이 할 수있는 응용 프로그램의 가용성에 영향을주지 않고이 아니라이
if ($data['browser'] != md5($_SERVER['HTTP_USER_AGENT'])) {
$this->registration->signout();
}
if ($data['ban'] == 1) {
$this->registration->signout(false);
header('Location:' . wsurl . "?page=msg&id=34");
}
if ($data['ip'] != $this->common->getIP("long")) {
$this->registration->signout();
}
if (isset($data['timeout']) && !empty($data['timeout'])) {
if (($data['timeout'] - $this->common->getTime()) < 0) {
$this->registration->signout();
}
}
해결책은 조용하게 보입니다. '$ _SERVER [ 'HTTP_USER_AGENT']'와'$ _SERVER [ 'REMOTE_ADDR']'도 데이터베이스에 저장할 수 있습니다. 나중에이 값을 쿠키에 저장된 값 대신 실제 값과 대조하여 확인할 수 있습니다. – SecStone
@SecStone 그래서 쿠키에 토큰 만 저장해야하고 다른 모든 매개 변수는 db로 저장해야합니다. –
정확히,이 값들은 쉽게 조작 될 수 있기 때문입니다. 그러나 더 많은 보안을 원한다면 유일한 해결책은 SSL을 사용하여 트래픽 캡처를 피하는 것입니다 (예 : 공용 WiFi 네트워크에서 서핑을하고 누군가가 요청할 때마다 전송되는 쿠키를 복사하는 경우). – SecStone