Новичок
Профиль
Группа: Участник
Сообщений: 21
Регистрация: 27.2.2008
Репутация: нет Всего: нет
|
Привет всем! вообщем использую такой проксик http://www.xakep.ru/post/50594/но он что то не обрабатывает протокол https (ssl) вот оригиналы для наглядности Код |
<?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 = bаse 64_decode(str_replace(' ', '+', $_POST['query'])); list($host, $port) = explode(':', bаse 64_decode($_POST['host'])); if(!$port)$port = 80; $ip = gethostbyname($host); if($fp = @fsockopen($ip, $port, $errno, $errstr, 20)) { fwrite($fp, $query); while(!feof($fp)) { $answer = fread($fp, 1024); echo $answer; } fclose($fp); } exit; } ?>
|
Код | use HTTP::Daemon; use MIME::bаse 64 (); 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($2, 1); $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 == -1 || $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 ($http, 0, $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::bаse 64::encode($host), MIME::bаse 64::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, $errmsg2, length($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, $request, length($request)); my ($result, $buffer, $response); my $contentstart = -1; my $count = 0; while(1) { $result = sysread($proxysock, $buffer, 1024); 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, $buffer, length($buffer)); } syswrite($clientsock, $errmsg1, length($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; }
|
как сделать что бы он обрабатывал и https протакол ???
|