jptilly
Messages postés2Date d'inscriptionvendredi 15 décembre 2000StatutMembreDernière intervention19 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és27Date d'inscriptionlundi 12 avril 2010StatutMembreDernière intervention15 octobre 20111 19 sept. 2011 à 08:12
Bonjour ARTA, tu ne la vois pas car il n'y en a pas.
cs_arta
Messages postés98Date d'inscriptiondimanche 22 janvier 2006StatutMembreDernière intervention24 juillet 2013 19 sept. 2011 à 06:24
Bonjour tous
Désolé mais je vois pas la balise de fermeture ?> ???
cod57
Messages postés1653Date d'inscriptiondimanche 7 septembre 2008StatutMembreDernière intervention11 septembre 201319 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és44Date d'inscriptiondimanche 12 mars 2006StatutMembreDerniè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és1653Date d'inscriptiondimanche 7 septembre 2008StatutMembreDernière intervention11 septembre 201319 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és27Date d'inscriptionlundi 12 avril 2010StatutMembreDernière intervention15 octobre 20111 12 sept. 2011 à 16:08
@X_CLI > Le corps de add_visitor devrait être comme ça ?
X_Cli
Messages postés44Date d'inscriptiondimanche 12 mars 2006StatutMembreDerniè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és1653Date d'inscriptiondimanche 7 septembre 2008StatutMembreDernière intervention11 septembre 201319 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és27Date d'inscriptionlundi 12 avril 2010StatutMembreDernière intervention15 octobre 20111 12 sept. 2011 à 11:21
Bonjour X_CLI,
Je vais poster une modification de mon code très rapidement.
X_Cli
Messages postés44Date d'inscriptiondimanche 12 mars 2006StatutMembreDerniè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és27Date d'inscriptionlundi 12 avril 2010StatutMembreDernière intervention15 octobre 20111 11 sept. 2011 à 20:42
cod57
Messages postés1653Date d'inscriptiondimanche 7 septembre 2008StatutMembreDernière intervention11 septembre 201319 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és27Date d'inscriptionlundi 12 avril 2010StatutMembreDernière intervention15 octobre 20111 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és1653Date d'inscriptiondimanche 7 septembre 2008StatutMembreDernière intervention11 septembre 201319 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és27Date d'inscriptionlundi 12 avril 2010StatutMembreDernière intervention15 octobre 20111 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és1653Date d'inscriptiondimanche 7 septembre 2008StatutMembreDernière intervention11 septembre 201319 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és27Date d'inscriptionlundi 12 avril 2010StatutMembreDernière intervention15 octobre 20111 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)
19 sept. 2011 à 18:08
{ $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);
}
19 sept. 2011 à 17:59
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.
19 sept. 2011 à 08:12
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.
19 sept. 2011 à 06:24
Désolé mais je vois pas la balise de fermeture ?> ???
12 sept. 2011 à 18:09
''F5 grrrr ... un javascript pour la dévalider''
... je plaisante ++
12 sept. 2011 à 17:25
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.
12 sept. 2011 à 16:39
'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é.
++
12 sept. 2011 à 16:08
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;
}
12 sept. 2011 à 15:47
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.
12 sept. 2011 à 15:02
@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
++
12 sept. 2011 à 11:21
Je vais poster une modification de mon code très rapidement.
12 sept. 2011 à 10:29
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
11 sept. 2011 à 20:42
11 sept. 2011 à 20:32
Mais desfois on a besoin d'un code simple et rapide et ton exemple est plus complet qu'une simple incrémentation ...
11 sept. 2011 à 20:08
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+
11 sept. 2011 à 20:02
Oui ton code peut être une alternative pour se passer de mysql
A++
11 sept. 2011 à 19:51
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 ?
11 sept. 2011 à 19:27
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("")');
11 sept. 2011 à 18:33
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 !