bonjour,
j'ai 22 variables de session, contenant la plupart un timestamp, est-ce trop ? Est-ce que cela ne va pas surcharger le serveur et le rendre trop lent
merci !
je précise que c'est un timestamp pour chacune des pages du site, qui vérifie que le dernier chargement de la page par le client remonte à plus de 5 secondes, pour éviter le spam, et qui enregistre ensuite le nouveau time() du moment où le client charge la page ![]()
Je désactives mes cookies et ta sécurité ne sert plus à rien. Sinon, utilises des array :
$_SESSION['pages_timestamps'] = array();
$_SESSION['pages_timestamps']['page1] = ton_timestamp;
$_SESSION['pages_timestamps']['page2] = ton_timestamp;
etc
pas de cookies = pas de session = pas d'affichage si (!isset($_SESSION))
ah oui je vais utiliser les arrays
merci !
Pour des raisons de politique de sécurité, les cookies ne sont pas activable sur des navigateurs. Bloquer l'accès à des pages car ta session n'existe pas est débile, d'autant plus que c'est pour éviter un "spam". Qui plus est, si tu veux un référencement de tes pages sur des moteurs, tu enverras chier des bots qui ne supportent pas tous les cookies.
en même temps il n'y a pas d'autre solutions pour éviter d'être spammer ![]()
Le client pourrait toujours s'amuser à recharger 1000 fois la page par seconde.
la plupart des pages de mon site varie en fonction de l'utilisateur (page qui donne des informations sur son compte, sur sa liste d'amis etc.) donc pas vraiment d'intérêt à être référencée, si seule la page d'accueil et d'information générale sont référencées c'est suffisant ... mais bon faudra pas que je mette de session sur ces pages alors
et donc je risque de me les faire spammer ![]()
Ne sois pas si parano. Pourquoi crois tu que tu vas te faire spammer ?
Au pire:
- tu utilises une BDD au lieu de sessions (tu compares les timestamp des IP, en excluant le contrôle de celle de Google/Yahoo/Bing pour les laisser bosser sur ton site tranquillement).
- tu regardes régulièrement tes logs et tu bloques les IP manuellement.
ça veut dire que vos sites ne sont pas protégés contre le spam ![]()
Non, ca veut dire que mes sites ne sont pas sujet au spam.
bon j'ai trouvé une solution 'alternative' en y réfléchissant bien.
je vais enregistrer l'ip + timestamp du spammeur présumé (celui qui cliquerai comme un ravagé pour recharger la page d'activation du compte nouvellement créé afin de mettre down le serveur).
dans un fichier "activation.txt",
première ligne : son ip
deuxième ligne : le timestamp
ensuite, à chaque chargement de la page, je vérifie dans le fichier si l'ip enregistrée correspond à $_SERVER['REMOTE_ADDR'], si c'est le cas et que le timestamp enregistré dans le fichier + 5 secondes est supérieur à time(), alors j'arrête le chargement de la page avec un "die()".
J'enregistre ensuite dans le fichier une ligne d'espaces par dessus l'ancienne ip et timestamp pour les effacer, puis le nouvel ip et nouveau timestamp.
Bon, si quelqu'un d'autre recharge la même page entre temps ça enregistrera son ip + timestamp à lui, mais si le spammeur utilise un logiciel ou clic comme un fou alors il y a peu de chance pour qu'un autre client clique entre temps, surtout pour la page d'activation, à moins que plein de gens active leur compte en même temps, donc ça lui cassera quand même son spam.
Pour la page d'accueil ce sera moins efficace car elle sera plus souvent sollicité par des clients différents.
voilà le code en question :
<?php
$activ = fopen('activation.txt', 'r');
$ipactiv = fgets($activ);
$timeactiv = fgets($activ);
fclose($activ);
$a = "\r\n";
$ip = $_SERVER['REMOTE_ADDR'].$a;
if (($ip === $ipactiv) and (time() < ($timeactiv + 5)))
{
die("<p>Vous avez déjà chargé la page il y a moins de 5 secondes</p><p><a href=index.php>retour</a></p>");
}
// attention, sous linux c'est "\n" seulement et pas "\r\n" et le "\r\n" rajoute 2 caractères invisibles à la fin de la 1ère ligne dans le fichier !
$activ = fopen('activation.txt', 'r+');
fseek($activ, 0);
fputs($activ, $_SERVER['REMOTE_ADDR']);
fputs($activ, "\r\n");
fputs($activ, time());
fclose($activ);
?>
Il ne mettra pas le serveur down en "refreshant" comme un sauvage. Il ne faut pas oublier que tu as un serveur web derrière qui est un minimum concerné par le "requêtage" http des clients. Je crois que tu juges mal les interventions à faire sur ton site web. D'une part, l'utilisation de fichier pour faire ça, surtout comme tu l'as fait n'est pas forcément optimisé et tu as désigné un des problèmes majeur : l'accès au fichier si deux clients arrivent "en même temps".
Je suis d'accord avec les propositions de m4estr0. J'ai mon serveur web (aussi "minable" qu'il l'est) et j'ai encore été sujet à un flood hier sur le wall : Quelques posts par seconde pendant quelques minutes. Pas de ralentissement (j'avais le nez dans les logs pour m'en rendre compte) et pourtant le bot floodait comme un porc.
Tu te prends bien la tête pour finalement ajouter une couche d'erreurs.
HS : si tu ne veux pas t'embêter avec les sauts de lignes différents sous Windows & Linux tu as la constante PHP_EOL. ![]()
ok merci !
je rencontre en petit problème en essayant de recopier le code sur une autre page avec un autre fichier, apparemment j'ai pas les droits en écriture malgré que j'ai mis "r+"
Warning: fseek(): 3 is not a valid stream resource in C:\wamp\www\site\enregistrement.php on line 25
24. $activ = fopen('enregistrement.txt', 'r+');
25. fseek($enreg, 0);
26. fputs($enreg, $_SERVER['REMOTE_ADDR']);
27. fputs($enreg, "\r\n");
28. fputs($enreg, time());
29. fclose($enreg);
pourtant la case "lecture seule" n'est pas cochée sur le fichier "enregistrement.txt" ![]()
non en fait c'est bon, c'était $enreg qu'il fallait à la ligne 24 ![]()
Presque ... tu risques de te spammer toi même en cas de gros trafic. Imagine 10 visiteurs uniques en ligne. Un chargement de page toutes les 10 secondes. Donc 60 requêtes minutes.
60*60*24*30 = 2.6 millions de requêtes par mois rien que pour ton système anti-spam ... ouch >_<.
(il est tard, je suis pas sûr de mes calculs xD)
C'est pour ça que je préfère encore l'ouverture/lecture/écriture/fermeture d'un fichier qu'un système de requêtes SQL, mais c'est surtout pour arrêter le chargement d'une page qui mènerait à faire une requête SQL, donc arrêter le chargement de la page avant qu'elle ait effectué la ou les requêtes.
Mais j'ai trouvé aussi un système intermédiaire :
par exemple ma page d'accueil affiche le nombre d'inscrit sur le site grâce à une requête COUNT qui compte le nombre de comptes dans la base de données, je voudrais pas qu'un spammeur qui "refresh" sans arrêt provoque des centaines de requêtes COUNT sur toute la table...
Donc j'ai mis le résultat du nombre d'inscrits dans un fichier avec le timestamp de la dernière requête COUNT ayant permis d'obtenir ce nombre, et toutes les dix minutes il est mis à jour, donc si un malin recharge la page sans arrêt ça affichera le résultat contenu dans le fichier, et au bout de 10 minutes seulement, quand le timstamp contenu dans le fichier sera devenu inférieur de 600 secondes au time() actuel alors la requête met à jour le fichier contenant le nombre d'inscrits.
On appel ça le cache ![]()
(qui plus est, une vraie solution)