Limitation utilisateur a 1 ouverture de la page [Résolu]

Signaler
Messages postés
28
Date d'inscription
mardi 4 mars 2008
Statut
Membre
Dernière intervention
30 mai 2009
-
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
-
Bonjour,

Je suis actuellement dans une impasse...
Je souhaiterai que l'utilisateur,ne puisse que ouvrir 1 fois une page x.php et non plusieurs.
-Je dispose d'une base mysql,ou chaque utilisateur est répertorié avec son utilisateur son mdp et son ip.
Avez vous des idées?Peut etre peut-on faire cela sans base mysql?

Merci de votre aide,désespéré...

13 réponses

Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
25
Avant tout:
Je ne connais pas ton code ni son but exact (gagner 1000 euros, gagner une image ?) mais ta méthode restera aléatoire.
D'une part ça n'est pas représentatif du temps passé par l'internaute devant ta page et surtout ce temps peut varier d'une machine à l'autre. Ce n'est pas parce que tu mets un setInterval à 10 secondes que ce sera 10 secondes côté serveur. Il y a la vitesse de la connexion, celle du PC, etc etc... Ainsi certains utilisateurs produiront des requêtes côté serveur toutes les 11 secondes, d'autres 13 secondes, voir plus. Tu peux rapidement te retrouver avec des différences de points obtenus importantes pour le même temps passé sur la page.

Je n'ai pas testé, mais tu dois pouvoir faire qqchose comme ça :
Tu crées un champ last_update
Tu envoies une requête vers le serveur toutes les 3..5 secondes via Ajax (ou une balise meta, ou set interval, mais c'est "plus moins bien" :) )
Dans ton script tu fais simplement un truc du genre :
UPDATE test02 SET last_update=NOW(), points=points+10 WHERE last_update < NOW()-10

Cordialement,

Kohntark -
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
25
Salut,

Il n'y a pas de quoi être désespéré 

Un simple champ supplémentaire dans ta DB devrait suffire, par ex visited.

Au tout début de ta page x.php tu contrôles que le champ visited est à false :
- il ne l'est pas => redirection
- il l'est => autorisation de visu de la page, update du champ visited à true.

Selon comment est appelé la page tu peux supprimé le(s) lien(s) qui y mènent.

Kohntark -
Messages postés
28
Date d'inscription
mardi 4 mars 2008
Statut
Membre
Dernière intervention
30 mai 2009

J'y avais pensé,
Mais il y a un probléme,une fois que la variable est true elle le reste...
Par exemple,le visiteur ouvre 1 fois x.php et puis une deuxiéme fois x.php,la cela va marché.
Mais ensuite il ferme tout et en re-ouvre juste une,il n'y aura pas accée,hors je veut qu'il ai l'accée
Messages postés
28
Date d'inscription
mardi 4 mars 2008
Statut
Membre
Dernière intervention
30 mai 2009

Enfaite,dans la page x.php,ce trouve un script,et je veut seulement qu'il ne s'éxécute pas 2 fois ou plus,si l'utilisateur recopie l'adresse et l'ouvre dans plusieurs page...
Messages postés
1309
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
12
Salut,

Vu le problème la réponse est très simple : dit comme ça c'est impossible. Garde en mémoire que la communication entre le client et le serveur est complètement asynchrone, une fois que le serveur a envoyé la page il ne sais rien de ce qui se passe chez le client, tu ne peux pas savoir si le client ferme une page ou la laisse ouverte.

Après, tu parle d'un script qui s'exécute. Si c'est un script côté client ou qui interagit avec le serveur, alors il peut peut être limiter de lui même le nombre d'exécutions simultanées. Ceci sous entends que ton script a une certaine durée dans le temps (percevable par un humain).
Messages postés
28
Date d'inscription
mardi 4 mars 2008
Statut
Membre
Dernière intervention
30 mai 2009

salut ;)

Dans cette page s'éxécute des requéte mysql,toutes les 10sec des requetes,nous allons dire pour simplifier que l'utilisateur gagne 10pts toute les 10sec donc...
Si un utilisateur mal intentionné,éxécute deux fois la page par exemple il ne gagnera plus 10pts toute les 10sec,mais 20pts!

J'ai pensé peut étre a une solution avec les session,mais cela ne résoudrai mon probléme que pour 1 navigateur.

Merci en tout cas d'essayer de m'aider;)
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
25
Salut,

En fait la question de départ n'était pas très claire
D'ailleurs j'ai toujours du mal à saisir :
Puisque tu es basé sur un temps et que ta requête SQL s'exécute côté serveur pourquoi ne pas contrôler tout simplement que le dernier update date d'au moins 10 secondes ? Après que tu ai 1 appel du client ou 10000 ça ne changera rien.

Peux tu être plus précis sur la gestion de ces 10 s ?

@TychoBrahe :
tu ne peux pas savoir si le client ferme une page ou la laisse ouverte.
Permets moi de ne pas être d'accord, c'est tout à fait possible avec un petit coup d'ajax.

Cordialement,

Kohntark -
Messages postés
1309
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
12
Salut,

@Kohntark: l'ajax n'est pas fiable du tout, et c'est la même chose pour tout ce qui s'effectue côté client. Quand on vois que l'addon pour FireFox NoScript est téléchargé environ 530 000 fois par semaines on se dit que le JavaScript on se pose de grosses questions quand a la fiabilité du JS. Quand a ceci on ajoute les 300 000 téléchargeents par semaine de l'extension Greasenonkey on ne peut vraiment pas considérer je JS comme une solution au problème.

Passons le fait que tu ne peux pas différencier un utilisateur légitime d'un bot et que le procédé que tu décris ne fonctionne pas avec de nombreux utilisateurs, je me permet de te rappeller que s'il existais un mouchard fiable permettant ce genre de choses, alors il serais de facto illégal.
Messages postés
28
Date d'inscription
mardi 4 mars 2008
Statut
Membre
Dernière intervention
30 mai 2009

Ta solution kohntark,de vérifier si le dernier update date d'au moins 10 sec me plait bien!
Cependant,je ne voit pas comment je pourrai procédé,il existe peut etre une fonction php qui permettrait de chronométré le temps entre 2 requetes?

En ce qui concerne la gestion de mes 10sec,la page est rafraichit toute les 10sec par javascript avec un SetInterval,le tout contenu dans une frame invisible,pour que l'utilisateur ne s'amuse a rafraichir la page manuellement.

En ce qui concerne la fiabilité de JS,cela n'est pas grave car la page étant rafraichit par SetInterval,si l'utilisateur désactive JS alors il ne perçevra que les points du 1er chargement de la page(cela ne me géne pas).

Peut être sommes-nous proches de la solution...:)
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
25
Salut TychoBrahe,

Nous sommes bien d'accord sur le fait que tout ce qui est exécuté côté client n'est pas fiable, mais il faut aussi garder à l'esprit qu'il n'est pas toujours nécessaire de blindé la sécurité de certaines fonctionnalités. Par exemple pour un compteur de connectés est ce vraiment utile ? Qui se prendrait la tête à développer un bot pour ajouter virtuellement des connectés ? Quels problèmes cela poserait ?
Toi même tu utilises bien Ajax pour faire ce genre de chose, non ?

En ce qui concerne la piste que je donnais à Maxs la question ne se pose pas puisqu'il y a un contrôle côté serveur.
Que l'utilisateur insère du code JS pour faire 1000 requêtes à la minute ne change rien.

Après, effectivement, on ne peut pas savoir si c'est un bot (quoiqu'on puisse complexifier à outrance pour rendre difficile sa réalisation) ou si l'utilisateur est physiquement devant son écran.

[...]et que le procédé que tu décris ne fonctionne pas avec de nombreux utilisateurs
=>
juste mon avis :
je ne tiens plus compte des utilisateurs qui désactivent JS, sauf pour les sites très simples.
A quoi bon le désactiver ? la sécurité ? Quand on voit que certaines personnes font ça alors qu'elles utilisent IE et une connexion wifi il y a de quoi se poser des questions. En ce qui concerne l'entreprise c'est un autre débat (quoique)

Bonne soirée à toi,

Kohntark -
Messages postés
28
Date d'inscription
mardi 4 mars 2008
Statut
Membre
Dernière intervention
30 mai 2009

Je vais faire sa,avec mon SetInterval s'éxécutant toute les 10sec ne connaissant pas le Javax^^
Mais il y a une chose que je ne comprend pas dans la requete...

Now(),ne renvoit t'elle pas une date et une heure?Qui nous dit que -10 correspond aux secondes?

En tout cas merci pour ton aide précieuse Kohntark
Messages postés
28
Date d'inscription
mardi 4 mars 2008
Statut
Membre
Dernière intervention
30 mai 2009

J'ai finis par réussir! merci Kohntark et les autres biensur^^,une seule erreur dans ton code c'est qu'il fallait mettre (NOW() + 0) dans la requête pour que NOW() soit sous la forme 20090409185834

Merci a tous;) Bye
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
25
En voilà une bonne chose :)
Je viens de faire un test sur la requête, elle fonctionne chez moi (je n'ai cependant pas testé à fond)
Quel est le type de champ que tu utilises ? Quelle version de mySql ?
Ma requête produit une erreur ? pas d'update ?

L'essentiel est bien sur que ça marche !!

Cordialement,

Kohntark -