Обнаружение клиентов с прокси-серверами через PHP - PullRequest
23 голосов
/ 13 мая 2009

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

Редактировать

Меня больше интересуют анонимные прокси ... так как нормальные легко обнаруживаются при поиске HTTP_X_FORWARDED_FOR.

Другое Редактирование

Попробуйте это:

1) перейдите на http://kproxy.com (или любой другой бесплатный анонимный прокси-сайт)

2) посещение: http://www.worldofwarcraft.com

3) они могут каким-либо образом блокироваться, так как страница выдает ошибку «Ошибка загрузки таблицы стилей: произошла ошибка сети при загрузке таблицы стилей XSLT: http://kproxy.com/new-hp/layout/layout.xsl"

Я хочу сделать что-то подобное для предотвращения прокси.

Ответы [ 11 ]

24 голосов
/ 12 февраля 2012

Используйте следующие 2 решения в PHP. // метод 1 = быстрый, но не работает с анонимными прокси

    $proxy_headers = array(
        'HTTP_VIA',
        'HTTP_X_FORWARDED_FOR',
        'HTTP_FORWARDED_FOR',
        'HTTP_X_FORWARDED',
        'HTTP_FORWARDED',
        'HTTP_CLIENT_IP',
        'HTTP_FORWARDED_FOR_IP',
        'VIA',
        'X_FORWARDED_FOR',
        'FORWARDED_FOR',
        'X_FORWARDED',
        'FORWARDED',
        'CLIENT_IP',
        'FORWARDED_FOR_IP',
        'HTTP_PROXY_CONNECTION'
    );
    foreach($proxy_headers as $x){
        if (isset($_SERVER[$x])) die("You are using a proxy!");
    }

// Метод 2 = сканирование портов обратно на исходный IP-адрес при использовании обычных прокси-портов.

    $ports = array(8080,80,81,1080,6588,8000,3128,553,554,4480);
    foreach($ports as $port) {
         if (@fsockopen($_SERVER['REMOTE_ADDR'], $port, $errno, $errstr, 30)) {
              die("You are using a proxy!");
         }
     }
17 голосов
/ 13 мая 2009

Вы не можете обнаружить это, если они не передают специальные заголовки, которые явно упоминают это как X-Forwarded-For или что-то еще.

Насколько я знаю, вы должны использовать черный список. Пользователи, которые используют перенаправление портов через замазку, VPN или другие более сложные методы, не могут быть обнаружены, поскольку ведут себя точно так же, как обычные пользователи.

8 голосов
/ 14 мая 2009

Metasploit использует множество различных методов, чтобы заставить систему клиента устанавливать прямое соединение (уязвимости / ошибки в Flash, Java, QuickTime, MS Office, настраиваемом DNS-сервере).

В качестве альтернативы, если вы не можете заставить браузер клиента запускать metasploit, вы можете попытаться найти открытые прокси (сканирование портов) и известные узлы выхода Tor .

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

Если у вас есть проблемы со спамом или другим злоупотреблением трафиком, то блокировка прокси не сильно поможет. Вам следует искать конкретные решения, которые решают суть проблемы (спам-фильтры, IDS), а не предполагать, что anonymous = guilty.

3 голосов
/ 09 августа 2015

Существуют различные платные / бесплатные решения. Большинство из них смотрит на IP-адрес клиента, пытающегося подключиться, чтобы определить, находится ли он на прокси или нет.

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

Бесплатно:
W I T C H - Способен обнаруживать OpenVPN, просматривая значения MSS, которые являются уникально идентифицируемыми. Код доступен на github.

GetIpIntel - Обнаружение прокси / VPN с использованием машинного обучения, запросы через API.

В списке стеков безопасности есть еще несколько свободных опций .

1 голос
/ 07 июня 2013

Этот веб-сайт показывает эту ошибку, потому что в его исходном коде есть адрес, указывающий на "new-hp / layout / layout.xsl". Прокси-сервер хочет скрыть ваш ip, поэтому он меняет его на http://kproxy.com/new-hp/layout/layout.xsl,, чтобы указать на их сервер, но файл на самом деле не существует, поэтому Flash Plugin не может его найти.

1 голос
/ 18 мая 2013

Старая тема, но я мог бы что-то выяснить.

Он есть на моем сайте, и я думаю, что он может работать в большинстве случаев.

Моя проблема заключалась в том, что забаненный пользователь возвращался на мой сайт и перерегистрировался с новым адресом электронной почты, используя один из многочисленных прокси, которые вы можете найти. Я сделал простой вызов jQuery в форме регистрации / входа в систему:

<form id="login_form" method="post" action="/#fake_login_url">
   stuff you need for the form
</form>
<script>
   $('#login_form').attr('action','real_login_form');
</script>
1 голос
/ 13 мая 2009

Я думаю, что здесь происходит то, что какой-то клиентский JavaScript пытается что-то загрузить, и это может «увидеть», что страница просматривается внутри фрейма. Это может быть более плодотворным путем для исследования - как указали другие ответы, прокси намеренно затрудняют определение только с одного сервера.

1 голос
/ 13 мая 2009

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

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

0 голосов
/ 25 августа 2018

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

После поиска я нашел лучший метод. Чтобы понять этот способ, просто создайте небольшую страницу с этим кодом:

 <?php
 foreach ($_SERVER as $key => $val)
 {
     echo $key."<br>\n";  
 }
 ?>

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

  1. Прокси добавляет новости ключей / значений
  2. Прокси-сервер не отправляет все исходные ключи / значения, поэтому некоторые из них отсутствуют.
  3. Прокси отправляет точно такие же ключи / значения, но не в том же порядке
  4. Прокси отправляет точно такие же ключи / значения, в том же порядке

Может случиться 4-й случай, но чаще всего встречаются другие. Так что вам просто нужно создать массив с ключом / значением с вашего сервера (на основе результата, когда вы запускаете скрипт без прокси) и сравнить ключи / значения из $ _SERVER. Если у вас нет точно таких же ключей / значений (меньше, больше или в другом порядке), вы можете предположить, что страница была получена от прокси.

Обратите внимание, я согласен с тем, что в некоторых случаях прокси-сервер можно использовать как «легальный».

0 голосов
/ 18 июля 2017

Мне кажется, что отвечать на 8-летнюю тему бесполезно, но я все равно отвечу для дальнейшего использования.
Я не знаю о прокси, но большинство VPN (если вы заходите на них) принесут какую-то страницу с ошибкой. если вы сделали что-то вроде ...

$cont = file_get_contents($_SERVER["REMOTE_ADDR"]); //the users ip
$errormsg = "nginx";
if(strpos($cont, $errormsg)){
    die("No VPN's or Proxies Allowed");
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...