Итак, я читаю сессии, и я должен сказать, я смущен. Кажется, что сеансы так же «сломаны», как могут быть соображения безопасности, почему они не внедрили больше проверок безопасности в самом коде сеансов ...Проверка безопасности сеанса PHP
В любом случае, мой вопрос. Я нашел этот веб-сайт с большим количеством проверок безопасности сессии: https://wblinks.com/notes/secure-session-management-tips/ Прочитав это, большинство из них имеют смысл для меня. Тем не менее, большинство сбивает меня с толку - КОГДА тоже называют эти проверки.
Я звоню на эти с каждой страницами? С одной стороны, это имело бы смысл, потому что кто-то мог захватить или что-то другое, сеанс на каждой странице? С другой стороны, это будет стоить дополнительное время, чтобы завершить эту проверку на каждой странице, превысив, возможно, увеличение времени загрузки?
В данный момент у меня есть следующий код.
<?php
if ($_SESSION['_USER_LOOSE_IP'] != long2ip(ip2long($_SERVER['REMOTE_ADDR']) & ip2long("255.255.0.0"))
|| $_SESSION['_USER_AGENT'] != $_SERVER['HTTP_USER_AGENT']
|| $_SESSION['_USER_ACCEPT'] != $_SERVER['HTTP_ACCEPT']
|| $_SESSION['_USER_ACCEPT_ENCODING'] != $_SERVER['HTTP_ACCEPT_ENCODING']
|| $_SESSION['_USER_ACCEPT_LANG'] != $_SERVER['HTTP_ACCEPT_LANGUAGE']
|| $_SESSION['_USER_ACCEPT_CHARSET'] != $_SERVER['HTTP_ACCEPT_CHARSET']
|| !isset($_SESSION['MY_SERVER_GENERATED_THIS_SESSION'])) {
// Destroy and start a new session
sec_session_destroy(); // Destroy session on disk
sec_session_start();
// Log for attention of admin and re-authenticate user...
}
if ($_SESSION['SESSION_START_TIME'] < (strtotime("-1 hour")) || $_SESSION['_USER_LAST_ACTIVITY'] < (strtotime("-20 mins"))) {
sec_session_destroy();
//Expire session and re-authenticate user...
}
function sec_session_start() {
setcookie("sid", // Name
session_id(), // Value
strtotime("+1 hour"), // Expiry
"/", // Path
".serellyn.net", // Domain
true, // HTTPS Only
true); // HTTP Only
// Store these values into the session so I can check on subsequent requests.
$_SESSION['_USER_AGENT'] = $_SERVER['HTTP_USER_AGENT'];
$_SESSION['_USER_ACCEPT'] = $_SERVER['HTTP_ACCEPT'];
$_SESSION['_USER_ACCEPT_ENCODING'] = $_SERVER['HTTP_ACCEPT_ENCODING'];
$_SESSION['_USER_ACCEPT_LANG'] = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
$_SESSION['_USER_ACCEPT_CHARSET'] = $_SERVER['HTTP_ACCEPT_CHARSET'];
$_SESSION['MY_SERVER_GENERATED_THIS_SESSION'] = true;
// Only use the first two blocks of the IP (loose IP check). Use a
// netmask of 255.255.0.0 to get the first two blocks only.
$_SESSION['_USER_LOOSE_IP'] = long2ip(ip2long($_SERVER['REMOTE_ADDR'])
& ip2long("255.255.0.0"));
$_SESSION['SESSION_START_TIME'] = time();
$_SESSION['_USER_LAST_ACTIVITY'] = time();
sec_session_start(); // Start the PHP session
}
function sec_session_destroy() {
session_unset();
session_destroy();
session_start();
session_regenerate_id(true);
}
Мой последний вопрос, делает приведенный выше код имеет смысл или у Вас есть какие-либо предложения, чтобы сделать его лучше или менее запутанной. И следует ли включать это на каждую страницу или всего несколько страниц?
Заранее спасибо
«Кажется, что сеансы так же« сломаны », как могут быть соображения безопасности« да? Это похоже на высказывание: «Кажется, что автомобили« опасны », как может быть безопасным» – PeeHaa
Также обратите внимание, что большая часть вышеперечисленного уже обрабатывается при правильной настройке сеансов и использовании только зашифрованных соединений. – PeeHaa
Также обратите внимание, что проверка ip будет ошибочной на адресах ipv6. – PeeHaa