Website được thiết kế tối ưu cho thành viên chính thức. Hãy Đăng nhập hoặc Đăng ký để truy cập đầy đủ nội dung và chức năng. Nội dung bạn cần không thấy trên website, có thể do bạn chưa đăng nhập. Nếu là thành viên của website, bạn cũng có thể yêu cầu trong nhóm Zalo "CNTT" các nội dung bạn quan tâm.

35. Kết nối website với database an toàn

ICT

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:

  1. Không hard-code thông tin nhạy cảm

  2. Không dùng user root

  3. Không cho phép kết nối từ Internet

  4. Giới hạn quyền user database

  5. 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:

/var/www/site/public/config.php

Nên:

/var/www/site/private/config.php

Hoặc:

  • Thư mục nằm ngoài public

  • Khô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ụ:

chown root:www-data config.php chmod 640 config.php

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:

'cntt_it_user'@'localhost' 

Không:

'cntt_it_user'@'%' 

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:

  • .env public

  • File config commit thẳng

Nên:

  • .gitignore file nhạy cảm

  • Template config không chứa password


7.2. Đổi password database an toàn

Khi cần đổi password:

  1. Tạo password mới trong database

  2. Cập nhật file config

  3. Reload PHP-FPM

  4. Kiểm tra website

  5. 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:

 
SHOW PROCESSLIST;

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.