2011-12-15 64 views
6

Tôi thiết lập phiên bản thử nghiệm của trang web được mã hóa bằng PHP sử dụng phiên để xử lý thông tin đăng nhập của người dùng. Trên máy chủ thử nghiệm, phiên sẽ hết hạn khi đóng trình duyệt, vì sao chép tất cả mọi thứ sang máy chủ "sạch", phiên sẽ vẫn ở đúng vị trí trên trình duyệt và người dùng vẫn đăng nhập ngay cả vào ngày hôm sau sau khi khởi động lại toàn bộ hệ thống.Tại sao phiên không hết hạn khi trình duyệt đóng khi session.cookie_lifetime = 0?

Trong php.ini

; Lifetime in seconds of cookie or, if 0, until browser is restarted. 
; http://www.php.net/manual/en/session.configuration.php#ini.session.cookie-lifetime 
session.cookie_lifetime = 0

nào ngụ ý rằng nó nên hết hạn vào trình duyệt khởi động lại.

Tôi nghĩ có lẽ nó đã bị ghi đè ở đâu đó, nhưng nếu tôi print_r các session_get_cookie_params trong PHP tôi nhận được

Array 
(
    [lifetime] => 0 
    [path] =>/
    [domain] => 
    [secure] => 
    [httponly] => 
) 

Có điều gì tôi đang thiếu?

+0

bạn đã thử nó trên các trình duyệt khác? Bạn đang dùng trình duyệt nào? Giá trị hết hạn có thể được gửi đến trình duyệt, nhưng trình duyệt có thể từ chối xóa cookie khi đóng. Kiểm tra cài đặt trình duyệt của bạn và kiểm tra trên các trình duyệt khác. – mauris

+0

Cũng tương tự như vậy trong Firefox và IE. Chắc chắn nếu nó là một vấn đề trình duyệt, tương tự sẽ xảy ra trên máy chủ thử nghiệm như là trực tiếp. Các hành vi không xảy ra trên các trang web khác (mà tôi đã nhận thấy anyway) –

+0

Hơn nữa, nó đã được nhận thấy bởi khách hàng trang web được xây dựng cho và anh ta không muốn nó xảy ra! –

Trả lời

3

Tôi sẽ thêm điều này làm nhận xét về câu trả lời tuyệt vời của Alexander, nhưng câu trả lời sẽ có một chút tiết lộ.

Cookie được giữ lại trên trình duyệt trong bao lâu và dữ liệu phiên được giữ lại bởi máy chủ khi không có yêu cầu là 2 điều riêng biệt và độc lập. Không có cách nào để tránh điều này do tính chất không quốc tịch của HTTP - mặc dù có một số điều bạn có thể làm để giảm thiểu những gì bạn nhận thấy là một lỗ hổng bảo mật.

Để trình duyệt truy cập vào cùng một phiên sau khi bị đóng cửa và một số trì hoãn yêu cầu cả cookie phiên được giữ lại bởi trình duyệt (mà Alexander đã giải thích) để máy chủ lưu giữ dữ liệu phiên .

Hành vi bạn mô tả có thể rõ rệt hơn trên các hệ thống xử lý một lượng yêu cầu thấp và nơi mà trình xử lý phiên không xác minh TTL dữ liệu sesion (tôi không chắc liệu trình xử lý mặc định có thực hiện hay không) chỉ giả định rằng bất kỳ dữ liệu phiên chưa được xóa nào được coi là hiện tại).

Bạn chưa cung cấp bất kỳ chi tiết nào về cách 2 máy chủ được định cấu hình, đáng chú ý là session.gc_maxlifetime. Nếu phiên.gif_maxlifetime đã hết hạn giữa các yêu cầu nhưng dữ liệu phiên vẫn có thể truy cập, điều này ngụ ý rằng trình xử lý phiên chỉ xem đây là thời điểm phiên được coi là đủ điều kiện để thu thập rác (theo ngữ nghĩa, là tùy chọn cấu hình cho). Tuy nhiên, có một trường hợp mạnh để xử lý giá trị này dưới dạng TTL. Để giải quyết vấn đề này, bạn có thể buộc thu gom rác chạy thường xuyên hơn và xóa dữ liệu phiên hoặc sử dụng trình xử lý phiên bỏ qua dữ liệu phiên cũ hơn giới hạn được chỉ định.

Bạn thấy sự khác biệt giữa 2 hệ thống có thể do các giá trị khác nhau cho phiên.gc_maxlifetime hoặc sự khác biệt về tần suất thu thập rác hoặc thậm chí các trình xử lý phiên khác nhau.

+0

Cảm ơn bạn. Rất thông tin. session.gc_maxlifetime = 1440 –

4

Vấn đề ở đây là Firefox có tính năng được gọi là "Khôi phục phiên cuối cùng". Nếu ai đó sử dụng các tab lưu trên đóng thì nó giống nhau. Khi trình duyệt khôi phục phiên cuối cùng thì tất cả cookie phiên sẽ được khôi phục quá :)

Vì vậy, cookie phiên của bạn có thể tồn tại mãi mãi. Bạn có thể đọc thêm tại Firefox session cookies

+0

Điều đó không giải thích tại sao nó chỉ hiển thị hành vi này trên máy chủ trực tiếp chứ không phải máy chủ thử nghiệm hoặc tại sao IE hiển thị cùng một hành vi. Ngoài ra, khi đóng FF tôi không lưu các tab, cũng không phải tôi đang khôi phục phiên cuối cùng. –

+0

Hữu ích để biết dù sao, cảm ơn. Dường như một chút rủi ro bảo mật trong FF tbh. –

+0

Giải pháp tốt hơn để xác thực là sử dụng cookie có thời lượng cố định và "chạm" vào mỗi yêu cầu. – lisachenko

8

Nếu bạn đang sử dụng google chrome

nếu bạn thiết lập "tiếp tục nơi tôi dừng lại", chrome sẽ khôi phục lại dữ liệu duyệt web của bạn và các tập tin cookie phiên.

thậm chí đăng nhập Facebook (không có "nhớ tôi") phiên được giữ lại.

để biết thêm

google chrome setting

Các vấn đề liên quan