Không có cách nào để ngăn chặn phiên chiếm quyền điều khiển 100%, nhưng với một số cách tiếp cận, chúng tôi có thể giảm thời gian cho kẻ tấn công chiếm quyền điều khiển phiên.
Phương pháp ngăn chặn chiếm quyền điều khiển phiên:
1 - luôn luôn sử dụng phiên với chứng chỉ ssl;
2 - chỉ gửi cookie phiên với httponly được đặt thành true (ngăn javascript truy cập cookie phiên)
2 - sử dụng id tái tạo phiên khi đăng nhập và đăng xuất (lưu ý: không sử dụng tái tạo phiên theo từng yêu cầu vì nếu bạn có yêu cầu ajax liên tiếp thì bạn có cơ hội tạo nhiều phiên.)
3 - đặt thời gian chờ phiên
4 - lưu trữ tác nhân người dùng trình duyệt trong biến $ _SESSION so sánh với $ _SERVER ['HTTP_USER_AGENT'] tại mỗi yêu cầu
5 - đặt cookie mã thông báo và đặt thời gian hết hạn của cookie đó thành 0 (cho đến khi trình duyệt được đóng). Tạo lại giá trị cookie cho mỗi yêu cầu. (Đối với yêu cầu ajax không tạo lại cookie mã thông báo). VÍ DỤ:
//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');
}
lưu ý: không tạo lại cookie mã thông báo với ghi chú yêu cầu ajax: mã ở trên là một ví dụ. lưu ý: nếu người dùng đăng xuất thì mã thông báo cookie phải bị hủy cũng như phiên
6 - không nên sử dụng ip người dùng để ngăn chặn việc chiếm quyền điều khiển phiên vì một số người dùng thay đổi ip với mỗi yêu cầu. R USNG NGƯỜI SỬ DỤNG CÓ GIÁ TRỊ
7 - cá nhân tôi lưu trữ dữ liệu phiên trong cơ sở dữ liệu, tùy thuộc vào phương pháp bạn áp dụng
Nếu bạn tìm thấy sai lầm trong cách tiếp cận của tôi xin vui lòng sửa chữa cho tôi. Nếu bạn có nhiều cách hơn để ngăn chặn phiên làm việc, xin vui lòng cho tôi biết.