세션 hijaking을 100 % 방지 할 수있는 방법은 없지만 몇 가지 접근 방식을 사용하면 공격자가 세션을 hijaking하는 시간을 줄일 수 있습니다.
세션 hijaking 방지 방법 :
1-항상 SSL 인증서로 세션을 사용합니다.
2-httponly가 true로 설정된 경우에만 세션 쿠키 보내기 (JavaScript가 세션 쿠키에 액세스하지 못하도록 방지)
2-로그인 및 로그 아웃시 세션 재생성 ID 사용 (참고 : 연속적인 ajax 요청이있는 경우 여러 세션을 생성 할 수 있기 때문에 각 요청에서 세션 재생성을 사용하지 마십시오.)
3-세션 시간 제한 설정
4-브라우저 사용자 에이전트를 $ _SESSION 변수에 저장하고 각 요청에서 $ _SERVER [ 'HTTP_USER_AGENT']와 비교합니다.
5-토큰 쿠키를 설정하고 해당 쿠키의 만료 시간을 0으로 설정합니다 (브라우저가 닫힐 때까지). 각 요청에 대해 쿠키 값을 다시 생성합니다 (Ajax 요청의 경우 토큰 쿠키를 다시 생성하지 마십시오). 전의:
//set a token cookie if one not exist
if(!isset($_COOKIE['user_token'])){
//generate a random string for cookie value
$cookie_token = bin2hex(mcrypt_create_iv('16' , MCRYPT_DEV_URANDOM));
//set a session variable with that random string
$_SESSION['user_token'] = $cookie_token;
//set cookie with rand value
setcookie('user_token', $cookie_token , 0 , '/' , 'donategame.com' , true , true);
}
//set a sesison variable with request of www.example.com
if(!isset($_SESSION['request'])){
$_SESSION['request'] = -1;
}
//increment $_SESSION['request'] with 1 for each request at www.example.com
$_SESSION['request']++;
//verify if $_SESSION['user_token'] it's equal with $_COOKIE['user_token'] only for $_SESSION['request'] > 0
if($_SESSION['request'] > 0){
// if it's equal then regenerete value of token cookie if not then destroy_session
if($_SESSION['user_token'] === $_COOKIE['user_token']){
$cookie_token = bin2hex(mcrypt_create_iv('16' , MCRYPT_DEV_URANDOM));
$_SESSION['user_token'] = $cookie_token;
setcookie('user_token', $cookie_token , 0 , '/' , 'donategame.com' , true , true);
}else{
//code for session_destroy
}
}
//prevent session hijaking with browser user agent
if(!isset($_SESSION['user_agent'])){
$_SESSION['user_agent'] = $_SERVER['HTTP_USER_AGENT'];
}
if($_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT']){
die('session hijaking - user agent');
}
참고 : ajax 요청으로 토큰 쿠키를 재생성하지 마십시오. 참고 : 위 코드는 예입니다. 참고 : 사용자가 로그 아웃하면 쿠키 토큰과 세션이 삭제되어야합니다.
6-일부 사용자의 IP는 각 요청에 따라 변경되기 때문에 세션 히잡을 방지하기 위해 사용자 IP를 사용하는 것은 좋은 방법이 아닙니다. 유효한 사용자에게 영향을 미치는
7-개인적으로 세션 데이터를 데이터베이스에 저장합니다. 어떤 방법을 채택할지는 귀하에게 달려 있습니다.
내 접근 방식에서 실수를 발견하면 나를 수정하십시오. 세션 hyjaking을 방지하는 더 많은 방법이 있으면 알려주세요.