Skorzystałem za artykułu na stronie i na początku w.w skryptu dodałem
<?php
$regenerateReq = 10;
if(isset($_SESSION['req'])){ $_SESSION['req']++;
}
else{
$_SESSION['req']=1;
}
if($_SESSION['req']>$regenerateReq){
$_SESSION['req']=1;
}
?>
Chyba session fixtation mamy już z głowy
Cały skrypt wygląda teraz tak:
<?php
$NowTime = time(); #obecny czas $SessTime = 3600; #czas trwania sesji
$LoggedTime = 300; #czas trwania sesji podczas bezczynności
$regenerateReq = 10; #ilość rządań po której zostanie zregenerowany identyfikator sesji
if(isset($_SESSION['req'])){ $_SESSION['req']++;
}
else{
$_SESSION['req']=1;
}
if($_SESSION['req']>$regenerateReq){
$_SESSION['req']=1;
}
$login_form = "<form action=\"login.php?a=login\" method=POST>
Login:<input type=text name=login>
Hasło:<input type=password name=password>
<input type=submit value=\"zaloguj\">
</form>";
#sprawdza czy jest zarejestrowana sesja
function check_session(){
if(isset($_SESSION['logged'])){ return true;
}
else{
return false;
}
}
#sprawdza dane z formularza
function check_form(){
if(isset($_POST['login']) and
isset($_POST['password'])){ return true;
}
else{
return false;
}
}
}
#zakańcza sesję
function end_session(){
if(check_session()){
unset($_SESSION['logged']); unset($_SESSION['last_refresh']); unset($_SESSION['session_start']); unset($_SESSION['user_login']); }
}
#kontynuacja sesji
function continue_session(){
#sprawdza czy nie upłynął czas trwania sesji, lub czy sesja jest zbyt długo bezczynna
if(isset($_SESSION['last_refresh'])){ if(($_SESSION['last_refresh']+$LoggedTime < $NowTime) or ($_SESSION['session_start']+$SessTime < $NowTime)){
return false;
}
else{
$_SESSION['last_refresh']= $NowTime;
}
return true;
}
else{
$_SESSION['last_refresh']= $NowTime;
return true;
}
}
#właściwa funckja zarządzania sesjami
function session(){
if(check_session()){
if(continue_session()){
echo "Zalogowany jako:<b> ".$_SESSION['user_login']."</b> <a href=login.php?a=logout>wyloguj</a>"; return true;
}
else{
end_session();
}
}
else{
if(check_form()){
$_SESSION['logged']=1;
$_SESSION['session_start'] = $NowTime;
$_SESSION['user_login'] = $_POST['login'];
}
}
}
if(isset($_GET['a'])=="logout"){ end_session();
}
session();
?>
Jakie mamy zabezpieczenia?
- regeneracja identyfikatora sesji po 10 rządaniach
- zakończenie sesji po 30 minutach
+ jeśli można to uznać za zabezpieczenie
- zakończenie sesji po 5 minutach bezczynności