2012-05-12 5 views
8

Tôi hiện đang có mã sau cho MỌI trang trên trang web của tôi. Xin vui lòng bất cứ ai có thể xác nhận nếu đây là một thực hành tốt để bắt đầu và tiếp tục một phiên PHP?Phiên PHP nhanh và hiệu quả

//************************************************************ 
//Session Settings 
//************************************************************ 

$session_name = 'PHPSESSID'; 
$session_exp_time = 10000; 

$previous_name = session_name($session_name); 

//Set garbage collection parameters 
ini_set('session.gc_maxlifetime', $session_exp_time); 
ini_set('session.gc_probability', '1'); 
ini_set('session.gc_divisor', '100'); 

ini_set('session.name', $session_name); 
ini_set('session.cookie_domain', ''); //Session set to not be available to subdomains 
ini_set('session.cookie_lifetime', 0); 

//Set the session cookie parameters 
session_set_cookie_params($session_exp_time, '/', ''); 

//Start or continue a session... 
@session_start(); 

if (isset($_COOKIE[$session_name])) 
setcookie($session_name, $_COOKIE[$session_name], 2147483647, ''); 

Xin lưu ý rằng kịch bản này được bao gồm trong trang EVERY.

Một câu hỏi khác có liên quan:

Tôi có nên đặt đường dẫn lưu phiên tùy chỉnh hay tôi chỉ sử dụng đường dẫn lưu phiên mặc định của máy chủ? Những ưu và khuyết điểm là gì? Từ những gì tôi hiểu, nếu bạn không đặt một phiên lưu tùy chỉnh đường dẫn, sau đó rất có thể là bạn có thể có một số loại xung đột trên một lưu trữ được chia sẻ? Xin hãy giúp khai sáng.

Cảm ơn trước!

+1

Bạn có quyền truy cập vào php.ini của máy chủ không? Hay nó hỗ trợ các tập tin .htaccess? Nếu vậy, nhiều người trong số những mục nhập ini có thể đi. –

+1

Bạn cũng có thể đẩy nó vào một tệp php được bao gồm để bạn chỉ bao gồm tệp mỗi lần không phải tất cả mã mỗi lần. Trừ khi bạn đã làm điều đó. Và giống như @Jack nói php.ini hoặc htaccess là những nơi khác bạn có thể thêm mã đó. Tuy nhiên nếu bạn chỉ cần đẩy nó vào tập tin php riêng của nó và bao gồm nó một lần cho mỗi trang đó là thực hành tốt quá theo cách bạn thực hiện 1 thay đổi trong 1 tập tin và nó sẽ tự động cập nhật ở khắp mọi nơi tập tin được tham chiếu. – Danny

Trả lời

5

Nhiều câu lệnh của bạn liên quan đến cài đặt cấu hình phiên; chúng thường có thể được di chuyển trong php.ini hoặc một mức cao nhất .htaccess (Apache) của máy chủ.

session.name = PHPSESSID 
session.gc_maxlifetime = 10000 

session.gc_probability = 1 
session.gc_divisor = 1000 

session.cookie_domain = 
session.cookie_path =/
session.cookie_httponly = 1 
session.cookie_lifetime = 0 

Bạn không nên thực hiện phiên cuối cùng miễn là bạn làm (hết hạn vào năm 2038); các phiên thường được duy trì với cookie phiên (kéo dài cho đến khi trình duyệt bị đóng, về mặt kỹ thuật). Nếu bạn muốn triển khai tính năng "nhớ tôi", tôi khuyên bạn nên thêm tính năng đó vào đầu phiên của mình, như được giải thích tại đây: http://jaspan.com/improved_persistent_login_cookie_best_practice

Tôi thấy cần phân biệt giữa bắt đầu phiên mới và tiếp tục phiên hiện tại, đặc biệt là trong trường hợp phiên chỉ được tạo như một phần của quá trình đăng nhập. Khi không thể tiếp tục một phiên, đã xảy ra sự cố và người dùng phải được chuyển hướng trở lại trang đăng nhập (hoặc trang chủ).

PHP không hiểu sự khác biệt đó, session_start sẽ tự động tạo phiên nếu nó không có ở đó và tệ hơn nếu ID phiên tùy ý được cung cấp; sau này cho phép các cuộc tấn công thông qua phiên như được nêu ở đây: http://gihyo.jp/dev/serial/01/php-security/0025 - bằng tiếng Nhật, bạn sẽ phải dịch nó bằng trình duyệt của mình.

Để tìm hiểu xem một phiên có thể được tiếp tục hay không, bạn cần phải thực hiện mọi phiên mới bằng cách thêm khóa đặc biệt (ví dụ: $_SESSION['_id'] = session_id()). Nếu khóa đó được tìm thấy, phiên đã tồn tại và bạn có thể tiếp tục nó; nếu không, phiên không tồn tại hoặc ai đó đang cố gắng cấp cho bạn ID sai.

Để bắt đầu phiên mới, trước tiên bạn hãy xem liệu phiên có thể tiếp tục hay không; nếu không, bạn sử dụng session_regenerate_id(true) để thay đổi ID phiên (điều này khiến cho kẻ tấn công khó khăn hơn trong việc chiếm đoạt phiên).

Cuối cùng, đường dẫn lưu phiên trên máy chủ chia sẻ có thể được ghi trong thư mục chính của riêng bạn, nhưng điều này chỉ có ý nghĩa nếu máy chủ chia sẻ của bạn chạy với người dùng chuyên dụng trên mỗi máy chủ ảo (ví dụ: suexec). Nếu không, để bảo vệ phiên của bạn khỏi các cuộc tấn công rình mò, bạn sẽ phải mã hóa dữ liệu phiên (và có thể cả các khóa). Kiểm tra phần mở rộng mcrypt: http://sg.php.net/mcrypt - bạn sẽ có thể tìm thấy các ví dụ trực tuyến.

Tôi hy vọng điều này ít nhiều sẽ trả lời câu hỏi của bạn. Hãy cho tôi biết nếu bạn nghĩ rằng bất cứ điều gì không ổn.

+0

Cảm ơn bạn đã dành thời gian giúp đỡ, Jack. Đánh giá cao rất nhiều. Tôi gặp khó khăn khi biết liệu phiên có thể được tiếp tục hay không. Tôi đã thử sử dụng: if (session_id() == '') để xem phiên đã bắt đầu chưa, nhưng nó luôn trả về TRUE, mặc dù phiên đã bắt đầu? –

+0

Bạn luôn có thể gọi session_start(), sau đó kiểm tra khóa trong phiên đó như được mô tả, tức là isset ($ _ SESSION ['_ started']) –