Bảo vệ mật khẩu MySQL

1. Đặt vấn đề

Thông thường, tên người dùng và mật khẩu MySQL cho các ứng dụng web được ghi trong một tập tin PHP. Ví dụ, diễn đàn phpBB2 định nghĩa các biến $dbuser (tên người dùng) và $dbpasswd trong tập tin `config.php'. Nếu website của bạn dùng chung máy chủ với website khác thì rất có thể người khác sẽ xem được giá trị các biến $dbuser$dbpasswd của bạn. Họ chỉ cần dùng hàm `include()` để lấy tập tin cấu hình của bạn, sau đó dùng hàm `echo()` để hiển thị giá trị các biến. Tất nhiên là sẽ chẳng khó khăn gì để có thể xác định được đường dẫn đến tập tin `config.php'. Thông thường, nếu máy chủ chạy Linux, đường dẫn đến “Documents Root” của “Virtual host” sẽ là `/home/USER/public_html'. Giả sử “Documents Root” của bạn là `/home/user1/public_html', và “Documents Root” của người khác là `/home/user2/public_html'. Họ sẽ tạo một tập tin PHP và ghi vào thư mục `/home/user2/public_html', nội dung kiểu như sau:

<?php
include ('/home/user1/public_html/forums/config.php');
echo 'Tên người dùng: ' . $dbuser . '<br />';
echo 'Mật khẩu: ' . $dbpasswd;
?> 

Sau đó, họ sẽ dùng trình duyệt để đọc. Một khi đã biết được giá trị các biến trong `config.php' thì họ có thể sửa đổi, thậm chí là xoá toàn bộ cơ sở dữ liệu của bạn! Ngoài ra, nguy hiểm hơn, có nhà cung cấp dịch vụ hosting còn đồng bộ hoá mật khẩu cơ sở dữ liệu với mật khẩu quản lí hosting với lí do là để giúp khách hàng không phải nhớ nhiều mật khẩu(!)

2. Giải pháp

Để biết được giá trị các biến trong tập tin của bạn, người khác bắt buộc phải dùng một tập tin trong thư mục của họ. Trong PHP, hàm `getcwd()` sẽ đưa ra thư mục chứa tập tin mà máy khách yêu cầu. Như vậy, chúng ta có thể dùng hàm `ereg()` để xác định xem ‘user1’ hay ‘user2’ đang dùng `config.php'. Bạn thêm dòng sau đây vào ngay trước dòng $dbpasswd='PASSWORD'; trong tập tin `config.php':

if ( ereg("^/home/user1/public_html.*", getcwd()) ) 

Như vậy, nếu ‘user2’ đọc tập tin `config.php' của ‘user1’ thì sẽ có thông báo lỗi.

Tuy nhiên, vấn đề không dừng lại ở đây. Nếu máy chủ cho phép truy cập SSH và người quản trị không giới hạn quyền truy cập thì người khác lại càng dễ dàng lấy được các thông tin cần thiết. Vì vậy, hãy kiểm tra và đề nghị nhà cung cấp dịch vụ đặt quyền truy cập giúp bạn, ví dụ:

# chown user1:apache /home/user1/public_html/forums/config.php
$ chmod 440 /home/user1/public_html/forums/config.php

Lúc này chỉ có ‘user1’, root và apache là được quyền đọc `/home/user1/public_html/forums/config.php'.


Chuyên mục: