Обнаружение клиентов с помощью прокси-серверов через PHP
Я ищу метод или способ обнаружения клиентов, использующих прокси-сервер любого типа, просматривающий мой веб-сайт. Я использую 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 "
Я хочу сделать что-то подобное, чтобы предотвратить прокси.
Ответы
Ответ 1
Вы не можете обнаружить это, если они не передают специальные заголовки, которые явно упоминают его как X-Forwarded-For или что-то в этом роде.
Насколько я знаю, вы должны использовать черный список. Пользователи, которые используют штепсельное портфолио, VPN или другие более сложные методы, не поддаются рассмотрению, поскольку они ведут себя точно так же, как и обычные пользователи.
Ответ 2
Используйте следующие 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!");
}
}
Ответ 3
Metasploit использует множество разных методов, чтобы заставить клиентскую систему осуществлять прямое подключение (уязвимости/ошибки в Flash, Java, QuickTime, MS Office, пользовательский DNS-сервер).
В качестве альтернативы, если вы не можете заставить браузер клиента запускать metasploit, вы можете попытаться найти открытые прокси (сканирование портов) и известные узлы Tor exit.
Но, пожалуйста, не предполагайте, что прокси злобны и должны быть заблокированы - есть много законных прокси, и некоторые пользователи должны их использовать.
Если у вас есть проблемы со спамом или другим оскорбительным трафиком, просто блокировка прокси-серверов не поможет. Вы должны искать конкретные решения, которые затрагивают ядро проблемы (спам-фильтры, IDS), а не предполагать анонимный = виновный.
Ответ 4
Существуют различные платные/бесплатные решения. Большинство из них обращается к IP-адресу клиента, пытающемуся подключиться, чтобы определить, находятся ли они в прокси-сервере или нет.
Оплачено:
Maxmind - Они сосредоточены на обнаружении мошенничества и имеют подкатегорию для определения прокси. Обратите внимание, что это теперь рассматривается как "устаревшее" обслуживание.
Free:
W я T C H - Возможность обнаружения OpenVPN путем просмотра значений MSS, которые однозначно идентифицируются. Код доступен в github.
GetIpIntel - обнаружение прокси /VPN с использованием машинного обучения, запросов через API.
В разделе обмена стеками безопасности есть еще несколько бесплатных опций .
Ответ 5
Все, что клиент передает серверу, может быть самонастраиваемым. Вы ничего не можете доверять, кроме IP-адреса. Таким образом, вы не можете проверить данные заголовка, если это прокси или обычный клиент.
Кстати: это намерение прокси-сервера не показывать прокси:)
Конечно, вы можете взять IP-адрес реквестера и отправить HTTP-запрос, который вы отправляете прокси. Если он реагирует, это может быть прокси в противном случае, это обычный клиент. Этот метод был бы очень дорогим и ненадежным. Если прокси, запрошенный вашим сервером, находился за брандмауэром, вы не получили бы ответа и подумали бы, что это обычный клиент.
Ответ 6
Я думаю, что то, что здесь происходит, - это клиентский JavaScript, который пытается загрузить что-то, и может "видеть", что страница просматривается внутри фрейма. Это может быть более плодотворным средством для изучения - как указывали другие ответы, прокси намеренно затрудняют определение только с сервера.
Ответ 7
Старая тема, но я мог бы что-то придумать.
Он живет на моем сайте, и я думаю, что он может работать в большинстве случаев.
Моя проблема заключалась в том, что запрещенный пользователь возвращался на мой сайт и перерегистрировался с новым адресом электронной почты, используя один из многих прокси, которые вы можете найти. То, что я сделал, это простой вызов 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>
Ответ 8
Этот сайт показывает эту ошибку, потому что в своем исходном коде есть адрес, указывающий на "new-hp/layout/layout.xsl". Прокси хочет скрыть свой ip, поэтому он меняет его на http://kproxy.com/new-hp/layout/layout.xsl, чтобы указать на их сервер, но файл на самом деле не существует, поэтому Flash Plugin не может найти его.
Ответ 9
Даже если это старый вопрос, мне пришлось проверить прокси, и, к сожалению, ни один из ответов не дал хорошего результата.
После поиска я нашел лучший метод. Чтобы понять этот способ, просто создайте небольшую страницу с этим кодом:
<?php
foreach ($_SERVER as $key => $val)
{
echo $key."<br>\n";
}
?>
Запустите его прямо с вашего сервера. Вы увидите все ключи из заголовка, который отправляет ваш сервер. Затем запустите тот же скрипт через прокси. Вы увидите (в зависимости от прокси) 3 возможных результата:
- Прокси добавить новости ключи/значения
- Прокси не отправляет все оригинальные ключи/значения, поэтому некоторые из них отсутствуют.
- Прокси отправляет точно такие же ключи/значения, но не в том же порядке
- Прокси отправляет точно такие же ключи/значения, в том же порядке
4-й случай может случиться, но другие являются наиболее частыми. Так что вам просто нужно создать массив с ключом/значением на вашем сервере (на основе результата, когда вы запускаете скрипт без прокси) и сравнить ключи/значения из $ _SERVER. Если у вас нет точно таких же ключей/значений (меньше, больше или в другом порядке), вы можете предположить, что страница получена от Прокси.
Заметьте, я согласен с тем, что в некоторых случаях прокси можно использовать в "легальном".
Ответ 10
Я чувствую, что ответить на 8-летний поток бесполезно, но я буду отвечать в любом случае для дальнейшего использования.
Я не знаю про прокси, но большинство VPN (если вы переходите к ним) принесут какую-то страницу ошибок. если вы сделали что-то вроде...
$cont = file_get_contents($_SERVER["REMOTE_ADDR"]); //the users ip
$errormsg = "nginx";
if(strpos($cont, $errormsg)){
die("No VPN or Proxies Allowed");
}
Это очень просто, вы можете получить массив сообщений об ошибках и сделать это таким образом.
Это не сработает, если пользователь имеет portforwarded их порт 80, но я не понимаю, почему обычный человек сделал бы это.
Ответ 11
Я использую следующее, но я не уверен, что он работает каждый раз.
Это просто идея:)
<?php
$host = gethostbyaddr($_SERVER['REMOTE_ADDR']);
if ($host != $_SERVER['REMOTE_ADDR']) die('Proxy detected.');
?>