- 1. ABSPATH là gì?
- 2. Dòng if ( ! defined(‘ABSPATH’) ) exit; làm gì?
- 3. Vì sao nó quan trọng?
- 3.1. Chặn truy cập trực tiếp vào file
- 3.2. Tránh lỗi PHP khi file bị gọi sai ngữ cảnh
- 3.3. Chuẩn best practice của WordPress
- 4. Có cần ở mọi file không?
- 5. Một số cách viết khác cùng ý nghĩa
- Cách 1: Style phổ biến nhất
- Cách 2: Dùng short-circuit (gọn gàng, được ưa chuộng)
- Cách 3: Dùng die thay cho exit
- Cách 4: Vừa kiểm tra vừa in thông báo
- Cách 5: Gộp một dòng, rất “WordPress-style”
- 6. Nó có bảo mật tuyệt đối không?
- 7. Kết luận: Có cần thiết không?
1. ABSPATH là gì?
ABSPATH là một hằng số (constant) được WordPress định nghĩa trong wp-config.php. Nó trỏ tới đường dẫn gốc của WordPress trên server.
Nói đơn giản: nếu WordPress đã được load đúng cách, thì ABSPATH chắc chắn tồn tại. Nếu ai đó truy cập trực tiếp một file PHP trong theme hoặc plugin qua URL (ví dụ: /wp-content/plugins/xyz/file.php), thì WordPress có thể chưa được khởi động, và ABSPATH… không tồn tại.
2. Dòng if ( ! defined(‘ABSPATH’) ) exit; làm gì?
if ( ! defined('ABSPATH') ) exit;
Dòng này thực hiện đúng hai việc:
- Kiểm tra xem WordPress đã được load hay chưa (thông qua
ABSPATH). - Nếu chưa, thì thoát ngay (
exit;) và không cho chạy tiếp bất kỳ logic nào trong file.
Nôm na: “Không đi qua cửa chính WordPress thì dừng cuộc chơi ở đây.”
3. Vì sao nó quan trọng?
3.1. Chặn truy cập trực tiếp vào file
Nhiều file trong theme và plugin chứa:
- Logic xử lý dữ liệu
- Query database
- Hàm nội bộ
- API endpoint tự chế
Nếu không có check ABSPATH, bất kỳ ai cũng có thể gọi trực tiếp file đó qua URL. Kết quả có thể là:
- Khai thác lỗ hổng logic
- Trigger hành vi không mong muốn
- Leak dữ liệu
- Hoặc đơn giản là làm vỡ site
Dòng này không phải “tường thành”, nhưng nó là cái khóa cửa tối thiểu. Bỏ nó đi = để cửa mở toang.
3.2. Tránh lỗi PHP khi file bị gọi sai ngữ cảnh
Nhiều file assume rằng WordPress đã được load và các hàm như add_action(), get_option(), wp_enqueue_script() đã tồn tại.
Nếu file bị truy cập trực tiếp, PHP sẽ nổ warning hoặc fatal error loạn xạ. Check ABSPATH giúp thoát sớm, sạch sẽ, không log rác, không debug ác mộng.
3.3. Chuẩn best practice của WordPress
Đây không phải “thích thì thêm”. Đây là best practice được WordPress core, plugin repo và dev kỳ cựu dùng suốt hơn 10 năm.
Mở bất kỳ plugin tử tế nào trên WordPress.org, bạn sẽ thấy ngay dòng này ở đầu file.
4. Có cần ở mọi file không?
Câu trả lời ngắn gọn: CÓ. Không cãi.
Tất cả file PHP trong:
- Theme
- Child theme
- Plugin
- Include files
- Template parts
đều nên có một check kiểu này ở đầu file.
Lý do rất thực tế:
- Bạn không biết file nào sau này sẽ bị truy cập trực tiếp.
- Bạn không biết file nào sau này sẽ được refactor thành endpoint.
- Bạn không biết file nào sau này sẽ chứa logic nhạy cảm.
Thêm nó ngay từ đầu = khỏi phải suy nghĩ lại sau này.
5. Một số cách viết khác cùng ý nghĩa
Tất cả các cách dưới đây đều làm cùng một việc: kiểm tra ABSPATH và thoát nếu WordPress chưa được load.
Cách 1: Style phổ biến nhất
if ( ! defined('ABSPATH') ) exit;
Cách 2: Dùng short-circuit (gọn gàng, được ưa chuộng)
defined( 'ABSPATH' ) || exit;
Cách 3: Dùng die thay cho exit
if ( ! defined('ABSPATH') ) {
die;
}
Cách 4: Vừa kiểm tra vừa in thông báo
if ( ! defined('ABSPATH') ) {
exit('No direct script access allowed.');
}
Cách 5: Gộp một dòng, rất “WordPress-style”
defined( 'ABSPATH' ) or die;
Khác style, cùng bản chất. Chọn một style và dùng nhất quán trong toàn bộ codebase.
6. Nó có bảo mật tuyệt đối không?
Không. Đừng ảo tưởng.
Dòng này chỉ là:
- Một lớp phòng thủ cơ bản
- Một sanity check
- Một best practice bắt buộc
Nó không thay thế được:
- Nonce
- Capability checks
- Sanitization / validation
- Security headers
Nhưng bỏ nó đi thì… bạn đang tự bắn vào chân.
7. Kết luận: Có cần thiết không?
Có. Rất cần. Bắt buộc.
Dòng:
if ( ! defined('ABSPATH') ) exit;
hoặc bất kỳ biến thể tương đương nào như:
defined( 'ABSPATH' ) || die;
nên xuất hiện ở đầu mọi file PHP trong theme và plugin WordPress.
Nó:
- Chặn truy cập trực tiếp
- Giảm rủi ro bảo mật
- Tránh lỗi PHP ngu ngơ
- Tuân thủ best practice của WordPress
Chi phí: 1 dòng code.
Lợi ích: ngủ ngon hơn, ít drama hơn.
Nói thẳng: nếu bạn đang viết theme/plugin mà không có dòng này ở đầu file, thì đó là technical debt ngay từ ngày đầu. Thêm đi, đừng lười.
Bình luận