Pull to refresh

Простой способ обойти ограничения локального прокси

Reading time3 min
Views51K
Начнем с того, что однажды мне понадобилось зайти в вконтакте.
В то время я работал в одной крупной компании. Локальный прокси-сервер блокировал все запросы в содержании, которого присутствовали признаки данного ресурса, и не только его. О существовании анонимайзеров, я, конечно же, знал. Но опробовав быстродействие и возможности подобного сервиса, крайне огорчился.
Кроме того, из нынешнее устройства Сети следует, что любой узел через, который проходит трафик, может его просмотреть, а HTTP-трафик вообще передается в открытом виде.
И за это еще нужно платить деньги, имея в распоряжении внешний IP и собственный веб-сервер.
Так родилась идея создания простого скрипта перенаправления трафика и удаления фильтруемой (прокси) информации.

Для начала оговорюсь, что web-proxy на базе:
— Apache 2
— PHP with mod_rewrite, php_curl
Рассматривается только работа с ВКонтакте и его особенности.

Итак, начнем


В .htaccess необходимо дописать строки:
	RewriteCond %{REQUEST_FILENAME} !-f
	RewriteCond %{REQUEST_FILENAME} !-l
	RewriteRule ^(.*)$ /имя_скрипта?url=$1 [QSA]

Это перенаправит трафик на один файл.
имя_скрипта — не следует делать index.php и т.п.

Далее, авторизация


Если просто перенаправить все запросы на один скрипт, авторизация работать не будет. Необходимо отправить запросы на 2 домена: vkontakte.ru/login.php и login.vk.com/?act=login
	curl_setopt($ch, CURLOPT_POST, 1);
	curl_setopt($ch, CURLOPT_POSTFIELDS, "email=".$email."&pass=".$pass);
	curl_setopt($ch, CURLOPT_URL, 'http://vkontakte.ru/login.php');
	$body = curl_exec($ch);

	curl_setopt($ch, CURLOPT_POST, 1);
	curl_setopt($ch, CURLOPT_POSTFIELDS, "email=".$email."&pass=".$pass);
	curl_setopt($ch, CURLOPT_URL, 'http://login.vk.com/?act=login');
	$body = curl_exec($ch);


Сабдомены


Домена больше 3-го уровня в ВК не видел, поэтому полного разбора домена не делал.
	$subdomain = explode(".",$_SERVER['SERVER_NAME']);
	if (count($subdomain) > $cnt_server) $sub = $subdomain[0]."."; else $sub = "";

Все (*) поддомены также необходимо добавить в DNS и VirtualHost.

Построение запросов, GET и POST


С запросами также не все так просто — они могут быть двойными массивами. В частности это относится к поиску. Поэтому это тоже нужно учитывать. Большей вложенности не замечал.
Я делал это так:
	$gl = $_GET;
	$first_get = true;
	$flink = false;
	foreach($gl as $key_get => $value_get){
		if(!$flink){
			$flink = true;
			continue;
		}
		if(is_array($gl[$key_get])){
			foreach($gl[$key_get] as $dbkey_get => $dbvalue_get){
				$link .= ($first_get?"?":"&").$key_get."[".$dbkey_get."]".(!empty($dbvalue_get) ? "=".urlencode($dbvalue_get) : "");
				$first_get = false;
			}
		} else {
			$link .= ($first_get?"?":"&").$key_get.(!empty($value_get) ? "=".urlencode($value_get) : "");
			$first_get = false;
		}
	}

С POST-запросами аналогично.

Фильтрация


Ничего сверхъестественного не применяется, обычные регулярные выражения и функции работы со строками для удаления фильтруемого трафика и замены ссылок.

Также не забудьте, что ВК работает с кодировкой Windows-1251.
И JavaScript может передаваться сжатым gzip, что исправляется библиотекой cURL:
	curl_setopt($ch, CURLOPT_ENCODING , 'gzip');

причем, данный параметр корректно работает и с несжатыми js-скриптами.

В заключение


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

P.S. Данная реализация позволяет воспроизводить аудио и видео контент, в то время как некоторые аналоги не поддерживают данную возможность. Игры, к сожалению, не поддерживаются.

P.P.S. Честно говоря, после перехода ВК на https-авторизацию (не знаю, когда это случилось), я не проверял работу скрипта, точнее работу авторизации.
Tags:
Hubs:
Total votes 19: ↑12 and ↓7+5
Comments15

Articles