2010-03-21 4 views
4

Je suis allé à un entretien d'emploi PHP, on m'a demandé de mettre en œuvre un morceau de code pour détecter les visiteurs sont des robots pour ramper sur le site et voler du contenu.Variable d'application PHP ... peut-être?

J'ai donc implémenté quelques lignes de code pour détecter si le site est rafraîchi/visité trop rapidement/souvent en utilisant une variable de session pour stocker l'horodatage de la dernière visite. On m'a dit que les variables de session peuvent être manipulées par des cookies, etc. Je me demande donc s'il existe une variable d'application que je peux utiliser pour stocker les informations d'horodatage sur les adresses IP des visiteurs, par exemple $ _SERVER [REMOTE_ADDR]? Je sais que je peux écrire les données dans un fichier, mais ce n'est pas très bon pour un site Web à fort trafic.

Cordialement

James

+2

Il se peut que je manque quelque chose, mais la signification de votre titre m'échappe. –

Répondre

4

Je me suis dit que la session varaibles peuvent être manupilated par les cookies etc,

Pour être clair, les clients ne peuvent pas modifier les variables de session à leur goût. Ils peuvent cependant supprimer ou modifier PHPSESSID, ce qui autorise une autre session. Les variables globales (par exemple, $_SERVER) ne sont pas persistantes. Par conséquent, les modifications que vous leur apportez ne seront pas répercutées sur le chargement de la page suivante. Le meilleur moyen de détecter les robots d'exploration consiste à stocker l'adresse IP, l'agent utilisateur et l'horodatage de tous les chargements de pages dans une base de données. Les frais généraux sont minuscules.

+0

Je * crois * que la session peut être piratée si l'identifiant de la session est porté dans l'URL –

+0

Mais les clients ne peuvent pas accepter les cookies, contrecarrant l'utilisation des sessions basées sur les cookies. Cependant, les sessions basées sur IP devraient être légèrement plus fiables. –

+0

Clients * choisissez * d'envoyer ou non des cookies et quels cookies envoyer. C'est le but. – cletus

1

En un mot, pas. Vos options sont les cookies, les variables de session (aka cookies côté serveur) et le stockage (fichier/db).

+1

vars de session/cookies côté serveur ?? Comment l'utilisateur est identifié alors? (afin que le serveur sache quelle session charger). C'est tout l'intérêt des cookies étant côté client. – mpen

0

Les robots peuvent ignorer l'enregistrement des données de cookie (comme ne pas renvoyer la variable de session). La meilleure option serait d'utiliser une sorte de DB externe ou un système de stockage. Comme un programme de socket C++ qui stocke simplement IP et compare les connexions récentes.

1

Votre meilleur pari pour cela pourrait être l'analyse après-coup des journaux. Cela n'empêchera pas le vol de contenu à la volée, mais il sera beaucoup plus facile de trouver des modèles d'abus et de bloquer ces adresses IP pour les futurs accès.

1

Vous auriez besoin de stocker l'adresse IP et les horodatages côté serveur. Il est peu probable qu'un bot envoie des cookies, et même une session basée sur une URL n'est pas fiable.

Le surdébit d'un fichier ne devrait pas être trop élevé, à moins que vous ne fassiez que la journalisation à plat qui vous tue. Vous pouvez utiliser SQLite ou similaire, peut-être stocké sur un système de fichiers basé sur la mémoire pour un petit coup de pouce de vitesse. Ou vous pourriez aller avec quelque chose comme memcached. Si vous avez besoin de conserver les données, utilisez MySQL. L'overhead d'une base de données complète n'est pratiquement rien comparé au temps qu'il faut à PHP pour faire à peu près n'importe quoi.

Si vous voulez vraiment faire quelque chose comme ceci avec des sessions, affichez une page d'accord d'utilisateur à moins qu'une variable "I Agree" ne soit définie dans la session. De cette façon, si un bot n'envoie pas une session valide, tout ce qu'il obtient est l'accord de l'utilisateur. Si c'est le cas, vous pouvez le suivre avec des variables de session. Gardez à l'esprit que la solution basée sur la session n'est pas nécessaire car vous n'avez pas besoin de mémoriser l'état du client entre les requêtes et que les sessions entraînent autant, sinon plus, de surcoût que la plupart des alternatives personnalisées.

En ce qui concerne l'affirmation que les variables de session peuvent être manipulées par les cookies, ce n'est pas tout à fait vrai. Cependant, si vous êtes assez stupide pour laisser register_globals et que vous demandez une variable globale, je ne voudrais pas risquer de deviner si elle provient d'une session, d'un cookie, d'une chaîne de requête, de l'environnement ou si elle était précédemment indéfini. Tout cela est discutable si vous accédez explicitement à $ _SESSION bien sûr.

0

Ne vous attendez pas à les vaincre en rafraichissant les temps seuls. J'ai fait quelque chose de très similaire au combat contre le spam et certains bots attendent aussi longtemps que les gens avant de passer à l'action suivante. Je regarderais plutôt les adresses IP qui ne chargeraient que le document html, et ignorerais des choses comme favicon, css stylesheets, etc. Si vous définissez des fichiers css pour analyser php, vous pouvez mettre un peu de logique là pour dire que ip regarde légitime. Faites juste attention à la mise en cache.

En outre, prenez-vous des mesures pour vous assurer de ne pas verrouiller les bots légitimes comme le googlebot?