1. Vì sao kết nối database là điểm dễ rò rỉ nhất?
Trong nhiều sự cố an ninh, database không bị tấn công trực tiếp, mà bị lộ thông qua:
File cấu hình web bị truy cập trái phép
Code commit lộ password
Dùng user database có quyền quá rộng
Kết nối database không được kiểm soát
Điểm nguy hiểm là:
Chỉ cần lộ thông tin kết nối, kẻ tấn công không cần phá database.
Vì vậy:
Kết nối website ↔ database phải được xem là thông tin mật cấp cao.
2. Nguyên tắc kết nối website với database trong production
Trong loạt bài này, kết nối database tuân theo:
Không hard-code thông tin nhạy cảm
Không dùng user root
Không cho phép kết nối từ Internet
Giới hạn quyền user database
Có thể thay đổi password mà không sửa code
Nguyên tắc cốt lõi:
Ứng dụng chỉ được quyền “đi vào đúng cửa” của database.
3. Vị trí lưu thông tin kết nối database
3.1. Không đặt file config trong web root
Không:
Nên:
Hoặc:
Thư mục nằm ngoài
publicKhông thể truy cập qua HTTP
Nguyên tắc:
Nếu truy cập được bằng URL → không được chứa thông tin DB.
3.2. Quyền file cấu hình
Ví dụ:
Giải thích:
Chỉ user chạy PHP đọc được
Không ai khác xem được
4. Cấu trúc file config kết nối database (ví dụ PHP)
Dưới đây là ví dụ. Nếu dùng Drupal hay CMS khác, chỉ cần tuân thủ theo hướng dẫn của CMS đó là được.
Ví dụ đơn giản:
Không:
In ra biến
Echo ra lỗi chi tiết
Ghi log chứa password
5. Kết nối database bằng user tối thiểu
Kết nối từ PHP (ví dụ PDO):
$config = require '/var/www/site/private/config.php';
$dsn = "mysql:host={$config['db_host']};dbname={$config['db_name']};charset={$config['db_charset']}";
$pdo = new PDO($dsn, $config['db_user'], $config['db_pass'], [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,]);
Lưu ý:
Không hiển thị lỗi PDO ra frontend
Log lỗi vào file nội bộ
6. Không dùng kết nối database từ xa nếu không cần
Chỉ cho phép:
Không:
Lý do:
Giảm bề mặt tấn công
Ngăn brute force từ xa
Nguyên tắc:
Database user chỉ nên tồn tại ở đúng nơi cần thiết.
7. Quản lý password database an toàn
7.1. Không commit password lên Git
Không:
.envpublicFile config commit thẳng
Nên:
.gitignorefile nhạy cảmTemplate config không chứa password
7.2. Đổi password database an toàn
Khi cần đổi password:
Tạo password mới trong database
Cập nhật file config
Reload PHP-FPM
Kiểm tra website
Thu hồi password cũ
Không:
Đổi password mà không biết website nào đang dùng.
8. Kiểm soát lỗi kết nối database
8.1. Không hiển thị lỗi database cho người dùng
Không:
In lỗi SQL
In stack trace
Nên:
Trang lỗi chung
Log chi tiết ở backend
Nguyên tắc:
Người dùng không cần biết database của bạn trông như thế nào.
9. Giám sát kết nối database
Theo dõi:
Số kết nối
Kết nối bất thường
Lỗi đăng nhập
Lệnh kiểm tra:
Giúp:
Phát hiện kết nối treo
Phát hiện brute force nội bộ
10. Những sai lầm phổ biến khi kết nối website với database
Dùng user root
File config đặt trong web root
Commit password lên Git
Cho phép user
@'%'Hiển thị lỗi SQL ra frontend
Những sai lầm này:
Khi bị khai thác, hậu quả thường rất nặng.
11. Checklist kết nối database an toàn
File config nằm ngoài web root
Quyền file config được siết
User database tối thiểu
Kết nối local (
localhost)Không lộ password
Lỗi database không hiển thị ra ngoài
12. Kết thúc Phần VI
Đến đây, Phần VI – Cơ sở dữ liệu và kết nối backend đã hoàn thiện:
Cài đặt database chuẩn production
Bảo mật database
Quản lý user & quyền
Backup & restore
Kết nối website an toàn
Hệ thống backend đã:
Sẵn sàng cho vận hành ổn định và mở rộng.
- Đăng nhập để gửi ý kiến
