track
track
SYNOPSIS
track($request_uri=false, $track_agent=false)
DESCRIPTION
track enregistre chaque requête HTTP traitée par la fonction dispatch du moteur dans un journal, dans la base de données ou les deux.
IMPORTANT : Pour activer le suivi des requêtes, mettez $track_visitor à true dans config.inc et activez au moins un mode d'enregistrement en mettant $track_db ou $track_log à true.
Le journal est enregistré dans le fichier track.log dans le dossier log si $track_log vaut true, ou dans le fichier dont le nom est indiqué par $track_log.
Si $track_visitor_agent vaut true, la chaîne User-Agent du visiteur est également enregistrée.
Si $track_agent_blacklist est un tableau, les requêtes dont le User-Agent contient l'une des signatures indiquées sont ignorées.
IMPORTANT : La quantité de données générées peut rapidement remplir la BD et le journal.
Une grande partie du trafic consistera en des requêtes automatisées provenant de robots analysant les sites web à la recherche de vulnérabilités.
Listez les signatures des robots dans le paramètre $track_visitor_agent.
Optez pour un seul mode en mettant $track_db ou $track_log à false.
Une fois une campagne d'analyse du type des clients du site (navigateurs, smatphones, robots, etc.) terminée, laissez le paramètre $track_visitor_agent à false.
CODE
- require_once 'clientipaddress.php';
- require_once 'validateipaddress.php';
- require_once 'requesturi.php';
- require_once 'useragent.php';
- require_once 'validateuseragent.php';
Charge les fonctions client_ip_address, validate_ip_address, request_uri, user_agent et validate_user_agent.
- function track($request_uri=false, $track_agent=false) {
- global $track_log, $track_db;
- global $track_agent_blacklist;
- if (! ($track_log or $track_db) ) {
- return true;
- }
- if (!$request_uri) {
- $request_uri=request_uri();
- }
- if (!$request_uri) {
- return false;
- }
track sort immédiatement si les variables globales $track_log et $track_db sont false.
Si le paramètre $request_uri n'est pas défini, track l'initialise en appelant la fonction request_uri.
Si $request_uri n'est toujours pas défini, track sort.
- $user_agent=false;
- if ($track_agent or $track_agent_blacklist) {
- $user_agent=user_agent();
- if (!validate_user_agent($user_agent)) {
- $user_agent=false;
- }
- if ($user_agent and $track_agent_blacklist) {
- $reg = '/' . implode('|', $track_agent_blacklist) . '/i';
- if (preg_match($reg, $user_agent)) {
- return true;
- }
- }
- }
Si le paramètre $track_agent vaut true ou si le paramètre $track_agent_blacklist est défini, la variable $user_agent est initialisée en appelant la fonction user_agent et validée.
Si $user_agent est défini et si sa valeur correspond à une des signatures listées dans $track_agent_blacklist, track sort.
- $r = true;
- if ($track_log) {
- require_once 'log.php';
- $logmsg = $request_uri;
- if ($user_agent) {
- $logmsg .= "\t" . $user_agent;
- }
- $r = write_log($track_log === true ? 'track.log' : $track_log, $logmsg);
- if (!$r) {
- return false;
- }
- }
Si la variable globale $track_log vaut true, track charge le code de la fonction write_log et lui demande de journaliser la requête et éventuellement l'agent dans le fichier dont le nom est défini par $track_log ou appelé track.log par défaut.
- if ($track_db) {
- $ip_address=client_ip_address();
- if (!validate_ip_address($ip_address)) {
- return false;
- }
- $sqlipaddress=db_sql_arg($ip_address, false);
- $sqlrequesturi=db_sql_arg($request_uri, true);
- $sqluseragent=db_sql_arg($user_agent, true, true);
- $tabtrack=db_prefix_table($track_db === true ? 'track' : $track_db);
- $sql="INSERT INTO $tabtrack (ip_address, request_uri, user_agent) VALUES (INET_ATON($sqlipaddress), $sqlrequesturi, $sqluseragent)";
- $r = db_insert($sql);
- if (!$r) {
- return false;
- }
- }
- return true;
- }
Si la variable globale $track_db vaut true, track récupère l'adresse IP du client et la valide puis prépare et exécute un ordre SQL qui enregistre les paramètres de la requête dans la table dont le nom est défini par $track_db ou appelée track par défaut.
UTILISATION
Pour afficher le contenu du journal :
$ tail track.log
Pour compteur le nombre de visiteurs :
$ cut -f 1 track.log | cut -d' ' -f 3 | sort | uniq | wc -l
Pour lister les 10 pages les plus visitées :
$ cut -f 2 track.log | sort | uniq -c | sort -rn | head -10
Pour vérifier la BD :
mysql> SELECT * FROM track;
NOTE : Si nécessaire, ajoutez le préfixe $db_prefix défini dans db.inc au début du nom de la table track.
Pour compter le nombre total de visiteurs :
mysql> SELECT COUNT(DISTINCT ip_address) from track;
Pour lister les 10 pages les plus consultées :
mysql> SELECT request_uri, COUNT(request_uri) AS count from track GROUP BY request_uri ORDER BY count DESC LIMIT 10;
VOIR AUSSI
engine, log, requesturi, useragent, validateuseragent, clientipaddress, validateipaddress
Commentaires