From 73414fa639c4c56f5df7a335c1f866fefbefef62 Mon Sep 17 00:00:00 2001 From: David Bailey Date: Tue, 8 Apr 2025 10:04:39 +0200 Subject: [PATCH 1/2] feat(analytics): :sparkles: add request status field --- www/src/db_handler/analytics_interface.php | 2 +- www/src/db_handler/mysql_analytics_handler.php | 3 ++- www/src/serve/post.php | 2 ++ www/src/setup/analytics.php | 7 ++++++- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/www/src/db_handler/analytics_interface.php b/www/src/db_handler/analytics_interface.php index 6ec9f67..473c1e6 100644 --- a/www/src/db_handler/analytics_interface.php +++ b/www/src/db_handler/analytics_interface.php @@ -8,7 +8,7 @@ interface AnalyticsInterface { public function log_path_access( $path, $agent, - $referrer, $runtime); + $referrer, $runtime, $status = 200); public function log_path_errcode( $path, diff --git a/www/src/db_handler/mysql_analytics_handler.php b/www/src/db_handler/mysql_analytics_handler.php index d6b1eb1..2906e59 100644 --- a/www/src/db_handler/mysql_analytics_handler.php +++ b/www/src/db_handler/mysql_analytics_handler.php @@ -72,7 +72,7 @@ class MySQLAnalyticsHandler $path, $agent, $referrer, - $time) { + $time, $status = 200) { if(strlen($path) == 0) { $path = '/'; @@ -83,6 +83,7 @@ class MySQLAnalyticsHandler 'path' => $path, 'agent' => $agent, 'referrer' => $referrer, + 'status' => $status ], 'access_sum'); $this->increment_counter([ diff --git a/www/src/serve/post.php b/www/src/serve/post.php index 46ef71c..84c10a5 100644 --- a/www/src/serve/post.php +++ b/www/src/serve/post.php @@ -107,6 +107,8 @@ if($REQUEST_PATH == '/search/') { $post = $adapter->get_post($REQUEST_PATH); if(!isset($post)) { + $analytics_return_status = 404; + $error_page = $SITE_CONFIG['site_defaults']; $error_page['path'] = '/404'; $error_page['title'] = '404 oh no'; diff --git a/www/src/setup/analytics.php b/www/src/setup/analytics.php index e045c68..91f032f 100644 --- a/www/src/setup/analytics.php +++ b/www/src/setup/analytics.php @@ -5,6 +5,9 @@ $data_time_start = microtime(true); $analytics_enable_tail = false; $analytics_post = null; +$analytics_return_status = 200; + + function deduce_user_agent() { $real_agent=$_SERVER['HTTP_USER_AGENT']; @@ -34,6 +37,8 @@ register_shutdown_function(function() { global $analytics_enable_tail; + global $analytics_return_status; + $data_time_end = microtime(true); $http_referer = 'magic'; @@ -48,7 +53,7 @@ register_shutdown_function(function() { $analytics_adapter->log_path_access($REQUEST_PATH, deduce_user_agent(), $referrer, - $compute_time); + $compute_time, $analytics_return_status); if($analytics_enable_tail) { echo ""; From bbc093b4973e9958dc30d87617481035dfd78718 Mon Sep 17 00:00:00 2001 From: David Bailey Date: Tue, 8 Apr 2025 10:05:13 +0200 Subject: [PATCH 2/2] feat(analytics): :sparkles: add filters/detectors for assumed-bogus requests --- dragon_fire.code-workspace | 3 ++- www/src/setup/analytics.php | 41 +++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/dragon_fire.code-workspace b/dragon_fire.code-workspace index f870583..265fc75 100644 --- a/dragon_fire.code-workspace +++ b/dragon_fire.code-workspace @@ -12,7 +12,8 @@ "search", "templates", "css", - "database" + "database", + "analytics" ] } } \ No newline at end of file diff --git a/www/src/setup/analytics.php b/www/src/setup/analytics.php index 91f032f..edeb50e 100644 --- a/www/src/setup/analytics.php +++ b/www/src/setup/analytics.php @@ -7,6 +7,22 @@ $analytics_post = null; $analytics_return_status = 200; +$analytics_known_bogus_requests = [ + '/\.(git|env|aws|xmlrpc|well-known|svn)/', + '/^\/wp-/', + '/^\/ID3/', + '/^\/config/', + '/^\/web\.config/', + '/^\/storage/', + '/^\/web\/config\.php/', + '/^\/phpinfo\.php/', + '/^\/swagger\.json/', + '/^\/package\.json/', + '/^\/info\.php/', + '/^\/db\.ini/', + '/^\/administrator/' +]; +$analytics_request_is_bogus = null; function deduce_user_agent() { $real_agent=$_SERVER['HTTP_USER_AGENT']; @@ -22,6 +38,27 @@ function deduce_user_agent() { } } +function analytics_is_bogus_request() { + global $analytics_request_is_bogus; + global $analytics_known_bogus_requests; + + global $REQUEST_PATH; + + if(isset($analytics_request_is_bogus)) { + return $analytics_request_is_bogus; + } + + foreach($analytics_known_bogus_requests AS $bogus_check) { + if(preg_match($bogus_check, $REQUEST_PATH)) { + $analytics_request_is_bogus = true; + return true; + } + } + + $analytics_request_is_bogus = false; + return false; +} + function analytics_is_user() { return preg_match('/^user/', deduce_user_agent()); } @@ -50,6 +87,10 @@ register_shutdown_function(function() { $compute_time = $data_time_end - $data_time_start; + if(analytics_is_bogus_request()) { + $analytics_return_status = 'bogus'; + } + $analytics_adapter->log_path_access($REQUEST_PATH, deduce_user_agent(), $referrer,