[ '_ga', '_gid', '_gat', '__utm', '_clck', '_clsk', 'AMP_', 'mp_', 'mixpanel', '_pk_', 'piwik', '_hjSession', '_hjAbsoluteSessionInProgress', 'hubspotutk' ], 'marketing' => [ '_fbp', '_fbc', 'fbsr_', 'IDE', 'NID', 'DSID', 'FLC', 'AID', 'TAID', 'gads', 'GPS', 'YSC', 'VISITOR_INFO', '__qca', '_uetsid', '_uetvid' ], 'functional' => [ 'lang', 'locale', 'theme', 'sidebar', 'tz', 'cookieconsent', 'darkmode', 'i18n' ], 'necessary' => [ 'PHPSESSID', 'wordpress_logged_in', 'wp-settings-', 'wordpress_test_cookie', 'wp_lang', 'comment_author_', 'XSRF-TOKEN', 'csrf_token', '__cf', 'cf_clearance' ], ]; /** Scan home URL, return array of cookies seen. */ public static function scan( string $url = '' ): array { $url = $url ?: home_url( '/' ); $args = [ 'timeout' => 15, 'redirection' => 3, 'sslverify' => false, 'cookies' => [], 'headers' => [ 'User-Agent' => 'aGo Legal Cookie Scanner/1.0' ], ]; $response = wp_remote_get( $url, $args ); if ( is_wp_error( $response ) ) { return [ 'ok' => false, 'error' => $response->get_error_message() ]; } $cookies = wp_remote_retrieve_cookies( $response ); $body = (string) wp_remote_retrieve_body( $response ); $scanned = []; // Headers Set-Cookie foreach ( $cookies as $c ) { $name = $c->name ?? ''; if ( ! $name ) continue; $scanned[ $name ] = [ 'name' => $name, 'category' => self::classify( $name ), 'source' => 'header', 'description' => self::describe( $name ), ]; } // Heuristic: scan body for "document.cookie =" or "Cookies.set('" if ( preg_match_all( "/document\\.cookie\\s*=\\s*['\"]([a-zA-Z0-9_\\-]+)=/", $body, $m ) ) { foreach ( $m[1] as $name ) { if ( ! isset( $scanned[ $name ] ) ) { $scanned[ $name ] = [ 'name' => $name, 'category' => self::classify( $name ), 'source' => 'inline-js', 'description' => self::describe( $name ), ]; } } } // Detect third-party scripts $third_party = []; if ( preg_match_all( '/]+src=["\']([^"\']+)["\']/i', $body, $m ) ) { foreach ( $m[1] as $src ) { $host = wp_parse_url( $src, PHP_URL_HOST ); if ( $host && $host !== wp_parse_url( home_url(), PHP_URL_HOST ) ) { $third_party[ $host ] = ( $third_party[ $host ] ?? 0 ) + 1; } } } return [ 'ok' => true, 'url' => $url, 'scanned_at' => current_time( 'mysql' ), 'cookies' => array_values( $scanned ), 'third_party' => $third_party, ]; } public static function classify( string $name ): string { foreach ( self::PATTERNS as $cat => $patterns ) { foreach ( $patterns as $p ) { if ( stripos( $name, $p ) !== false ) return $cat; } } return 'unclassified'; } public static function describe( string $name ): string { $known = [ '_ga' => 'Google Analytics - identificador de usuario', '_gid' => 'Google Analytics - identificador de sesión', '_gat' => 'Google Analytics - control de rate', '_fbp' => 'Meta Pixel - identificador de navegador', '_fbc' => 'Meta Pixel - identificador de click', 'PHPSESSID' => 'Sesión PHP - mantiene el estado del usuario en el servidor', 'wordpress_logged_in' => 'WordPress - identifica usuario autenticado', '_hjSession' => 'Hotjar - sesión de heatmap', '__cf_bm' => 'Cloudflare Bot Management - prevención de bots', 'cf_clearance' => 'Cloudflare - protección anti-bot', ]; foreach ( $known as $k => $desc ) { if ( stripos( $name, $k ) === 0 ) return $desc; } return ''; } /** Save scan result as the active cookie table. */ public static function persist_as_cookie_table( array $scan ): void { if ( empty( $scan['cookies'] ) ) return; $entries = []; foreach ( $scan['cookies'] as $c ) { $entries[] = [ 'name' => $c['name'], 'category' => $c['category'], 'description' => $c['description'], 'duration' => '', ]; } $settings = get_option( 'agolegal_settings', [] ); $settings['cookie_table'] = wp_json_encode( $entries ); update_option( 'agolegal_settings', $settings ); } }