2012-06-20 11 views
5

Tôi đã xây dựng một ứng dụng trong CakePHP cho phép người dùng đăng nhập và thực hiện một số nội dung, giúp người dùng đăng nhập trong khoảng 24 giờ theo mặc định. Và điều này được xử lý bởi một phiên/cookie như một cookie cũng được tạo ra ...Làm thế nào để nhớ tôi khác với thời gian chờ phiên

1.) Vì vậy, điều gì sẽ nhớ tôi mang đến cho bên? Như tất cả những gì sẽ làm là tạo ra một cookie KHÁC mà đặt một thời gian chờ và giữ cho người dùng đăng nhập ... Nhưng chức năng này tồn tại trong mỗi ứng dụng duy nhất theo mặc định với phiên phải không? Nhưng tôi đã thấy rất nhiều trang web thực hiện điều này nhưng tôi không hiểu tại sao phiên làm việc này ra khỏi hộp:/

2.) Ngoài ra, các phiên tới sẽ hết hạn ngay cả khi người dùng tiếp tục sử dụng trang web ? ví dụ. nếu tôi đặt nó là 1 phút nhưng làm mới sau mỗi 30 giây, nó sẽ vẫn hết hạn ... nhưng tôi đã giữ trang web hoạt động trước khi nó có thể hết hạn để làm thế nào nó vẫn có thể hết hiệu lực? Điều này gây phiền nhiễu khi tôi hết hạn cho một ứng dụng 1 giờ nhưng ngay cả khi khách hàng đang sử dụng trang web hết hạn sau 1 giờ bất kể hoạt động.

Sẽ tuyệt vời nếu ai đó có thể trả lời 2 câu hỏi này.

CẬP NHẬT: Tôi đã tạo một khoản tiền thưởng về điều này với hy vọng nhận được một chuyên gia CakePHP để giúp khắc phục vấn đề này. Vấn đề là các Phiên hết hạn sau khi hết thời gian chờ REGARDLESS của tương tác người dùng. Những gì tôi muốn làm là nói rằng tôi có một phiên kéo dài 5 phút, và người sử dụng gây ra một postback mỗi 30 giây, sau đó phiên đó vẫn sẽ được khoảng sau 5 phút. Đây không phải là trường hợp tại thời điểm này ...

Configure::write('Session', array(
     'start' => true, 
     'defaults' => 'php', 
     'timeout' => 1, 
     'cookieTimeout' => 1, 
     'autoRegenerate' => true 
    )); 
+1

Bạn có thể đưa cấu hình phiên của mình không? Có rất nhiều thứ có thể xảy ra ở đây, và đó là một điểm khởi đầu tốt. –

+0

Đã thêm cấu hình và đặt thời gian ở mức rất thấp để tôi có thể kiểm tra lý thuyết! – Cameron

+0

Một khi bạn hiểu được sự khác biệt lưu ý rằng Zend Framework sử dụng cookie phiên để thực hiện ghi nhớ tôi - dường như họ cần phải điều chỉnh thành các chủ đề như thế này! – quickshiftin

Trả lời

8
  1. gì nó sẽ mang lại là nếu người dùng đóng trình duyệt và khởi động lại nó, nó vẫn sẽ đăng nhập tự động. Đây không phải là trường hợp với cookie phiên, vì cookie như vậy sẽ bị xóa ngay khi trình duyệt bị đóng.

  2. Có thể trang bạn đã truy cập 30 giây một lần không bắt đầu phiên. Trong trường hợp đó, cơ chế phiên không được sử dụng và ngày hết hạn của phiên không được đặt lại thành now + 1 minute. Hoặc có thể làm mới chỉ truy cập bộ nhớ cache của trình duyệt chứ không phải máy chủ.

+0

1.) Khi bạn nói đóng trình duyệt, bạn có nghĩa là thực sự thoát khỏi ứng dụng khi tôi đóng cửa sổ và sau đó truy cập lại trang web tôi vẫn đăng nhập.) Làm thế nào để sửa lỗi này? Tôi đang sử dụng CakePHP và miễn là người dùng đang sử dụng trang web, ví dụ: tải một trang, sau đó phiên không nên hết hạn trừ khi không hoạt động trong 1 giờ đó. – Cameron

+0

1) Không, ý tôi là "đóng trình duyệt", tức là đóng tất cả các cửa sổ trình duyệt. 2) đảm bảo gọi session_start() trên mọi trang của ứng dụng, ngay cả khi phiên đó không được sử dụng bởi trang đó. –

+0

Thế còn CakePHP thì sao? Tôi đã ấn tượng rằng các phiên tồn tại trên ứng dụng? – Cameron

0

1.) Sự khác biệt giữa cookie phiên và "nhớ tôi" là cookie phiên có ngày hết hạn là "0". Có nghĩa là "hết hạn khi trình duyệt đóng". Trong khi "nhớ tôi" cho một ngày hết hạn cụ thể, nói một tháng kể từ bây giờ, cho cùng một cookie phiên. Đó là sự khác biệt duy nhất. Bạn có thể nghĩ rằng sự khác biệt trong chức năng này là tầm thường hoặc vô nghĩa, nhưng hãy xem xét điều này: ở nhà tôi không muốn bận tâm đăng nhập vào mỗi tối cho cùng một trang web Yahoo! tài khoản, trong khi tại nơi làm việc tôi không muốn bận tâm xóa cookie của tôi mỗi khi tôi phải đi tiểu.

2.) Cookie phiên không hết hạn ngay cả khi ứng dụng đang được sử dụng. Ở đâu và dưới hoàn cảnh nào bạn thấy hành vi này? Điều đó là sai.

+0

Tôi thấy hành vi này ở mọi nơi trên ứng dụng. Phiên hết hạn sau khi hết thời gian chờ mặc dù tôi đang điều hướng qua các trang, v.v. – Cameron

1

Hiểu sự kết hợp của các cài đặt bảo mật kết hợp với thời gian chờ, đó là một phần rất quan trọng. Khi bảo mật được đặt ở một phiên cao cấp có thể bị giết trước khi bạn mong đợi.

Bên cạnh thử nghiệm đó với cửa hàng phiên bánh bên trong. Bằng cách đó, cấu hình hệ thống cục bộ không thể ảnh hưởng đến nó. Có thể cài đặt PHP sẽ ghi đè cài đặt trong Bánh. Vì vậy, hãy đặt cửa hàng phiên thành Bánh. Điều đó sẽ tạo một thư mục với các phiên mà bạn có thể kiểm soát.

Tương tự như vậy, nó là sự kết hợp của cài đặt máy chủ và mong đợi cấu hình của Bánh sẽ ghi đè các cài đặt máy chủ này.

8

OK, chúng ta hãy xem nếu tôi có thể lấy một số trong đó tiền thưởng (chiến lợi phẩm?), Đồng thời cũng kiểm tra kỹ năng giải thích của tôi :)

Vì vậy, hãy bắt đầu với # 1.

Vì vậy, điều gì khiến tôi nhớ đến bữa tiệc?

Điều quan trọng cần phân biệt ở đây là sự khác biệt giữa "cookie phiên" và "nhớ cookie của tôi".

Vì HTTP là stateless protocol, cookie phiên được sử dụng để kết hợp một số yêu cầu với một người dùng. Không có nó, mọi yêu cầu duy nhất đối với máy chủ web của bạn hoàn toàn không liên quan đến mọi yêu cầu khác. Bạn có thể tưởng tượng việc viết các ứng dụng không có phiên không? Mọi yêu cầu đều trống hoàn toàn, không có thông tin đăng nhập, không có biến phiên .. dù yêu cầu là người dùng không xác định! Về cơ bản, điều này có nghĩa là không có ứng dụng web nào!

Bây giờ, điều quan trọng ở đây là nhận ra rằng bạn hoàn toàn không muốn phiên của bạn đến 24 giờ qua! Trong cuốn sách của tôi, đây là một điều rất lớn không. Phiên của bạn ngắn hơn, an toàn hơn (ít nhất là về mặt lý thuyết). Tại sao? Bởi vì session can be hijacked! Phiên của bạn càng dài, cơ hội càng bị chiếm đoạt càng nhiều.

Ví dụ: hãy tưởng tượng một ứng dụng ngân hàng. Ngoài ra, hãy tưởng tượng người dùng của bạn đang truy cập vào máy tính công cộng (người dùng của chúng tôi không phải là người sáng nhất). Vì vậy, ông quản lý tài khoản của mình hoặc bất cứ điều gì ... và điện thoại của ông đổ chuông. Là một thằng ngốc, anh nhận cuộc gọi và rời đi mà không cần đăng xuất. Bạn có muốn phiên của mình hết hạn sau 5 phút, 15 phút hoặc 24 giờ không? Không biết về bạn, nhưng đối với một cái gì đó quan trọng như ngân hàng trực tuyến, tôi muốn phiên đó biến mất càng sớm càng tốt.

Chuyển sang phần "ghi nhớ tôi".

Vì vậy, cookie phiên "kết nối" nhiều yêu cầu trong một phiên duy nhất, cookie "nhớ tôi" làm gì? Nói một cách đơn giản: nó liên kết nhiều phiên cho một người dùng.

Bạn muốn trang web của mình dễ sử dụng và dễ sử dụng và việc đăng nhập hầu như không bao giờ dễ chịu. Nó chỉ là một điều gây phiền nhiễu bạn phải làm mọi lúc trước khi làm điều đó bạn thực sự muốn làm. Một nhớ tôi cookie loại bỏ phiền toái đó.

Bạn đăng nhập một lần, chọn hộp và giờ đây bạn luôn đăng nhập trên máy tính đó. Đây là lý do tại sao bạn nên không bao giờ sử dụng tính năng "nhớ tôi" khi đang sử dụng máy tính dùng chung, bởi vì người tiếp theo sẽ có nhận dạng của bạn. Hợp pháp. Đây là lý do tại sao nhớ tôi cookie cũng là một nguy cơ bảo mật, họ có thể bị tấn công giống như cookie phiên.

Cuối cùng, có một sự khác biệt quan trọng giữa cookie phiên và ghi nhớ cookie của tôi: expiration. Cookie phiên thường hết hạn khi bạn đóng trình duyệt (hoặc sau một khoảng thời gian bạn đã chỉ định rõ ràng), trong khi hãy nhớ rằng cookie thường kéo dài lâu hơn nữa.

Ngoài ra làm cách nào các phiên hết hạn ngay cả khi người dùng tiếp tục sử dụng trang web ?

Để đơn giản, chúng không. Bạn phải thay đổi cách bánh (hoặc ứng dụng của bạn) xử lý các phiên. Câu trả lời phải ở đâu đó trong mã của bạn. Lý do tại sao bạn không nhận được câu trả lời thỏa đáng ở đây là bởi vì chúng tôi không thể nhìn thấy mã của bạn. Bạn sẽ chỉ phải gỡ lỗi và theo dõi những gì xảy ra với cookie của bạn. JB Nizet cho bạn một số gợi ý.

Một điều tôi biết có thể gây rắc rối trên một số máy chủ là mức độ bảo mật của bánh. Hãy thử hạ thấp số điện thoại trong số /Config/core.php:

Configure::write('Security.level', 'medium'); // or 'low' 

Nếu điều đó không giúp được thì câu trả lời chắc chắn là trong mã của bạn. Tôi hy vọng câu trả lời này sẽ đẩy bạn đi đúng hướng!

0

Nếu tôi làm điều này:

Configure::write('Session', array(
     'start' => true, 
     'defaults' => 'cake', 
     'timeout' => 1, 
     'cookieTimeout' => 1, 
     'autoRegenerate' => true 
    )); 

/** 
* The level of CakePHP security. 
*/ 
    Configure::write('Security.level', 'high'); 

Nó sửa chữa vấn đề này! Vì vậy, phiên cuối cùng 10 giây, nhưng nếu tôi làm mới sau 2-3 giây thì tôi sẽ vẫn đăng nhập sau 10 giây khi cookie đang được làm mới. Vì vậy, có vẻ như các cài đặt PHP của môi trường lưu trữ của tôi là/đã gây ra phiên hết hạn/cookie ... Tại sao điều này xảy ra?

+0

Vì những gì tôi đã viết trong câu trả lời của tôi, bạn đã thay đổi bộ nhớ cookie. Điều đó ngăn chặn ảnh hưởng của PHP và cài đặt máy chủ trên các phiên. –

+0

Bạn không chắc chắn ai đã đánh dấu câu trả lời của tôi? Cũng nhận thấy rằng ''autoRegenerate' => true' làm cho nó phá vỡ vì vậy đã phải loại bỏ đó là tốt! – Cameron

+0

Có một vài lỗi trong CakePHP 2.1. Tôi có cùng một vấn đề với chức năng tự động làm mới sử dụng ajax. Điều này cũng nên giữ cho phiên còn sống và nó không được. Rất phiền phức. Tôi phải nhìn lại công việc tôi đã làm về chủ đề này. Nếu bạn xem xét giá trị cục bộ và tổng thể của cài đặt phiên trong phpinfo(), bạn sẽ nhận thấy một số mâu thuẫn với cài đặt cakephp. Điều này làm cho việc gỡ lỗi trở nên khó khăn và sự sollution liên quan đến việc thay đổi mã nguồn của CakePHP. Mà tôi không khuyên bạn nên làm vì những vấn đề rõ ràng với nâng cấp sau này. – Jeroen