Как бы вы защитили базу данных ссылок от удаления? - PullRequest
6 голосов
/ 23 марта 2010

У меня есть большая база ссылок, все они отсортированы особым образом и привязаны к другой информации, которая является ценной (для некоторых людей).

В настоящее время моя установка (которая, кажется, работает) просто вызывает php-файл, такой как link.php? Id = 123, он записывает запрос с отметкой времени в БД. Перед тем как выложить ссылку, он проверяет, сколько запросов было сделано с этого IP за последние 5 минут. Если его больше, чем х, он перенаправляет вас на страницу с картинкой.

Это все работает отлично и отлично, но сайт становится действительно популярным (а также получает DDOsed в течение примерно 6 недель), так что php теряет популярность, поэтому я пытаюсь свести к минимуму время, которое мне приходится подбирать PHP, чтобы сделать что-то. Я хотел показать ссылки в виде обычного текста вместо link.php? Id = и иметь функцию onclick, чтобы просто добавить 1 к количеству просмотров. Я все еще запускаю php, но, по крайней мере, если он отстает, он делает это в фоновом режиме, и пользователь может увидеть ссылку, которую он запрошен сразу.

Проблема в том, что сайт ДЕЙСТВИТЕЛЬНО доступен для удаления. Есть ли что-нибудь, что я могу сделать, чтобы предотвратить это, но все же не полагаться на php, чтобы выполнить проверку перед тем, как выплюнуть ссылку?

Ответы [ 5 ]

2 голосов
/ 24 марта 2010

Кажется, что узкое место находится в базе данных.Каждый запрос выполняет вставку (регистрирует запрос), затем выбор (определяет количество запросов от IP за последние 5 минут), а затем любые операции с базой данных, необходимые для выполнения основной функции приложения.

Рассмотрите возможность хранения данных регулирования запросов (IP, время запроса) в памяти сервера, а не обременяя базу данных.Два решения - это memcache (http://www.php.net/manual/en/book.memcache.php) и memcached (http://php.net/manual/en/book.memcached.php).

). Как уже отмечали другие, убедитесь, что существуют индексы для любых запрашиваемых ключей (такие поля, как идентификатор ссылки).и база данных по-прежнему страдает от нагрузки, попробуйте ускоритель HTTP, например Varnish (http://varnish -cache.org / ).

1 голос
/ 24 марта 2010

Вы можете выполнить IP-регулирование на уровне веб-сервера.Возможно, для вашего веб-сервера существует модуль или, например, с помощью apache вы можете написать свою собственную карту перезаписи и обратиться к ней с программой-демоном, чтобы вы могли выполнять более сложные задачи.Пусть программа-демон запросит базу данных памяти.Это будет быстро.

0 голосов
/ 23 марта 2010

Большинство скребков просто анализируют статический HTML, поэтому кодируйте свои ссылки и затем динамически декодируйте их в веб-браузере клиента с помощью JavaScript.

Определенные скребки все еще могут обойти это, но они могут обойти любую технику, если данные достаточно ценны.

0 голосов
/ 23 марта 2010

Все, что вы делаете на стороне клиента, не может быть защищено. Почему бы просто не использовать AJAX?

Имейте событие onClick, которое вызывает функцию ajax, которая возвращает только ссылку и заполняет ее в DIV на вашей странице, поскольку размер запроса и ответа невелик, он будет работать достаточно быстро для того, что вам нужно. Просто убедитесь, что в вызываемой функции проверяется метка времени. Легко создать скрипт, который будет многократно вызывать эту функцию для закрепления ваших ссылок.

Вы можете проверить jQuery или другие библиотеки AJAX (я использую jQuery и sAjax). И у меня есть много страниц, которые динамически меняют контент очень быстро. Клиент даже не знает, что это не чистый JS.

0 голосов
/ 23 марта 2010

Проверьте вашу базу данных. Вы все правильно индексируете? Таблица с таким количеством записей будет очень большой и медленной. Вы также можете запустить ночной процесс, который удаляет записи старше 1 часа и т. Д.

Если ничего из этого не работает, вы смотрите на обновление / балансировку нагрузки вашего сервера. Прямая ссылка на страницы только выиграет вам столько времени, прежде чем вам придется обновляться.

...