2012-10-19 5 views
9

Trước đây tôi đã tạo thêm cookie "rememberme" với băm duy nhất, được lưu trữ trong cơ sở dữ liệu, ánh xạ tới id người dùng.Cách tốt nhất để làm "nhớ tôi" dưới dạng php khi sử dụng phiên gốc là gì?

Nếu người dùng có cookie - trang web cố gắng tìm giá trị của nó trong cơ sở dữ liệu và nếu phiên được tìm thấy đã được thiết lập.

Sau đó, phát triển dự án mới, tôi nghĩ rằng có thể không an toàn để tạo mã băm duy nhất này và giữ hai cookie (bản gốc "PHPSESSID" + "memme") của tôi cho một thao tác (nhận dạng người dùng) quá mức .

Có thể có cách để thiết lập không phải là phiên toàn cầu, nhưng để thiết lập riêng cho phiên người dùng khác nhau ... hoặc có thể tốt hơn để giữ phiên người dùng trong cơ sở dữ liệu, ánh xạ tới userid?

UPDATE 1 Tôi nghĩ nếu nó là như vậy khó có thể làm cho "nhớ đến tôi" nút, chúng ta có thể đi theo con đường khác - để làm cho "Không nút máy tính của tôi". Ý tưởng là đặt cookie_lifetime mặc định cho một tuần trong php.ini (ví dụ) và nếu người dùng chọn hộp kiểm này - chúng tôi sẽ đặt cookie_lifetime thành 0 bằng hàm session_set_cookie_params.

Vì vậy, 1 câu hỏi là - sẽ session_set_cookie_params ảnh hưởng đến người sử dụng cookie khác (trong tài liệu hướng dẫn người ta nói, rằng session_set_cookie_params tùy chọn này sẽ có hiệu lực cho đến khi quá trình php sẽ được thực hiện)

câu hỏi 2d là nếu session_set_cookie_params không ảnh hưởng đến toàn cầu cài đặt, việc tạo phiên có ảnh hưởng đến người dùng không muốn giữ cookie lâu dài không?

UPDATE 2: [Câu hỏi 1 câu trả lời]

Chỉ cần kiểm tra session_set_cookie_params chức năng. Tôi đã viết một kịch bản, mà bộ cookie phiên đời vào không sử dụng session_set_cookie_params và sau đó thực hiện trong 30 giây:

if ($_GET['test']) { 
    session_set_cookie_params (0); 
    while (true) { 
    sleep(1); 
    } 
} 
session_start(); 

Vì vậy, trong trình duyệt đầu tiên tôi chỉ mới bắt đầu kịch bản này với test = 1 tham số, ngay sau đó (? trong khi kịch bản này đã được thực hiện) tôi đã bắt đầu tập lệnh này mà không có tham số trong trình duyệt thứ hai. Câu trả lời là không có cookie thứ hai của trình duyệt không bị ảnh hưởng. Nó có tuổi thọ, mà đã được quy định tại php.ini

UPDATE 3: [Câu hỏi 2 câu trả lời] Sau đó, tôi đã cố gắng để kiểm tra nếu tái sinh ảnh hưởng đến phiên Cookie đời, mà đã được thiết lập bởi session_set_cookie_params.

Có, nó ảnh hưởng. Nếu tôi đặt cookie phiên có thời gian tùy chỉnh, được đặt bởi session_set_cookie_params và sau đó gọi session_regenerate_id(), cookie sẽ có toàn thời gian, được đặt trong php.ini

Nhưng, nếu chúng ta đặt session_set_cookie_params (0) trước khi gọi session_regenerate_id() , cookie của chúng tôi sẽ có tuổi thọ chính xác.

Vì vậy, đó là nó! Điều đó thật dễ dàng! 8)

Cảm ơn bạn, quý bà và quý ông!

+0

tôi don Không hiểu. Thời lượng phiên không ảnh hưởng đến thực tế là người dùng sẽ nhận được PHPSESSID mới khi trình duyệt được khôi phục. Vui lòng giải thích mối lo ngại về bảo mật của bạn. – Teson

+0

Tôi muốn giữ một cookie để nhận dạng người dùng. Tôi không chắc chắn rằng cookie tùy chỉnh "Rememberme" của tôi là an toàn, hơn nữa, tôi không muốn nghĩ về nó - hai cookie cho một thao tác quá dư thừa. – avasin

+0

Cách đơn giản nhất là sử dụng một hoặc hai cookie có giá trị 'SHA1 ($ userid. $ Salt)' và 'username' công khai. – Stan

Trả lời

2

Như nó rất khó để làm cho chức năng "nhớ tôi", tôi đã đến một cách khác, chỉ sử dụng một cookie.

CHUẨN BỊ

1) Tôi đã chuẩn bị một hình thức với ba đầu vào:

  • "login" đầu vào [type = text]: đăng nhập của người dùng
  • "password" đầu vào [loại = mật khẩu]: mật khẩu của người dùng
  • "không phải máy tính của tôi" [type = checkbox]: sẽ cho chúng tôi biết sử dụng cookie phiên với lifetime = 0 (cookie phải bị xóa khi đóng trình duyệt)

2) Tôi đã đặt session.cookie_lifetime = 100500 để giữ cookie lâu dài theo mặc định.

COOKIE SETUP

Vì vậy, sau khi người dùng submit form, chúng tôi kiểm tra - nếu anh ta đã được lựa chọn để sử dụng phiên ngắn - chúng ta gọi là session_set_cookie_params (0) trước khi thiết lập cookie phiên với anh ấy (trước khi thực sự sử dụng session_start ()).

COOKIE tái sinh

Sau đó, khi chúng ta cần phải tái tạo cookie phiên, chúng tôi cũng có thể làm điều này một cách dễ dàng với session_regenerate_id function(). Nhưng chúng ta cần phải nhớ rằng chức năng này sẽ thiết lập lại tuổi thọ cookie phiên từ php.ini theo mặc định. Vì vậy, chúng ta cũng cần gọi session_set_cookie_params() trước khi tạo lại cookie. BTW, Bạn có thể lưu trữ thời lượng cookie phiên tùy chỉnh trong $ _SESSION. Nó sẽ giống như thế này:

// Form handling, session setup 
if ($_POST['not-my-computer']) { 
    session_set_cookie_params(0); 
    session_start(); 
    $_SESSION['expires'] = 0; 
} 

// Session regeneration 
if (isset($_SESSION['expires'])) { 
    session_set_cookie_params(0); 
    session_regenerate_id(); 
} 

Chi tiết cho câu trả lời này (và giải thích sâu hơn), bạn có thể tìm thấy trong văn bản câu hỏi (trong khi tôi đã được thử nghiệm, tôi đã thêm câu trả lời/kiểm tra kết quả có)

2

Nếu bạn muốn làm điều này chỉ sử dụng phiên bạn có thể làm như sau nếu người dùng muốn được nhớ đến:

if((isset($_POST['remember_me']) && $_POST['remember_me']) || ($_COOKIE['remember_me']) && $_COOKIE['remember_me'])) { 

    // store these cookies in an other directory to make sure they don't 
    // get deleted by the garbage collector when starting a "non-remeber-me"-session 
    $remember_me_dir = ini_get('session.save_path') . DS . "remember_me_sessions"; 

    // create the directory if it doesn't exist 
    if (!is_dir($remember_me_dir)) { 
    mkdir($remember_me_dir); 
    } 

    // set the php.ini-directive (temporarily) 
    ini_set('session.save_path', $remember_me_dir); 

    // define lifetime of the cookie on client side 
    $expire_cookie = 60 * 60 * 24 * 30; // in seconds 
    session_set_cookie_params($expire_cookie); 

    // lifetime of the cookie on server side 
    // session file gets deleted after this timespan 
    // add a few seconds to make sure the browser deletes 
    // the cookie first. 
    $garbage_in = $expire_cookie + 600; // in seconds 

    // set the php-ini directive for the garbage collector of the session files. 
    ini_set('session.gc_maxlifetime', $garbage_in);  
    // send an additional cookie to keep track of the users 
    // which checked the 'remember_me' checkbox 
    setcookie('remember_me', 1, time() + $expire_cookie); 
} 

// now we are ready to start the session 
// For all the users which didn't choose to check the 'remember_me' box 
// the default settings in php.ini are used. 
session_start(); 

Here bạn có thể đọc thêm về phiên liên quan php.ini -directives

+0

Hmm .. có thể có cách để thiết lập tất cả cookie phiên trong một tuần chẳng hạn như hộp kiểm "Không phải máy tính của tôi". Nếu hộp kiểm này sẽ được kiểm tra, trước khi đặt cookie phiên, chúng tôi sẽ đặt thời gian cookie phiên bằng session_set_cookie_params thành 0 không? – avasin

+0

Vì vậy, câu hỏi đặt ra là: "Session_set_cookie_params có hiệu ứng toàn cục hay chỉ ảnh hưởng đến việc thực thi tập lệnh hiện tại?" Và vấn đề thứ hai có thể là .. hm .. phiên tái tạo (như tôi hiểu php tái tạo nó bằng cách nào đó) – avasin