2013-04-12 4 views
1

У меня есть страница с id = в URL-адресе. Проблема заключается в том, что это привлекает много ненужного внимания со стороны хакеров, пытающихся манипулировать URL-адресом, например. id = 133 + order by 1-- (к сожалению, изменение идентификатора не является опцией)Как обнаружить и заблокировать ip Если url содержит недопустимые символы

У меня есть следующий код, чтобы получить идентификатор и удалить любую «неисправность».

$ia = intval($_GET['id']); 
$ib = mysql_real_escape_string($ia); 
$ic = strip_tags($ib); 

но то, что я действительно хотел бы сделать, это запретить IP-адрес пользователя за х раз. Таким образом, если их когда-либо будет недостатком безопасности, он купит мне время, чтобы обнаружить его и исправить до хакера (лучше быть в безопасности, чем извините!)

Также его ненужное использование ЦП, которое, как правило, исключает.

Кто-нибудь знает скрипт php, который может обнаруживать и блокировать ip на основе манипуляции с URL-адресами за х раз? Или даже лучше, кто-нибудь может показать пример, который они уже сделали?

+1

Это не ответ, поэтому я положил его сюда. Я бы не заблокировал их, кроме журнала (возможно, напишите мне тоже) - если вы заблокируете, вы сообщите им, что есть что-то стоящее, и вы не испытываете, потому что вы их блокируете. Устраивают ли Google, Yahoo, CNN и другие кого-либо? – Voitcus

+0

Непосредственно отвечая на вопрос, но поскольку идентификатор является чисто числовым, вы должны просто отнести его к целому числу для его дезинфекции. Это означает, что вы всегда получите либо действительный целочисленный идентификатор, либо ноль, и вы можете легко определить нуль, оценив идентификатор как логическое, и даже не коснитесь базы данных, если пользователь поставляет то, что не является допустимым целым числом. '$ id = (int) $ _GET ['id'];' – DaveRandom

ответ

1

У вас есть несколько вариантов:

  1. Реализовать IP-блокировочные себя в PHP, просто провалив запрос, если источник IP содержится в каком-то черный список, который вы управляете.
  2. Как-нибудь сообщите серверной программе (Apache, IIS, ...), чтобы заблокировать запросы, прежде чем принимать входящее соединение.
  3. Напишите себе очень простой прокси-сервер, который принимает ваш HTTP-запрос, если он не исходит из черного списка, проверяет идентификатор на семантическую достоверность, управляет черным списком и отправляет приемлемые запросы на ваш фактический веб-сервер.

Вариант 1 довольно прост: поддерживайте черный список, проверяйте входящие запросы и не выполняйте их при необходимости. Вы можете найти более подробную информацию, в том числе простой пример кода здесь: http://perishablepress.com/how-to-block-ip-addresses-with-php/

Проблема с вариантом 1 заключается в том, что она на самом деле не спасает вас от загрузки ЦП и, вероятно, даже больше связана с вычислением, чем предложение DaveRandom просто анализировать идентификатор и проверки его вместо IP-адреса источника.

Вариант 2, к сожалению, будет сильно зависеть от инфраструктуры сервера, которую вы используете и в большинстве случаев не будет легко реализован. Для этого вам может потребоваться найти способ изменения конфигурационных файлов сервера в PHP, а затем каким-то образом заставить сервер перечитать эти файлы. Я не изучал, как реализовать это с помощью Apache или IIS, но для Google AppEngine я знаю, что это невозможно с текущим API.

Вариант 3 будет включать в себя довольно немного кодирования (если вы не можете найти какое-либо предварительное решение где-то), но, вероятно, должно быть самым гибким решением.

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

0

Вы можете получить все необходимые данные из суперглобальной переменной $_SERVER, есть ключи REMOTE_ADDR и REMOTE_HOST, которые вы можете использовать (дополнительная информация in the manual).

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

Это, однако, не идеальное решение, так как возможность изменения IP-адреса и проблем с динамически настроенными.

В вашей базе данных/файле вы можете добавить поле типа «expires» со временем, когда пользователь может быть разрешен.

Но, как я заявил в своем комментарии, я никого не блокировал. Как написал @DaveRandom, вы можете просто наложить id на целое число, которое удержит вас от инъекций SQL. Помните, что вы должны учитывать все переменные, которые вы получаете и обрабатываете от клиента, и $_POST.

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