COMPTEUR DE VISITES SUR FICHIER

pierreSabatier Messages postés 27 Date d'inscription lundi 12 avril 2010 Statut Membre Dernière intervention 15 octobre 2011 - 11 sept. 2011 à 18:33
jptilly Messages postés 2 Date d'inscription vendredi 15 décembre 2000 Statut Membre Dernière intervention 19 septembre 2011 - 19 sept. 2011 à 18:08
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/53574-compteur-de-visites-sur-fichier

jptilly Messages postés 2 Date d'inscription vendredi 15 décembre 2000 Statut Membre Dernière intervention 19 septembre 2011
19 sept. 2011 à 18:08
function add_visitor($visitor, $date, $file = 'compteur.txt')
{ $ret= EXIT_FAILURE; if (TRUE ($pt fopen($file,'r+')))
{ if (flock($pt, LOCK_EX))
{
[...]

flock($pt, LOCK_UN);
$ret= EXIT_SUCCESS;
}
fclose($pt);
}
return($ret);
}
jptilly Messages postés 2 Date d'inscription vendredi 15 décembre 2000 Statut Membre Dernière intervention 19 septembre 2011
19 sept. 2011 à 17:59
Bonjour,

fopen sans fclose si flock return EXIT_FAILURE;

Dans ce cas c'est pas grave, on est en PHP avec un timeout sur l’exécution et flock avec cet argument bloque jusqu'au SUCCESS
C'est le timeout qui va terminer le script et fermer le fichier si flock fail.
pierreSabatier Messages postés 27 Date d'inscription lundi 12 avril 2010 Statut Membre Dernière intervention 15 octobre 2011 1
19 sept. 2011 à 08:12
Bonjour ARTA, tu ne la vois pas car il n'y en a pas.

Je te renvoie à l'un des premiers cours de php : http://www.php.net/manual/fr/language.basic-syntax.instruction-separation.php . La balise fermante est facultative voire gênante sur les fichiers de fonctions comme celui-ci.
cs_arta Messages postés 98 Date d'inscription dimanche 22 janvier 2006 Statut Membre Dernière intervention 24 juillet 2013
19 sept. 2011 à 06:24
Bonjour tous

Désolé mais je vois pas la balise de fermeture ?> ???
cod57 Messages postés 1653 Date d'inscription dimanche 7 septembre 2008 Statut Membre Dernière intervention 11 septembre 2013 19
12 sept. 2011 à 18:09
@X_Cli en fait tu as raison, on ne sait jamais comment le site est utilisé ou visité.
''F5 grrrr ... un javascript pour la dévalider''
... je plaisante ++
X_Cli Messages postés 44 Date d'inscription dimanche 12 mars 2006 Statut Membre Dernière intervention 2 mars 2013
12 sept. 2011 à 17:25
@pierreSabatier: pour un site à petite affluence, ce genre de fix peut marcher. Pour un site à plus grande affluence, on pourrait imaginer un fichier de lock par IP.
Il manque toujours le contrôle de l'IP (tu peux utiliser par exemple la regexp que j'aimis dans mon source pour valider les IPv4, reste à faire celle pour les IPv6), car sans cela il y a un risque de déni de service (par remplissage de l'espace disque).

@cod57 : ou alors un "site qui rame" et un utilisateur qui fait "Rafrachir" et les différentes connexions arrivent simultanément. Tu serais surpris du nombre de gens qui, lorsque leur réseau domestique WIFI rame, martèlent avec frénésie (3 ou 4 fois par seconde) le bouton de rafraichissement de la page (quand ils ne restent pas appuyés sur F5/Ctrl+R). Il y a des dizaines de bonnes raisons que plusieurs connexions se fassent simultanément qui ne sont pas des attaques, mais des connexion légitimes.
cod57 Messages postés 1653 Date d'inscription dimanche 7 septembre 2008 Statut Membre Dernière intervention 11 septembre 2013 19
12 sept. 2011 à 16:39
@X_CLI
'condition intervient notamment si plusieurs connexions arrivent simultanément' === DOS,DDOS,udpflood ... selon moi un utilisateur lambda ne fait pas ça.
Autrement oui pour le lock, c'est d'ailleurs conseillé.
++
pierreSabatier Messages postés 27 Date d'inscription lundi 12 avril 2010 Statut Membre Dernière intervention 15 octobre 2011 1
12 sept. 2011 à 16:08
@X_CLI > Le corps de add_visitor devrait être comme ça ?

function add_visitor($visitor, $date, $file = 'compteur.txt'){
$pt = fopen($file,'r+');
if (!flock($pt, LOCK_EX)) {
return EXIT_FAILURE;
}
[...]
fwrite($pt, $entry);
flock($pt, LOCK_UN);
fclose($pt);
return EXIT_SUCCESS;
}
X_Cli Messages postés 44 Date d'inscription dimanche 12 mars 2006 Statut Membre Dernière intervention 2 mars 2013
12 sept. 2011 à 15:47
Bonjour cod57,
Note bien que je parle de bug de type race condition et non d'attaque, contrairement à l'attaque sur entete HTTP.
Une race condition intervient notamment si plusieurs connexions arrivent simultanément depuis le même client : plusieurs entrées peuvent être ajoutées pour son IP, ou alors l'incrémentation, si l'IP a déjà été enregistrée peut n'être incrémentée qu'une fois pour deux visites. Il faut un mécanisme de lock pour l'accès au fichier.
Le web n'étant pas spécialement friand de lock (du moins dans les scripts php), ce genre de compteur est mieux s'il est réalisé avec un processus résidant qui recoit des appels (genre une trame UDP) par visite, et met à jour à interval régulier un fichier de compteurs.
cod57 Messages postés 1653 Date d'inscription dimanche 7 septembre 2008 Statut Membre Dernière intervention 11 septembre 2013 19
12 sept. 2011 à 15:02
bonjour
@X_Cli pour une attaque de type race il faudrait pouvoir écrire du contenu dans la variable qui reste coté serveur ($_SERVER) inaccessible ? Si tu penses que ça peut passer ?
Une solution de solution serait un fake un .tmp aleatoire mais je vois pas l'attaque race la dedans peut tu m'expliquer ton idée

++
pierreSabatier Messages postés 27 Date d'inscription lundi 12 avril 2010 Statut Membre Dernière intervention 15 octobre 2011 1
12 sept. 2011 à 11:21
Bonjour X_CLI,

Je vais poster une modification de mon code très rapidement.
X_Cli Messages postés 44 Date d'inscription dimanche 12 mars 2006 Statut Membre Dernière intervention 2 mars 2013
12 sept. 2011 à 10:29
Bonjour,
Votre code contient des bugs de type race condition (je vous laisse faire une recherche google pour voir de quoi il s'agit, vous les trouverez facilement par vous même, après coup), ainsi qu'une faille de sécurité pouvant mener à un déni de service, puisque le champ $visitor n'est pas limité en terme de taille, et qu'il peut, si j'ai bien compris le fonctionnement de votre application, être manipulé à volonté par l'attaquant puisqu'on utilise l'entête HTTP_X_FORWARDED_FOR pour l'alimenter. Vous pouvez me répliquer que les contrôles sur les valeurs peuvent être fait en dehors de vos fonctions, et qu'ils sont à la charge de l'utilisateur de votre librairie, mais à ce moment, un exemple serait le bienvenue afin d'éviter que des débutants fassent "add_visitor(get_ip(), " ...
Bon courage pour les corrections,
Cordialement,
X_Cli
pierreSabatier Messages postés 27 Date d'inscription lundi 12 avril 2010 Statut Membre Dernière intervention 15 octobre 2011 1
11 sept. 2011 à 20:42
Si tu fais référence à ce script : http://www.phpcs.com/codes/COMPTEUR-VISITE-FICHIER-TXT-CODE-MINIMAL_53389.aspx , oui, mon exemple est plus complet, et plus utile je crois.
cod57 Messages postés 1653 Date d'inscription dimanche 7 septembre 2008 Statut Membre Dernière intervention 11 septembre 2013 19
11 sept. 2011 à 20:32
@ on code ne remplacera cependant jamais un SGBD.
Mais desfois on a besoin d'un code simple et rapide et ton exemple est plus complet qu'une simple incrémentation ...
pierreSabatier Messages postés 27 Date d'inscription lundi 12 avril 2010 Statut Membre Dernière intervention 15 octobre 2011 1
11 sept. 2011 à 20:08
Super si ça fonctionne.

Mon code ne remplacera cependant jamais un SGBD. En effet, MySql fait de bonnes choses et ce que j'ai écrit reste très simple.

Mais merci, je prend ça pour un encouragement.

A+
cod57 Messages postés 1653 Date d'inscription dimanche 7 septembre 2008 Statut Membre Dernière intervention 11 septembre 2013 19
11 sept. 2011 à 20:02
Oui en effet j'avais un echo qui trainé (pas vu, scuzy) ... ça à l'air de bien fonctionner maintenant ...
Oui ton code peut être une alternative pour se passer de mysql

A++
pierreSabatier Messages postés 27 Date d'inscription lundi 12 avril 2010 Statut Membre Dernière intervention 15 octobre 2011 1
11 sept. 2011 à 19:51
COD57 > session_start() doit toujours être appelé avant le moindre affichage (même un espace, ou un retour chariot), c'est la source de ton erreur.

Je n'ai pas fait de zip, mais il faut voir deux fichiers distincts :
- le premier s'arrête ligne 44, il s'agit du fichier de fonction que j'ai appelé "visite.php",
- le second est un fichier de test, que j'ai placé dans le même répertoire (je l'ai appelé "visite_test.php")

Pour les assert, oui, tu les configures bien. C'est plus propre que mon WARNING.

Et qu'en penses-tu ?
cod57 Messages postés 1653 Date d'inscription dimanche 7 septembre 2008 Statut Membre Dernière intervention 11 septembre 2013 19
11 sept. 2011 à 19:27
bonjour

j'ai une une erreur already ... donc j'ai mis session_start()
en début de fichier
il faut activer assert donc
// Activation des assertions et mise en mode discret
assert_options(ASSERT_ACTIVE, 1);
assert_options(ASSERT_WARNING, 0);
assert_options(ASSERT_QUIET_EVAL, 1);

// Création d'un gestionnaire d'assertions
function my_assert_handler($file, $line, $code)
{
echo "<hr>Échec de l'assertion :
File '$file'

Line '$line'

Code '$code'
<hr />";
}

// Configuration de la méthode de callback
assert_options(ASSERT_CALLBACK, 'my_assert_handler');

// Utilisation d'une assertion qui va échouer
assert('mysql_query("")');
pierreSabatier Messages postés 27 Date d'inscription lundi 12 avril 2010 Statut Membre Dernière intervention 15 octobre 2011 1
11 sept. 2011 à 18:33
Bonjour tout le monde,

le code à proprement parler, s'arrête ligne 44. La suite est une batterie de 4 tests.

On l'utilise comme ça, en début de script :
<?php
visite();
?>

Vous avez peut-être compris que la variable $_SESSION['welcome'] est à TRUE à la première visite, puis à FALSE. Utile pour ceux qui veulent afficher un texte dynamique sur cet événement (l'entrée sur le site)

Allez, j'attends vos réactions !
Rejoignez-nous