Bài viết này phân tích chi tiết hàm core của Init Sentinel, tập trung vào các quyết định kỹ thuật quan trọng: khi nào ghi log, khi nào im lặng, cách chống spam log và cách giữ hệ thống nhẹ ngay cả khi chạy lâu dài.
Vai trò của hàm core trong Init Sentinel
Hàm core không đơn thuần là một lệnh insert database mà đóng vai trò như cổng kiểm soát trung tâm cho toàn bộ hệ thống giám sát.
- Cho phép bật hoặc tắt logging toàn cục bằng filter.
- Loại trừ các hành vi hợp lệ từ Editor trở lên.
- Chuẩn hoá dữ liệu đầu vào trước khi ghi log.
- Ngăn log trùng lặp gây bloat database.
Mọi lớp giám sát, cảnh báo hoặc phản ứng phía sau đều phụ thuộc vào kỷ luật của hàm này.
Định nghĩa hàm init_html_log_security_event
Hàm core của Init Sentinel được đặt với prefix init_html_*, đồng bộ với toàn bộ filter và action để đảm bảo tính nhất quán và dễ mở rộng.
/**
* Core: Ghi một security event vào bảng `init_sentinel_security_log`
* Filters:
* - init_html_sentinel_enabled(bool $enabled, string $endpoint, string $action, int $status_code): bật/tắt log toàn cục
* - init_html_sentinel_retention_days(int $days): số ngày giữ log (mặc định 30)
*/
function init_html_log_security_event( $endpoint, $action, $status_code = 403 ) {
// 0) Cho phép tắt hoàn toàn qua filter
$enabled = (bool) apply_filters('init_html_sentinel_enabled', true, (string) $endpoint, (string) $action, (int) $status_code);
if ( ! $enabled ) {
return;
}
// BỎ LOG CHO EDITOR+ (Editor / Admin / Super Admin)
if ( current_user_can('edit_others_posts') ) {
return;
}
global $wpdb;
// 1) Lấy user & IP & UA (không enrich, không geo)
$user_id = get_current_user_id() ?: null;
$user_agent = isset($_SERVER['HTTP_USER_AGENT']) ? substr((string) $_SERVER['HTTP_USER_AGENT'], 0, 500) : '';
// Ưu tiên IP thật nếu có proxy/CDN
$ip = 'unknown';
if (!empty($_SERVER['HTTP_CF_CONNECTING_IP'])) {
$ip = $_SERVER['HTTP_CF_CONNECTING_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$parts = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
$ip = trim($parts[0]);
} elseif (!empty($_SERVER['REMOTE_ADDR'])) {
$ip = $_SERVER['REMOTE_ADDR'];
}
// 2) Chặn log spam (cùng IP + endpoint trong 1 phút)
$table = $wpdb->prefix . 'init_sentinel_security_log';
$exists = $wpdb->get_var( $wpdb->prepare(
"SELECT EXISTS(
SELECT 1 FROM {$table}
WHERE ip_address = %s
AND endpoint = %s
AND created_at > (UTC_TIMESTAMP() - INTERVAL 1 MINUTE)
)",
$ip, $endpoint
) );
if ( $exists ) {
return;
}
// 3) Ghi log — lưu UTC
$wpdb->insert(
$table,
[
'user_id' => $user_id,
'ip_address' => $ip,
'endpoint' => substr((string) $endpoint, 0, 255),
'action' => substr((string) $action, 0, 100),
'status_code' => (int) $status_code,
'user_agent' => $user_agent,
'created_at' => gmdate('Y-m-d H:i:s'),
],
['%d','%s','%s','%s','%d','%s','%s']
);
$log_id = (int) $wpdb->insert_id;
// 4) Dọn rác log theo số ngày giữ (xác suất 1%)
if ( mt_rand(1,100) === 1 ) {
$days = (int) apply_filters('init_html_sentinel_retention_days', 30);
if ($days < 1) { $days = 1; } if ($days > 3650) { $days = 3650; }
$wpdb->query( "DELETE FROM {$table} WHERE created_at < (UTC_TIMESTAMP() - INTERVAL {$days} DAY)" );
}
// 5) Hook mở rộng
do_action( 'init_html_security_event', $log_id, [
'user_id' => $user_id,
'ip_address' => $ip,
'endpoint' => (string) $endpoint,
'action' => (string) $action,
'status_code' => (int) $status_code,
'user_agent' => $user_agent,
'created_at' => gmdate('Y-m-d H:i:s'),
] );
}
Filter bật tắt và khả năng kiểm soát hành vi
Filter init_html_sentinel_enabled cho phép tắt logging theo endpoint, action hoặc status code, giúp Init Sentinel linh hoạt trong môi trường có nhiều rule đặc thù.
Chống spam log và bảo vệ database
Việc sử dụng truy vấn EXISTS trong cửa sổ thời gian ngắn giúp hệ thống tránh ghi log lặp vô nghĩa, đặc biệt khi bị scan hoặc brute-force.
Lưu UTC và cleanup không cần cron
Tất cả log đều được lưu theo UTC để tránh lệch múi giờ. Cleanup được kích hoạt ngẫu nhiên với xác suất thấp nhằm duy trì bảng gọn gàng mà không cần cron job riêng.
Hook mở rộng và phản ứng bảo mật
Action init_html_security_event là điểm móc để triển khai các phản ứng nâng cao như cảnh báo, dashboard realtime hoặc tự động chặn IP.
Kết luận
Hàm core này là trái tim của Init Sentinel. Nó ưu tiên kỷ luật, hiệu năng và khả năng mở rộng hơn là phô trương, tạo nền tảng vững chắc cho mọi lớp bảo mật phía trên.
Ở bài tiếp theo, chúng ta sẽ đi vào việc ghi log lỗi 403 ở đúng hook WordPress và đúng ngữ cảnh request.
Bình luận