Đã bao giờ bạn trải qua cảm giác khi bạn đã check in phòng khách san, đã ngủ một đêm, sáng hôm sau ra ngoài dạo chơi, trưa về hớn hở bước vào khách sạn, bỗng nhiên bị anh bảo vệ khăng khăng bắt tới quầy làm thủ tục check in...
Bạn làm xong chức năng login.
Test thử:
- Nhập tài khoản
- Nhập mật khẩu
- Đăng nhập thành công
- Vào được trang quản trị
Bạn vui mừng khi thấy...hình như mọi thứ ổn.
Rồi thì "rảnh quá" thử chơi: Bấm vào nút Back trên trình duyệt
hoặc:
gõ trực tiếp login.php
Và...Trang Login hiện ra.
Người dùng:
"Ủa? Mình đã login rồi mà? Sao bắt login nửa vậy trời!"
Website...ậm ừ:
"Tôi cũng không chắc nữa...kệ, làm lại...cho chắc"
Login thành công nhưng vẫn vào được Login Page là gì?
Lỗi này xảy ra khi:
- Session đã tồn tại
- User đã đăng nhập
Nhưng trang login không kiểm tra Session
Kết quả: Người dùng vẫn truy cập được trang login.
Rất phổ biến với:
- PHP thuần
- Người mới học Session
- Website upload lên host thật
- InfinityFree
Ví dụ trớt quớt
Bạn login thành công.
PHP lưu:
$_SESSION['user'] = 'admin';
Sau đó vào:
dashboard.php
Nhưng nếu gõ:
login.php
Trang login vẫn hiện ra sừng sững...
User lúc này có cảm giác...hoang mang:
Đăng nhập rồi....mà chưa hoàn toàn đăng nhập
Ví dụ thực tế
Hãy tưởng tượng:
- Bạn đã check-in khách sạn.
- Nhận chìa khóa.
- Nhận phòng.
Nhưng lễ tân vẫn bắt bạn:
Đứng xếp hàng check-in lần nữa
Đó chính là cảm giác của người dùng khi gặp lỗi này.
Vì sao chuyện này xảy ra?
Lính mới thường chỉ kiểm tra:
dashboard.php
Ví dụ:
session_start();
if(!isset($_SESSION['user']))
{
header("Location: login.php");
exit;
}Rất đúng.
Nhưng lại quên kiểm tra:
login.php
Kết quả:
Dashboard được bảo vệ
Login page thì không
Cách lính mới thường làm
login.php
<form method="post">
...
</form>Hết.
Không kiểm tra gì cả.
Cách đúng
Ngay đầu file:
<?php
session_start();
if(isset($_SESSION['user']))
{
header("Location: dashboard.php");
exit;
}
?>Lúc này:
Đã login
↓
Truy cập login.php
↓
Tự động chuyển dashboard
Luồng sai
Login
↓
Dashboard
↓
login.php
↓
Vẫn hiện form login
Luồng đúng
Login
↓
Dashboard
↓
login.php
↓
Redirect dashboard
Một lỗi rất phổ biến
Lính mới nghĩ:
"Đã bảo vệ dashboard rồi."
Đúng. Nhưng:
Dashboard
và
Login Page
là hai vấn đề khác nhau.
Website chuyên nghiệp phải xử lý cả hai.
Lỗi thứ hai: Session chưa start
Ví dụ:
if(isset($_SESSION['user']))
{
...
}Nhưng quên:
session_start();
Kết quả:
$_SESSION
không hoạt động.
Lỗi thứ ba: Sai tên Session
Login:
$_SESSION['username'] = $username;
Login page:
if(isset($_SESSION['user']))
PHP:
username ≠ user
Lỗi thứ tư: Session bị mất trên host
Localhost: Mọi thứ chạy như xe công thức 1
InfinityFree hoặc một hosting nào đó: Mất session
Nguyên nhân có thể:
- Session cấu hình lỗi
- Header Already Sent
- Có output trước session_start()
- Cache trình duyệt
Một sự thật...biết rồi, khổ lắm, nói mãi
Rất nhiều website lớn:
- Gmail
- Shopee
- Lazada
Khi bạn login rồi:
facebook.com/login
Sẽ không hiện form login nữa.
Họ lập tức:
Redirect
về trang chính.
Đó chính là cách hoạt động chuyên nghiệp.
Code mẫu đúng
login.php
<?php
session_start();
if(isset($_SESSION['user']))
{
header("Location: dashboard.php");
exit;
}
?>
<form method="post">
...
</form>
Debug kiểu dev "xịn sò"
1. Kiểm tra Session
var_dump($_SESSION);
2. Kiểm tra session_start()
Có nằm đầu file không?
3. Kiểm tra tên Session
Ví dụ:
$_SESSION['user']
và
$_SESSION['username']
có giống nhau không?
4. Kiểm tra Redirect
Có:
header(...)
không?
Checklist "chuẩn không cần chỉnh"
- Đã dùng session_start()?
- Đã lưu Session sau login?
- login.php có kiểm tra Session?
- Đã dùng header() redirect?
- Có exit sau header()?
- Tên Session có thống nhất?
- var_dump($_SESSION) đã kiểm tra chưa?
FAQ nhanh
Có bắt buộc redirect khỏi login page không?
Không. Nhưng nên làm.
Website lớn có làm vậy không?
Có. Hầu như tất cả đều làm.
Chỉ bảo vệ dashboard có đủ không?
Không. Nên xử lý cả login page.
InfinityFree có gây lỗi này không?
Thường không. Nguyên nhân chủ yếu nằm ở Session hoặc code.
Bạn có thể cũng đang gặp
Login đúng password nhưng vẫn fail
Redirect sau submit form đúng cách
Logout rồi nhưng Browser Back vẫn vào được
Remember Me hoạt động thế nào?