2014-09-11 5 views
1

J'ai une application web php 5.5 en utilisant le framework Symfony2 et je souhaite que la charge du serveur reste au minimum. Quelques pages sur mon site permettent à l'utilisateur de récupérer une liste d'objets d'une base de données et un ensemble a plusieurs centaines de milliers de lignes, et sera bientôt plus d'un million. Les utilisateurs non enregistrés peuvent utiliser cette page. Je veux empêcher l'utilisateur d'effectuer une requête trop de fois dans une minute ou dans une période de temps similaire et l'ai vu mis en œuvre sur d'autres sites Web, y compris stackoverflow pour les commentaires ou le vote.Empêcher les soumissions abusives dans la période de temps

Comment cela est-il implémenté? Dois-je créer un cookie et vérifier la session sur chaque chargement de page pour voir si les actions spécifiques que je veux limiter ont été utilisées et empêcher la soumission du formulaire? Existe-t-il un moyen standard de gérer ceci en php, ou spécifiquement pour Symfony2? J'ai cherché ceci et ai trouvé quelques questions semblables, mais aucune réponse spécifique. Ceci est pour les utilisateurs directement sur mon site et ne pas utiliser une API.

How to throttle API requests using PHP

How do I throttle my site's API users?

Edit:

Je sais que les cookies ne sont pas la bonne façon d'aller va essayer de mettre en place un mécanisme à l'aide d'un cache. J'utilise php 5.5 et ai lu que APC a quelques bugs avec 5.5, donc Zend OpCache est réellement préféré avec APCu. Quelqu'un peut-il montrer un exemple d'utilisation de Zend OpCache/APCu pour consigner et suivre les demandes des utilisateurs?

+0

Les cookies résident du côté client. Tout ce que je dois faire est de les désactiver et je peux vous spammer tout ce que je veux (et de nombreux robots ne gèrent pas les cookies de toute façon) – Machavity

+0

Oui, je m'inquiétais de cela et j'ai besoin d'une solution plus robuste – George

+0

pouvez-vous approuver la réponse si c'est bon ? – skler

Répondre

1

Les cookies ne sont pas sécurisés. Quand je l'ai fait quelque chose de semblable, je APC ou MongoDB pour stocker le compteur, avec une clé faite avec:

  • IP: $ _SERVER [ 'HTTP_X_FORWARDED_FOR'] | $ _SERVER [ 'REMOTE_ADDR']
  • Navigateur: $ _SERVER [ 'HTTP_USER_AGENT'])
  • horodatage absolu de cette heure (ou minutes si vous voulez vérifier rapidement)

Ainsi, par exemple, vous pouvez stocker une clé APC nommée avec: ip2long ($ ip), crc32 ($ browser), time() - time()% 3600, et sauvegardez votre valeur de hit.

Je mets un exemple de code qui a fait usage de l'IP dans une gamme de 1 heure.

// Time 
$now = time(); 
$time = $now - $now%3600; 

// IP 
if(array_key_exists('HTTP_X_FORWARDED_FOR', $_SERVER)) { 
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; 
} else { 
    $ip = $_SERVER['REMOTE_ADDR']; 
} 
$key = sprintf('%d-%u', $time, ip2long($ip)); 

if (apc_inc($key)) { 
    echo "we have ". apc_fetch($key). " views in this hour"; 
} 
+0

J'utilise postgresql et je voudrais utiliser APC. Le est une très petite quantité de mémoire, mais quelle taille de base d'utilisateur le rendrait si grand que je devrais déplacer ceci à la base de données? Dois-je l'effacer manuellement ou laisser le cache se gérer? – George

+0

Cela dépend de combien de temps vous voulez maintenir votre journal, si c'est seulement une minute que vous n'avez pas besoin de cette persistance – skler

+0

Savez-vous si ces mêmes fonctions fonctionnent en utilisant APCu? Il y a très peu de documents sur APCu que je puisse trouver. – George

Questions connexes