2014-09-11 4 views
1

У меня есть веб-приложение php 5.5 с использованием инфраструктуры Symfony2 и вы хотите, чтобы загрузка сервера была минимальной. Несколько страниц на моем сайте позволяют пользователю получить список объектов из базы данных, а один набор имеет несколько сотен тысяч строк и скоро будет более миллиона. Незарегистрированные пользователи могут использовать эту страницу.Предотвратите оскорбительные представления в течение периода времени

Я хочу, чтобы пользователь не выполнял запрос слишком много раз в минуту или какой-то подобный промежуток времени, и видел, как это реализовано на других сайтах, включая stackoverflow для комментариев или голосования.

Как это реализовано? Нужно ли создавать cookie и проверять сеанс на каждой загрузке страницы, чтобы увидеть, были ли использованы конкретные действия, которые я хочу ограничить, и предотвратить отправку формы? Есть ли стандартный способ обработки этого в php, или специально для Symfony2? Я искал это и нашел некоторые подобные вопросы, но никакого конкретного ответа. Это для пользователей прямо на моем сайте, а не с помощью api.

How to throttle API requests using PHP

How do I throttle my site's API users?

Edit:

Я знаю, что печенье не правильный путь, и будет пытаться реализовать механизм, используя кэш. Я использую php 5.5 и читаю, что APC имеет некоторые ошибки с 5.5, поэтому Zend OpCache на самом деле предпочтительнее вместе с APCu. Может ли кто-нибудь показать пример использования Zend OpCache/APCu для регистрации и отслеживания запросов пользователей?

+0

Куки-файлы находятся на стороне клиента. Все, что мне нужно сделать, это отключить их, и я могу спамить вас всем, что хочу (и многие боты не обрабатывают файлы cookie в любом случае) – Machavity

+0

Да, я беспокоился об этом и нуждался в более надежном решении – George

+0

Могли бы вы утвердить ответ, если он хорош ? – skler

ответ

1

Cookies - это не безопасный способ. Когда я сделал что-то подобное, я использовал APC или MongoDB для хранения счетчика, с ключом сделал с:

  • IP: $ _SERVER [ 'HTTP_X_FORWARDED_FOR'] | $ _SERVER [ 'REMOTE_ADDR']
  • Browser: $ _SERVER [ 'HTTP_USER_AGENT'])
  • абсолютная отметка времени этого часа (или минут, если вы хотите, чтобы проверить, в ближайшее время)

Так, например, вы можете хранить ключ APC, названный с: ip2long ($ ip), crc32 ($ browser), time() - time()% 3600 и сохранить там свое значение хита.

Я привел пример кода, который использовал только IP в диапазоне 1 час.

// 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

Я использую postgresql и буду использовать как использовать APC. Это очень небольшой объем памяти, но какой размер пользовательской базы сделает его настолько большим, что я должен переместить его в базу данных? Должен ли я вручную очистить это или позволить кешу управлять собой? – George

+0

Это зависит от того, как долго вы хотите поддерживать свой журнал, если только одна минута вам не нужна, чтобы это было постоянным. – skler

+0

Знаете ли вы, работают ли эти же функции с помощью APCu? На APCu очень мало документов, которые я могу найти. – George

Смежные вопросы