Session trong PHP

Tại sao close tab mà lại không được coi là đóng phiên làm việc hả bác :sweat_smile:

Đóng chứ sao không đóng.

Tự kiểm chứng: nếu bạn không tin nó đóng hay không thì bạn làm một chương trình login bằng PHP mà không dùng đến cookies hay storage , khi bạn đóng tab này lại, và mở tab khác ra, vào lại trang đó ở tab mới xem nó có nhận ra là bạn còn đăng nhập không hay là đã xem như bạn thoát đăng nhập?

Vấn đề nhiều người không chịu là đóng tab lại là dứt phiên làm việc mà phải đóng trình duyệt đó có lẽ là bởi lý do trình duyệt có chức năng undo để mở lại tab vừa đóng. Do đó, đóng trình duyệt mới thực sự là đóng phiên. Còn nếu đóng tab mà tab đó vẫn có thể mở lại y chang thì không. Còn nếu trình duyệt chỉ có 1 tab duy nhất và đóng luôn tab đó lại không undo được thì xem ra đã kết thúc phiên.

1 Like

Nếu close tab có thể coi là kết thúc một session thì session sẽ không bao giờ cần dùng nữa và cũng sẽ chẳng có khái niệm session trong lập trình nói riêng.

Session giúp lưu trữ thông tin TẠM THỜI trong một khoảng thời gian nhất định để giúp người dùng không bị gián đoạn trong khi đang thao tác trên website mà không phải nhập lại toàn bộ dữ liệu.

Bản chất của Session vẫn là Cookie và lưu trên ổ cứng, nhưng không phải loại cookie tồn tại theo thời gian mà là loại tồn tại theo session, nếu như tắt trình duyệt thì cookie loại này cũng bị xoá hết.

Không chỉ là trình duyệt mở mà trình duyệt phải gửi tối thiểu 1 request đến server trong thời gian sống để session reset lại timeout. Nếu như trình duyệt tắt trước khi session time out, thì session đó vẫn tồn tại ở phía server đến khi timeout, nhưng nếu bạn mở trình duyệt lại thì cookie cũ không còn, session mới được tạo ở phía server không còn liên quan gì đến session cũ nữa nên session cũ cũng sẽ chết.

Đây là cơ sở của “Heartbeat design pattern”, giảm thời gian sống của session (mặc định là 20 phút) xuống còn 1-2 phút để giảm thiểu bộ nhớ cho session của trình duyệt bị tắt và client sẽ gửi request rỗng đến server mỗi 30 giây để reset timeout.

1 Like

Thực sự, có tới 3 thứ đang đề cập ở chủ đề này, giờ các bạn cần thảo luận kỹ để làm rõ thêm:

  1. Session : ở đây ta chỉ dừng lại với giao thức HTTP hoặc HTTPS dùng trong web, liên quan đến trang web và trình duyệt trao đổi theo kiểu client - server, không đề cập đến session với tư cách chung chung trong lĩnh vực mạng máy tính.

  2. Cookies: cũng dính dáng đến HTTP, trình duyệt web.

  3. Session cookies : là session nhưng mà có tạo ra một cookies ở phía client, có thể xem thấy cookie này trên ổ cứng.

( Các ngôn ngữ lập trình web có dùng session cookies thì có các tên như JSESSIONID (JSP), PHPSESSID (PHP), CGISESSID (CGI), and ASPSESSIONID (ASP) )

Như vậy, không phải lúc nào session cũng là session cookies, có những lúc bạn không thể tìm ra session dưới dạng cookie trên ổ cứng nhưng phiên làm việc vẫn thiết lập và server vẫn nhận ra client, lúc đó có lẽ trình duyệt lưu session trong vùng nhớ nào đó do giao thức HTTP quy định hay có cách khác để bắt tay nhau. Mình không biết nó dùng cách nào nhưng ngày xưa hay vọc phpBB thì thấy có lẽ người ta sử dụng chuỗi token làm tham số GET.

Thảo luận mở rộng ra: nếu ai dó cho rằng session chính là session cookie, vậy thì khi trình duyệt tắt chức năng cho phép cookie, như vậy là những web nào xài session là bị ngọng, không thể nhận diện được client như chúng ta đang hiểu về session?

OK, mời các bạn cùng vào thảo luận chơi. À, mà tiếng Anh mình không rõ, tại sao chữ cookies nó lại luôn là cookies mà không thấy ghi là cookie dù chỉ có 1 cái.

1 Like

Close tab thì có xóa session cookie của trang hiện tại không bác?

Không bạn. Trừ khi tắt trình duyệt / người dùng xoá bằng thao tác trình duyệt cung cấp / có response xoá session từ phía server gửi về

Ví dụ chrome thì như thế này:

ý mình là xóa session id được server gửi vể và lưu ở client ý bạn, cookie cứng của trang đó thì không xóa được rồi

Bạn thử đăng nhập rồi xoá cookies trong 1 giờ đi, lại phải đăng nhập lại ngay mà :))
Đã nói rồi, session cũng là cookies

Còn xoá từ phía server thì mình không biết, nhưng mà chắc là có, vì bên ASP.NET cũng có xoá session từ server

Dùng SID vẫn được nhé :smiley: https://stackoverflow.com/questions/3740845/php-session-without-cookies

1 Like

ý mình là thế này bạn ạ, server gửi 1 SID lưu ở cookie phía client, sau khi đóng tab thì cái SID đó có bị xóa trong cookie hay không (chỉ cái SID thôi nhé), còn cookie của trang thì ta phải xóa thủ công bằng tay qua setting rồi, cái này mình không nói

Mình từng làm web bên ASP thì không mất, kể cả có tắt tab bao lâu đi nữa.

Em hơi thắc mắc là nếu tắt tab thì client gửi request rỗng về server để duy trì timeout của session kiểu gì hả bác?

À ừ nhầm nhầm XD
Không phải là bao lâu đi nữa :)) Session mặc định là 20 phút, mình ngồi chờ 10 phút nên nó vẫn chưa mất :slight_smile:
Uk, nếu mà tất cả các tab của một site bị tắt thì quá timeout là mất session

1 Like

nếu vẫn để tab đó nhưng mình ko thực hiện bất cứ hành động gì trên website thì client có gửi request rỗng về cho server để duy trì session không bác?

Cái này thì tuỳ website. Nếu website đó yêu cầu như thế thì có, không thì client sẽ không gửi request gì hết nên cũng mất (Heartbeat Design Pattern)

1 Like

Session và cookie đều có TTL (time to live) nên không phải cứ tắt browser thì session cũng bị kill đâu nhé. Nó sẽ bị webserver xoá đi khi hết giờ sống ^^.

Còn cookie thì có nhiều loại, trong đó có loại Session cookie (không phải session), đây là cookie mà khi tắt browser đi thì nó cũng chết theo (trừ phi bạn dùng tính năng của browser là mở tab ở lần mở trước, thì browser sẽ cho nó đội mồ sống dậy, gọi là zombie cookie).

Vậy tại sao khi tắt browser đi thì bạn lại phải login lại?

  • Bản chất phía dưới cookie sẽ lưu 1 key: sessionid (hoặc 1 token nào đó) để khi nó gửi request lên webserver, app lấy thông tin sessionid, check xem thằng này lần trước là thằng nào mà có cho phép đăng nhập hay không (từ sessionId, truy vấn để ra userid, username, … chứ sessionId không dùng ngay được)? Nếu session cookie bị xoá thì rõ ràng browser chẳng gửi cái gì lên, thì app có mà check bằng giời … dù cái sessionid của lần mở trước vẫn còn sống trên server. (rồi nó cũng chết bởi TTL vì chẳng ai dùng nữa)

  • Thế nếu session bị xoá trên server thì sao? (xoá tay). Khi đó dù vẫn còn session cookie, nhưng sessionid đẩy lên chẳng match với thằng nào, thế nên app nó cũng chịu và cho bạn bay ra ngoài trang login.

  • Vậy lúc nào cũng cần sessionid? Không, sessionid thực chất cũng chỉ là 1 token và được kiểm tra phía server giúp bạn biết người dùng là ai. Nếu phía client, bạn có những thông tin này (cách làm của JWT) thì cũng chẳng cần session luôn. Bạn nhét userid, username và permission vào token phía client và điều hướng vào trang nào mà bạn cho phép.

  • Còn vụ remember thì sao nhỉ? Thực chất, thay vì session cookie, giờ chuyển sang persitent cookie, nghĩa là có TTL cụ thể nào đó. TTL này có thể cũng khác hẳn với TTL của session phía server đấy nhé. Nếu sử dụng cơ chế verify sessionid thì 1 trong 2 thằng chết trước sẽ khiến bạn phải login lại.

2 Likes

Đây là bài mình trả lời về cookie trên 1 diễn đàn khác (nói tới session thì nên nói tới cookie ^^)

(Hì, mình thấy 2 bạn trình bày khá đầy đủ về cookie rồi. Mình bổ sung thêm 1 vài ý nhỏ:)
Cookie giúp các site nhận diện bạn là ai. Bởi bản chất của http là stateless nên sử dụng cookie giúp http trở thành stateful (thông qua 1 chuỗi nào đó, có thể là sessionID (sẽ được check trên server) hoặc như JWT (mã hoá luôn cả userid vào, và chỉ check phía client)

Có 1 số loại cookie sau:
1 Session cookie: cookie này sẽ xoá khi bạn thoát browser (trừ phi bạn sử dụng tính năng restore page when start browser, nó sẽ save vào sqlite). Loại này thì bạn cũng không cần phải logout luôn.
2 Persistent cookie: cookie này không xoá mà sẽ ở đó tới 1 time nào đó (TTL). Kể cả khi logout bạn cũng không xoá được, trừ phi bạn dùng tool mà xoá.
3 HttpOnly cookie: cookie này không đọc được bằng JS phía client mà phải đọc nhờ header khi trên server. Cookie này thì kể cả nhúng JS từ 3rd party đểu cũng không sợ.
4 Secure cookie: không truyền qua http, chỉ qua https. Cũng khá an toàn.
5 Samesite cookie:
6 3rdparty cookie:
7 Zombie cookie: thường do đã xoá nhưng dùng tính năng bật lại trang lần trước thì browser sẽ hồi sinh cookie này.
8 Super cookie: cookie bắt theo tên miền gốc, kiểu .com, hay .com.vn. Thường chẳng site nào enable cái này vì nếu enable thì site khác, kiểu 123.com có thể đọc được cookie của 456.com

Cookie sống theo:
1 Domain và path. Các domain chỉ truy cập cookie của mình, thậm chí subpath không thể truy cập rootpath, kiểu như cookie ở /hoho/ thì không thể đoc được ở /
2 Max age và expires: time qui định

Mình cũng chưa bao giờ phải xoá cookie khi ra khỏi trang cả, vì để lấy được cookie dài ngoằng vậy … tốn time phết. Nếu họ đã mượn được máy thì họ đọc luôn thông tin, nghịch ngợm luôn … chứ lấy cookie rồi lại phải build ở máy họ, vừa lâu, vừa chả chắc được ^^

Một số câu hỏi thảo luận thêm nhé:
1- Tại sao cookie sống dưới browser mà server vẫn đọc được? Tại sao server cũng có thể thay đổi được nội dung của cookie?
2- Nhược điểm của cookie và hiện nay mọi người thường thay thế bằng phương pháp nào? Tại sao các WebAPI đều không sử dụng cookie mà lại dùng token?
3- Có những cách nào để hack cookie? Concept và phương thức tấn công?

1 Like

Session cookies là cookies nhé. Còn vụ số nhiều vì chứa nhiều bánh (cookie), vậy thôi. Cái bánh chứa PHPSESSID là 1 cái nè, cái bánh chứa username là 1 cái nè, rồi bánh chứa đủ các loại tracking …

Cookie chính là 1 dạng local storage của browser.

Hi bạn!
mình có tạo trang login bàng php…
mỗi khi login thì mình tạo session để lưu thông tin!
tuy nhiên có vấn đề ở đây là tôi mỏ 2 tab đăng nhập bằng 2 tài khoản khác nhau. khi đăng nhập xong rồi tôi refresh 2 tab thì 2 tài khoản vừa nhập nó lại là 1 tài khoản giống nhau(trước đó đăng nhập bằng 2 tài khoản khác nhau).

ông có biết cách khắc phục kiểu này không?

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?