Session trong PHP

ý 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?

Trước khi đăng nhập cần kiểm tra xem có tồn tại session hay không, nếu tồn tại thì không hiện form đăng nhập nữa mà hiện trạng thái là đã đăng nhập. Không có cái kiểu cho đăng nhập như bạn trình bày, thế thì phiên đăng nhập phân biệt nhau kiểu gì? Mục đích đăng nhập là để phân biệt ai với ai, để từ đó làm các việc khác như phân quyền hay gì gì đó, nếu không giải quyết được việc đó -> đăng nhập đã trở thành việc troll nhau.

2 Likes

Với câu hỏi này thì mình nghĩ là:

Bạn phải hiểu thời gian hoạt động của 1 phiên session.
Và cách client duy trì kết nối với session trên server như thế nào.

Tôi thiết lập trên server thời gian sống của một phiên kết nối vào session là 1 tiếng.
Trong khoảng thời gian trên 1 tiếng bạn không kết nối tới server đó nữa. session sẽ bị xoá.

Nếu trong 1 tiếng đó bạn kết nối lên server thì bạn lại đc reset thời gian sống của phiên session về từ đầu, 1 tiếng sau ko sử dụng nó chết … cứ như vậy
=> Session sẽ không chết nếu các bạn duy trì đc phiên

session + cookie: => duy trì phiên kết nối
Mặc định thì để nhận biết đc ai là chủ nhân của session này. thì mặc định session sử dụng cookie. tạo ra 1 sessionID lưu vào cookie của client. khi client gửi request sẽ kèm theo sessionID để lấy đc session trên server (sessionID là 1 cookie)

=> Điều gì sẽ xảy ra khi đóng hẳn trình duyệt và mở lại khi còn thời gian của phiên session

  1. nếu set sessionID ko có thời gian sống. => tắt trình duyệt mở lại => sessionID sẽ bị mất
    tuy nhiên session trên server vẫn còn đó => nhưng cũng sẽ tự huỷ sau khi hết phiên.

  2. . nếu set sessionID thời gian sống 30 phút. tắt trình duyệt mở lại. => gửi request lên server, session tiếp tục được duy trì, nhưng sau 30 phút sessionID chết. không còn sessionID để gửi lên server nữa.
    phiên session ko còn đc gọi tới => session sau 1 tiếng bị chết.

  3. nếu set sessionID thời gian 1 ngày. bạn sẽ sử dụng đc session đó trong vòng 1 ngày. với điều kiện luôn duy trì kết nối trong phiên kết nối nha.

=> tóm lại. thời gian hoạt động của session phụ thuộc và thời gian chờ của phiên session, và thời gian sống của sessionID.

set phiên của session là 5 ngày và sessionID 9999 ngày.
thì trong 5 ngày đó bạn vào vẫn còn session để xài. => 1 kiểu làm remember

1 Like

thay thế kiểu gi v ban

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