pproxy - прокси на PHP - Proxy-Base Community - Анонимность и безопасность в интернете.
Бесплатные прокси. Количество:
Прокси для пользователей форума (API). Количество:
Купить доступ к прокси-листам (API). Количество:
 



Информация по хайдам / репутации

(РЕКОМЕНДУЮ) №1 >>>DDos Атака<<|>>DDoS Service<<< ДДОС СЕРВИС<<|>>Заказать DDOS
Бесплатные прокси уже в Telegram
Все инфопродукты и приватная информация бесплатно
Старый 04.02.2010, 07:41   #1 (permalink)
VPN
 
Аватар для 2FED
 
Регистрация: 11.05.2009
Адрес: Сибирь
Сообщений: 458
Member ID: 4
ICQ 310234

Репутация: 855
Репутация: 855
Сказал(а) спасибо: 599
Поблагодарили 516 раз(а) в 199 сообщениях
Топикстартер (автор темы) По умолчанию pproxy - прокси на PHP

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

Описание
Состоит из двух частей. На удаленный веб-сервер заливается первая часть прокси, написанная на PHP - скрипт pproxy.php. На локалхосте запускается вторая часть прокси, реализованная на Perl (скрипт plocal.pl), которая прослушивает порт как HTTP-прокси. На этот локальный HTTP прокси настраивается, например, браузер.
Скрипты


pproxy.php - первая, удаленная часть прокси, на PHP:
PHP код:
<?php  

//$secret = 'pproxypass';  

if(isset($_POST['query']) && isset($_POST['host']))  
{  
    if(isset(
$secret) && ($_POST['secret'] != $secret))exit;  
    
header('Content-type: application/octet-stream');  
    @
set_time_limit(0);  
    
$query base64_decode($_POST['query']);  
    list(
$host$port) = explode(':'base64_decode($_POST['host']));  
    if(!
$port)$port 80;  
    
$ip gethostbyname($host);  
    if(
$fp = @fsockopen($ip$port$errno$errstr20))  
    {  
        
fwrite($fp$query);          
        while(!
feof($fp))  
        {  
            
$answer fread($fp1024);  
            echo 
$answer;  
        }  
        
fclose($fp);  
    }  
    exit;  
}  
?>
plocal.pl - вторая, локальная часть прокси, на Perl:
PHP код:
use HTTP::Daemon;
use 
MIME::Base64 ();
use 
Getopt::Long;
use 
POSIX ":sys_wait_h";
use 
strict;

my $user_agent 'Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.0.4) Gecko/2008102920 Firefox/3.0.4';

my $errheader "HTTP/1.1 200 OK\x0D\x0AContent-Type: text/plain\x0D\x0A\x0D\x0A";
my $errmsg1 $errheader 'Could not connect to server';
my $errmsg2 $errheader 'Could not connect to pproxy';

my ($pproxyhost$pproxyport$pproxyurl);
my ($tunnelhost$tunnelport);
my ($pproxy$bindport$tunnel$secret);
my ($destaddr$destport$desturl);

#Вывод справки
Usage() if @ARGV==0;

#Задание опций
GetOptions(
         
"px=s"        => \$pproxy,
         
"bp=s"     => \$bindport,
         
"tpx=s"    => \$tunnel,
         
"pwd=s"    => \$secret
     
);
die 
"need pproxy.php url" unless $pproxy;


#Получение параметров
$pproxy =~ /http:\/\/([\w\.\-]+)(:\d*)?\/(.+)/;
$pproxyhost = $1$pproxyport substr($21); $pproxyurl '/' . $3;

defined($pproxyport) || ($pproxyport 80);
defined($bindport) || ($bindport 8008);

if(
defined($tunnel))
{
    
$tunnel =~ /http:\/\/([\w\.\-]+):(\d*)?/;
    
$tunnelhost = $1$tunnelport = $2;

    
$destaddr $tunnelhost;
    
$destport $tunnelport;
    
$desturl $pproxy;

    print 
"# tunnelhost = $tunnelhost\n";
    print 
"# tunnelport = $tunnelport\n";
}else{
    
$destaddr $pproxyhost;
    
$destport $pproxyport;
    
$desturl $pproxyurl;
}

print 
"# pproxyhost = $pproxyhost\n";
print 
"# pproxyport = $pproxyport\n";
print 
"# pproxyurl = $pproxyurl\n";
print 
"# bindport = $bindport\n\n";

$|=
1;
my %children;
my $slave;

#Прием подключений
my $master HTTP::Daemon->new(    LocalPort => $bindport,
                
LocalAddr => 'localhost'
                
Reuse=>1)
|| die 
"Can't start server ($@)";
&
MainProc($slave) while $slave $master->accept;

sub MainProc
{
        
my $conn shift;

        
#Прием HTTP-запроса
        
my $request $conn->get_request();
        
        
#Ответвление процесса(потока)
        
my $pid fork();
        
unless(defined($pid))
        {
            print 
"# Erorr couldn't fork\n";
            
close $conn;
            return;
        }

        if(
$pid)
        {
            
close $conn;
            
$children{$pid}++;
            foreach(
keys %children )
            {
                
my $kid waitpid($_, &WNOHANG);
                
delete $children{$_} if($kid == -|| $kid == $_);
            }
            return;
        }

        
#Преобразование HTTP заголовка
        
$request -> remove_header('Proxy-Connection');
        
$request -> remove_header('Keep-Alive');
        
$request -> header(Connection=>'close');
        
my $host $request -> header('Host');
        
my $http $request -> as_string();
        
my $head_end index ($http"\x0A\x0A") + 2;
        
my $head substr ($http0$head_end);
        
my $post substr ($http$head_end);
        
$head =~ s/\x0A/\x0D\x0A/g;
        
$http $head $post;
        
$http =~ s/http:\/\/$host//;
        
my $time_start time;
        
        
#Отправка запроса прокси и прием результата
        
SendToPProxy(    MIME::Base64::encode($host),
                
MIME::Base64::encode($http),
                
$conn
                    
);

        
my $time_end time;
        
        
#Лог
        
print &TranslateTimeHour($time_end), "   "$host,
            
" (", &TranslateTime($time_end $time_start),
            
")\n";

        
close $conn;
        exit;
}

sub SendToPProxy
{
    
my $dest_host shift;
    
my $query_content shift;
    
my $clientsock shift;
    
    
my $proxysock IO::Socket::INET->new(Proto=>'tcp',PeerAddr=>$destaddr,PeerPort=>$destport);
    
unless($proxysock)
    {
        
syswrite($clientsock$errmsg2length($errmsg2));
        return; 
    }
    
    
my $post_query;
    
$post_query 'secret=' $secret '&' if defined($secret);
    
$post_query .= 'host=' $dest_host '&query=' $query_content;
    
my $postlen length($post_query);

    
my $request "POST $desturl HTTP/1.0\x0D\x0A".
            
"Host: $pproxyhost:$pproxyport\x0D\x0A".
            
"Accept: */*\x0D\x0A".
            
"Content-Type: application/x-www-form-urlencoded\x0D\x0A".
            
"Content-Length: $postlen\x0D\x0A".
            
"User-Agent: $user_agent\x0D\x0A".
            
"Connection: close\x0D\x0A\x0D\x0A" $post_query;

    
syswrite($proxysock$requestlength($request));
    
my ($result$buffer$response);
    
my $contentstart = -1;
    
my $count 0;
    while(
1)
    {
        
$result sysread($proxysock$buffer1024);
        
last if !defined($result) || !$result;

        if(
$contentstart == -1)
        {
            
$response .= $buffer;
            
last if length($response)>65535;
            
$contentstart index($response,"\x0D\x0A\x0D\x0A");
            
next if $contentstart == -1;
            
$buffer substr($response$contentstart+4);
        }
        
$count += length($buffer);
        
syswrite($clientsock$bufferlength($buffer));
    }
    
syswrite($clientsock$errmsg1length($errmsg1)) if $count == 0;
    
close $proxysock;
}

sub TranslateTime
{
    
my ($sec$min$hour$mday$mon$year$wday$yday$isdst) = localtime(shift);
    return 
sprintf "%02u:%02u"$min$sec;
}

sub TranslateTimeHour
{
    
my ($sec$min$hour$mday$mon$year$wday$yday$isdst) = localtime(shift);
    return 
sprintf "%02u:%02u:%02u"$hour$min$sec;
}

sub Usage
{
    print 
"Usage: $0 -px proxy_url [-bp bindport] [-tpx tunnel_proxy] [-pwd secret]\n";
    print 
"Example: $0 -px http://site.com/proxy/proxy.php -bp 8080\n";
    print 
"         $0 -px http://site.com/proxy/proxy.php -pwd pproxypass\n";
    print 
"         $0 -px http://site.com/proxy/proxy.php -tpx http://localhost:8118\n";
    print 
"\nDefault bind port - 8008\n";
    exit;

Использование прокси

Допустим адрес pproxy.php будет http://site.com/proxy/pproxy.php
Тогда локальный скрипт запускается так:
Код:
perl plocal.pl -px http://site.com/proxy/pproxy.php
По умолчанию открывается порт 8008
Построение цепочки прокси

Для примера случай с двумя элементами цепочки.
Есть два веб-сервера с двумя скриптами pproxy:
_http://site1.com/proxy/pproxy.php и
_http://site2.com/proxy/pproxy.php
Локальный скрипт запускается два раза с такими параметрами:
Код:
perl plocal.pl -px http://site1.com/proxy/pproxy.php
perl plocal.pl -px http://site2.com/proxy/pproxy.php -tpx http://localhost:8008 -bp 8009
Браузер следует настроить на 8009 порт и трафик пойдет по такой цепочке:
localhost -> site1.com -> site2.com -> target
Думаю, несложно будет настроить и на более длинную цепочку.
Запуск через Tor

Если вы используете Tor вместе с Privoxy (по умолчанию на порту 8118)
тогда прокси запускается так:
Код:
perl plocal.pl -px http://site.com/proxy/pproxy.php -tpx http://localhost:8118
Соответственно _http://site.com/proxy/pproxy.php - адрес PHP-прокси
К сожалению, через Tor некоторые сайты могут загружаться некорректно,
причины пока неизвестны.
Установка пароля

В pproxy.php раскомментировать строчку,
написать там свой пароль
Код:
$secret = 'pproxypass';
в параметрах запуска plocal.pl указать его же.
Примечания

1. Если вы хотите в качестве элемента цепочки узел SOCKS, то Privoxy поможет вам (см пример с Tor)
2. pproxy.php очень компактен и легко может быть внедрен в код сайта,
Возможно это немного повысит ваш уровень анонимности.
3. Не стоит забывать что веб-серверы ведут логи и восстановить истинный источник нетрудно даже по цепочке
Спасибо за совет: b3, AkyHa_MaTaTa
(с) antichat.ru - bons
Видео
2FED вне форума   Ответить с цитированием
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Вкл.





DDoS Protected




Мы в твиттере, Proxy-Base.Org Twitter

Proxy-Base Community - Анонимность и безопасность в интернете.
Наши партнеры: CRC Labs, SEO-Crack.Com, Garsuk.Com, SED Team, Skladchik.com, BSS Family

Powered by vBulletin® | Булка сделана в пекарне®
Copyright © 2000 - , Jelsoft Enterprises Ltd. Перевод: zCarot
Вся информация на сайте выложена исключительно в ознакомительных целях.