J'ai une vaste base de données de liens, qui sont toutes triées de manière spécifique et sont jointes à d'autres informations, ce qui est précieux (à certaines personnes). P>
Actuellement, ma configuration (qui semble fonctionner) appelle simplement un fichier PHP comme link.php? ID = 123, il enregistre la demande avec un horodatage dans la DB. Avant de dépiter le lien, il vérifie le nombre de demandes de cette adresse IP au cours des 5 dernières minutes. Si c'est supérieur à X, il vous redirige vers une page CAPTCHA. p>
Tout fonctionne bien et dandy, mais le site est devenu très populaire (ainsi que de la DDED depuis environ 6 semaines), de sorte que PHP a été recouvert de sol, donc je tente de minimiser les temps que je dois frapper php à faire quelque chose. Je voulais montrer des liens en texte brut au lieu de thru link.php? Id = et avoir une fonction OnClick pour simplement ajouter 1 au nombre d'affichages. Je frappe toujours PHP, mais au moins si elle est à la traîne, elle le fait en arrière-plan et que l'utilisateur peut voir le lien qu'ils aient demandé immédiatement. p>
problème est que cela rend le site vraiment coulissant. Y a-t-il quelque chose que je puisse faire pour éviter cela, mais ne comptez toujours pas sur PHP pour faire le chèque avant de cracher le lien? p>
5 Réponses :
Vérifiez votre base de données. Est-ce que vous indexez tout correctement? Une table avec ces nombreuses entrées obtiendra de grandes choses très rapides et lentes. Vous voudrez peut-être également exécuter un processus nocturne qui supprime les entrées de plus d'une heure, etc. p>
Si rien de cela ne fonctionne, vous envisagez de mettre à niveau / charger votre serveur. La liaison directement sur les pages ne vous achètera que beaucoup de temps avant de pouvoir mettre à niveau de toute façon. P>
Mysql n'est pas le problème. MySQL Server est sous-utilisé, car tout est memcached et optimisé comme l'enfer. Les connexions PHP sont ce qui le fait. S'il n'y avait aucune attaque, le serveur peut ne pas le traiter.
Avez-vous aspiré le code PHP pour déterminer quel code est la source du goulot d'étranglement?
@Yegor - Donc, fondamentalement, le vrai problème est que le serveur ne peut pas gérer une attaque DDO. Vous devriez faire que la racine de votre question.
La plupart des racleurs analysent simplement Static HTML, alors encodez vos liens, puis décodez de manière dynamique dans le navigateur Web du client avec JavaScript. p>
Les racleurs déterminés peuvent encore se déplacer dessus, mais ils peuvent se déplacer sur n'importe quelle technique si les données sont suffisamment précieuses. P>
Tout ce que vous faites du côté client ne peut pas être protégé, pourquoi pas simplement utiliser Ajax? P>
Avoir un événement OnClick que l'appel est une fonction Ajax, qui renvoie juste le lien et le remplit dans un div sur votre page, la taille de la demande de la demande est petite, elle fonctionnera rapidement enougth pour ce dont vous avez besoin. Assurez-vous simplement que dans la fonction que vous appelez pour vérifier l'horodatage, il est facile de créer un script qui appelle cette fonction à plusieurs reprises à l'acier des liens. P>
Vous pouvez vérifier JQuery ou d'autres bibliothèques AJAX (j'utilise JQuery et Sajax). Et j'ai beaucoup de page qui change de contenu dinamicly très rapidement, le client ne sait même pas n'est pas pur JS. P>
Devait toujours exécuter une requête sélectionnée, qui défait entièrement le but.
Mon mauvais que je n'ai pas vu la partie où vous avez dit que vous n'avez pas utilisé pour utiliser PHP :) Si vous utilisez uniquement des scripts du côté client, il n'y a pas de méthode pour prévenir les sonneurs, vous CAN FAITES JS minimisés, encodez-le et faites des variables. et fonctionne avec des noms qui n'ont aucune signification fonction A (), VaR A_0 etc ..., cela empêchera 90% des racleurs (débutants) mais n'empêchera pas les avancées :( si vous avez les informations sur MySQL sur la première charge de page, vous pouvez le sauvegarder à la session, puis utiliser AJAX juste pour lire à partir de la session (toujours utiliser PHP, mais pas la base de la base de données.)
Quant à la DB n'est pas un problème, ce n'est pas stressé. Utiliser PHP est ce que je veux garder au minimum. J'exécute la requête de mise à jour avec Ajax en arrière-plan, alors même si elle est suspendue pendant 2-3 secondes, ce n'est pas une grosse affaire. Mais quand il se bloque pendant 2-3 secondes avant de charger le lien, c'est une grosse affaire. JS Solution semble être la seule façon de partir ....
Vous pouvez faire la limitation de la propriété intellectuelle au niveau du serveur Web. Peut-être qu'un module existe pour votre serveur Web, ou à titre d'exemple, en utilisant Apache, vous pouvez écrire votre propre réécriture et le faire consulter un programme de démon afin que vous puissiez faire des choses plus complexes. Demandez au programme de démon une base de données de mémoire. Ce sera rapide. P>
Il semble que le goulot d'étranglement soit dans la base de données. Chaque requête effectue un insertion (enregistre la demande), puis une sélection (déterminez le nombre de demandes de l'adresse IP dans les 5 dernières minutes), puis certaines opérations de base de données sont nécessaires pour effectuer la fonction principale de l'application. P>
Envisagez de maintenir les données de la demande d'étranglement (IP, Time Demande) dans la mémoire du serveur plutôt que de forcer la base de données. Deux solutions sont MemCache ( http://www.php.net/manual/fr /book.memcache.php ) et memcached ( http: // php. net / manuel / fr / book.memcached.php ). p>
Comme d'autres l'ont noté, assurez-vous que les indices existent pour toutes les clés interrogées (champs tels que l'ID de liaison). Si des indices sont en place et que la base de données souffre toujours de la charge, essayez un accélérateur HTTP tel que vernis ( http: // vernis -Cache.org/ ). P>
Ce n'est pas. DB Server n'est pas sans stress.
Avez-vous aspiré le code PHP pour déterminer quel code est la source du goulot d'étranglement?
Pour ajouter à ce que @stact dit, le problème est probablement avec l'insertion simultanée et la lecture de la base de données. Si vous ne contrôlez pas votre Apache et que vous ne pouvez pas configurer l'étranglement IP comme dans la réponse de @ Chris, vous devez au moins ne pas lire la liste IP pendant la demande. INSERTING EST FINE, il suffit de faire fonctionner un script toutes les 5 minutes qui se lit dans la table et par exemple une liste de toutes les adresses IP interdites et placez-la dans un fichier en plainte. Ensuite, faites le script, lors de chaque demande, ouvrez simplement ce fichier et vérifiez si l'IP est sur cette liste. (Meilleur serait de le faire en mémoire au lieu de fichier).
Une mauvaise approche, je dirais. Vous pouvez probablement optimiser votre code afin qu'il fonctionne assez rapidement à vos besoins.
N'essayez pas de l'empêcher d'utiliser JavaScript puisque la plupart des racleurs d'écran ne fonctionnent même pas JavaScript.
Pouvez-vous expliquer comment vous «appeler le fichier php»? Voulez-vous dire que vous êtes liés à cette URL, ou y compris celui-ci via PHP, en utilisant
CURL code>, etc ...
Quel est le problème? Que votre site est facilement gratté ou que le site ne peut pas gérer la charge que les saphronisons mettent sur le site?
Hmm .. Je n'ai vraiment pas eu ce que vous essayez de faire. Afficher une page avec un lien et compter le nombre de clics sur le lien, et en même temps, vous ne faites pas cette page coulée?