2010-09-22 8 views
6

tôi đang sử dụng các kỹ thuật sau đây ...PHP - làm phiên hết hạn sau phút X

Từ login.php Các bài mẫu cho trang check.php nơi tôi làm điều này

<?php  
$uzer = $_POST['user_name']; 
$pass = $_POST['user_pass']; 

require ('DB_connection.php'); 

$result = mysql_query("SELECT * FROM accounts WHERE user_Name='$uzer' AND user_Pass='$pass'"); 

if(mysql_num_rows($result) > 0) 
{ 
    $array = mysql_fetch_assoc($result);  

    session_start(); 
    $_SESSION['user_id'] = $uzer; 
    header("Location:loggedin.php");    
} 
else 
{ 
    header("Location:login.php"); 
} 
?> 

và trên loggedin.php trang điều đầu tiên tôi làm là

<?php 
session_start(); 
if(!isset($_SESSION['user_id'])) 
{ 
    header("Location:login.php"); 
} 
else 
{ 
    echo ("this session is ". $_SESSION['user_id']); 
    //show rest of the page and all 
} 
?> 

nhưng sau khi đăng nhập khi tôi trực tiếp nhập url localhost\myProject\loggedin.php nó sẽ hiển thị trang ... mà làm cho cảm giác hoàn hảo bởi vì phiên đã bắt đầu

những gì tôi muốn thực hiện là

  • URL \ phiên trực tiếp làm việc trong 10 phút sau đó phiên chấm dứt \ hết hạn \ timed out và sau đó sử dụng phải đăng nhập một lần nữa và có thể nhận được cùng một id phiên nhưng sau 10 phút sử dụng sẽ không thể để duyệt với cùng một phiên

GÌ tÔI cÓ CẦN làm hoặc tìm hiểu

+1

Xem [Làm cách nào để hết hạn một phiên PHP sau 30 phút?] (Http://stackoverflow.com/questions/520237/how-do-i-expire-a-php-session-after-30-minutes) – Gumbo

+0

Tôi biết đây là một câu hỏi rất cũ, nhưng đây là một kết quả hàng đầu cho một số tìm kiếm phiên trong Google. Bất cứ ai đọc điều này nên lưu ý rằng mã trong câu hỏi là cực kỳ không an toàn và dễ bị SQL injection. Chúng tôi sẽ không muốn bất kỳ người mới bắt đầu Googling để nhận những thói quen xấu. :-) Câu hỏi này về SO sẽ giúp bạn nếu bạn muốn tìm hiểu thêm: http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php –

Trả lời

10

cửa hàng một dấu thời gian trong phiên:

<?php  
$uzer = $_POST['user_name']; 
$pass = $_POST['user_pass']; 

require ('DB_connection.php'); 

// Hey, always escape input if necessary! 
$result = mysql_query(sprintf("SELECT * FROM accounts WHERE user_Name='%s' AND user_Pass='%s'", mysql_real_escape_string($uzer), mysql_real_escape_string($pass)); 

if(mysql_num_rows($result) > 0) 
{ 
    $array = mysql_fetch_assoc($result);  

    session_start(); 
    $_SESSION['user_id'] = $uzer; 
    $_SESSION['login_time'] = time(); 
    header("Location:loggedin.php");    
} 
else 
{ 
    header("Location:login.php"); 
} 
?> 

Kiểm tra nếu thời gian có được trong cửa sổ thời gian cho phép (600 giây là 10 phút):

<?php 
session_start(); 
if(!isset($_SESSION['user_id']) || time() - $_SESSION['login_time'] > 600) 
{ 
    header("Location:login.php"); 
} 
else 
{ 
    // uncomment the next line to refresh the session, so it will expire after ten minutes of inactivity, and not 10 minutes after login 
    //$_SESSION['login_time'] = time(); 
    echo ("this session is ". $_SESSION['user_id']); 
    //show rest of the page and all 
} 
?> 
+0

chỉ là có '>' thay thế '<' – Moon

+1

Đã sửa. Để tránh việc sửa lỗi phiên, bạn có thể muốn thêm 'session_regenerate_id (false); session_destroy(); session_start();' sau session_start(); – Lekensteyn

+0

Đây có phải là 10 phút không hoạt động hoặc chỉ 10 phút? Tôi đang cố gắng sử dụng điều này để làm cho họ đăng xuất nếu họ không hoạt động trong 30 phút, nhưng tôi không biết làm thế nào để ... – Nathan

1

tôi sẽ xem xét session_set_cookie_paramsini_set("session.gc_maxlifetime", "18000");

+0

'gc_maxlifetime' là bộ thu gom rác và không liên quan gì đến thời gian thực tế của phiên. Chỉ khi nó được chuyển vào thùng rác. Tuy nhiên, 'session_set_cookie_params' là đúng. –

+0

Tôi biết đây là một bài đăng rất cũ, nhưng tôi đã nhấp vào liên kết của bạn hôm nay vào ngày 1 tháng 4 và quay vòng. ouch – Marriott81