pproxy - прокси на PHP

Обсуждение в разделе «Избранное», начал(-а) bons, 24.11.2008.

  1. bons

    bons Elder - Старейшина

    Регистрация:
    20.12.2007
    Сообщения:
    288
    Одобрения:
    121
    Репутация:
    21
    можно поставить собаку перед функцией explode
    Code:
    list($host, $port) = @explode(':', base64_decode($_POST['host']));
     
  2. UM9I

    UM9I New Member

    Регистрация:
    15.01.2006
    Сообщения:
    7
    Одобрения:
    0
    Репутация:
    0
    Здраствуите !

    У меня такая проблемка :
    есть шелл на web server, xampp, но - listen port стоит 9600 а не 80.
    Пишу :

    C:\Documents and Settings\Admin>C:\strawberry\perl\bin\perl.exe C:\plocal.pl -px http://remote-IP:9600/pproxy.php

    и без результата.. . Как бы это поправить ?
    Спасибо :)
     
  3. UM9I

    UM9I New Member

    Регистрация:
    15.01.2006
    Сообщения:
    7
    Одобрения:
    0
    Репутация:
    0
    да нет.
    Паролья нету, а порт по умалчанию 8080
     
  4. UM9I

    UM9I New Member

    Регистрация:
    15.01.2006
    Сообщения:
    7
    Одобрения:
    0
    Репутация:
    0
    он кагбе подвисает и клваиши CTRL + C возврасчают : Terminating on signal SIGINT(2)
     
  5. gluke

    gluke Banned

    Регистрация:
    6.06.2008
    Сообщения:
    69
    Одобрения:
    40
    Репутация:
    1
    Попробуй
    В pproxy.php
    if(!$port)$port = 80; замени на 9600

    В plocal.pl
    defined($pproxyport) || ($pproxyport = 80); на 9600
     
  6. UM9I

    UM9I New Member

    Регистрация:
    15.01.2006
    Сообщения:
    7
    Одобрения:
    0
    Репутация:
    0
    чтота незаметил етих строк до етого :)

    Да теперь запустился :
    # pproxyhost = remote-IP
    # pproxyport = 9600
    # pproxyurl = /xampp/pproxy.php
    # bindport = 8008

    теперь проблема с настройкой Brouser'a
    localhost:8008 , 127.0.0.1:8008
    не работает :/
     
  7. djazatik

    djazatik Elder - Старейшина

    Регистрация:
    21.04.2009
    Сообщения:
    114
    Одобрения:
    104
    Репутация:
    22
    уфф, еле разобрался))
    Очень пригодилось, спасибо автору)
     
  8. gluke

    gluke Banned

    Регистрация:
    6.06.2008
    Сообщения:
    69
    Одобрения:
    40
    Репутация:
    1
    UM9I
    А конкретнее?
    Файрвол? Не?
    Сервер точно поддерживает исходящие соединения?
     
  9. UM9I

    UM9I New Member

    Регистрация:
    15.01.2006
    Сообщения:
    7
    Одобрения:
    0
    Репутация:
    0
    Насчот удалённой машини незнаю.
    удалось зальить шелл, и теперь питаюсь pproxy поставить . . . (think)
     
  10. Bitman

    Bitman New Member

    Регистрация:
    8.03.2010
    Сообщения:
    1
    Одобрения:
    0
    Репутация:
    0
    Хотелось бы реализовать сжатие на стороне сервера и распаковку принятых данных в клиенте. На сервере сжимаю в gzip, но как потом сделать декомпресс в клиенте? Кто-нибудь пытался сделать подобное?
     
  11. yasya17

    yasya17 New Member

    Регистрация:
    25.01.2010
    Сообщения:
    4
    Одобрения:
    0
    Репутация:
    0
    Помогла следующая коррекрировка:
    @list($host, $port) = @explode(':', base64_decode($_POST['host']));
     
  12. Nek1t

    Nek1t Elder - Старейшина

    Регистрация:
    7.03.2008
    Сообщения:
    193
    Одобрения:
    16
    Репутация:
    1
    Удваиваю, было бы отлично.
     
  13. c0m

    c0m Elder - Старейшина

    Регистрация:
    26.01.2007
    Сообщения:
    37
    Одобрения:
    3
    Репутация:
    0
    у меня такая проблема не могу сделать цепочку
    в батнике:
    Code:
    perl D:\wamp\www\plocal.pl -px ссылка1 -pwd index perl D:\wamp\www\plocal.pl -px ссылка2 -pwd indexdirect -tpx http://localhost:8008 -bp 8009
    в строке пишет

    # tunnelhost = localhost
    # tunnelport = 8008
    # pproxyhost = ссылка2
    # pproxyport = 80
    # pproxyurl = соответственно путь к файлу2
    # bindport = 8009

    подключаюсь localhost:8009 пишет Could not connect to pproxy
    по отдельности все работает
     
  14. Ctacok

    Ctacok Banned

    Регистрация:
    19.12.2008
    Сообщения:
    755
    Одобрения:
    649
    Репутация:
    251
    Заработало сразу, без проблем.
    Спасибо.
     
  15. just_panic

    just_panic New Member

    Регистрация:
    5.06.2010
    Сообщения:
    69
    Одобрения:
    2
    Репутация:
    0
    Вот написал на C++ Builder'e локальную часть (plocal.pl).
    Но почему то тяжёлые сайты не грузит, хотя на перловой версии всё норм.

    Unin1.h
    Code:
    //---------------------------------------------------------------------------
    
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <IdBaseComponent.hpp>
    #include <IdComponent.hpp>
    #include <IdHTTP.hpp>
    #include <IdTCPClient.hpp>
    #include <IdTCPConnection.hpp>
    #include "IdCoderMIME.hpp"
    #include <IdCoder.hpp>
    #include <IdCoder3to4.hpp>
    
    struct HTTP_PROXY_DATA
    {
        AnsiString remote_script;
        WORD       bind_port;
        unsigned int client_sock;
    };
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:	// IDE-managed Components
        TMemo *Memo;
        TLabel *Label1;
        TEdit *EPort;
        TEdit *EScript;
        TButton *BStart;
        TIdEncoderMIME *Base64Encode;
        TMemo *Memo1;
        void __fastcall BStartClick(TObject *Sender);
        void __fastcall FormCreate(TObject *Sender);
        void __fastcall FormDestroy(TObject *Sender);
    private:	// User declarations
    public:		// User declarations
        __fastcall TForm1(TComponent* Owner);
        HTTP_PROXY_DATA proxy_data;
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    
    
    unit1.cpp
    Code:
    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #include <winsock2.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma link "IdCoderMIME"
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    DWORD WINAPI ProxyThread(LPVOID lpParam);
    
    //---------------------------------------------------------------------------
    void ParseHeader(char *header, int header_size, TStringList *header_lst)
    {
        if(!header_lst) return;
        AnsiString  header_key = "", tmp;
    
        for(int i = 0; i < header_size; i++)
        {
            if(header[i] != '\r' && header[i + 1] != '\n')
                header_key += header[i];
            else {
                i++;
                if(!header_key.IsEmpty())
                    header_lst->Add(header_key);
                header_key = "";
            }
        }
    }
    //---------------------------------------------------------------------------
    AnsiString RemoveHeaderVal(TStringList *header_lst, TStringList *remove_key)
    {
        for(int i = 0; i < header_lst->Count; i++)
        {
            for(int j = 0; j < remove_key->Count; j++)
            {
                AnsiString rem;
    
                rem = remove_key->Strings[j];
                if(header_lst->Strings[i].SubString(0, rem.Length() + 1) == (rem + ':'))
                {
                    header_lst->Delete(i);
                    i--;
                    break;
                }
            }
        }
        return header_lst->Text + "\r\n";
    }
    //---------------------------------------------------------------------------
    AnsiString GetHeaderVal(TStringList *header_lst, AnsiString key)
    {
        AnsiString  result;
        int flag = 0;
    
        for(int i = 0; i < header_lst->Count; i++)
        {
            result = header_lst->Strings[i].SubString(0, key.Length() + 1);
            if(result == (key + ':'))
            {
                result = header_lst->Strings[i].SubString(result.Length() + 1,
                                header_lst->Strings[i].Length());
                break;
            }
        }
    
        for(int i = 1; i < result.Length() + 1; i++) {
            if(result[i] == ' ') {
                flag++;
                break;
            }
        }
    
        result = result.SubString(flag + 1, result.Length());
        return result;
    }
    //---------------------------------------------------------------------------
    DWORD WINAPI ServerProxyThread(LPVOID lpParam)
    {
        HTTP_PROXY_DATA *proxy_data = (HTTP_PROXY_DATA *)lpParam;
        SOCKET serv_sock, client_sock;
        SOCKADDR_IN serv_addr, client_addr;
        HANDLE hThread;
        int res;
    
        //создаю серверную часть
        serv_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if(serv_sock == SOCKET_ERROR) return -1;
    
        serv_addr.sin_family      = AF_INET;
        serv_addr.sin_port        = htons(proxy_data->bind_port);
        serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    
        res = bind(serv_sock, (sockaddr *)&serv_addr, sizeof(serv_addr));
        if(res == SOCKET_ERROR) return -1;
    
        listen(serv_sock, 100);
        //MessageBox(0, proxy_data->remote_script.c_str(), 0, 0);
    
        //цикл для клиентов
        while(1)
        {
            int size;
            size = sizeof(client_addr);
    
            client_sock = accept(serv_sock, (sockaddr *)&client_addr, &size);
            if(client_sock == SOCKET_ERROR) break;
    
            proxy_data->client_sock = client_sock;
            
            hThread = CreateThread(NULL, 0, ProxyThread, proxy_data, 0, NULL);
            if(hThread == INVALID_HANDLE_VALUE) break;
            CloseHandle(hThread);
        }
        closesocket(serv_sock);
        return 0;
    }
    //----------------------------------------------------------------------------
    DWORD WINAPI ProxyThread(LPVOID lpParam)
    {
        HTTP_PROXY_DATA *proxy_data = (HTTP_PROXY_DATA *)lpParam;
        SOCKET  client = proxy_data->client_sock;
        int     res, swap_len, cur;
        char    header[1024];
        AnsiString result_header, result_host, swap;
        TIdHTTP       *tunnel = new TIdHTTP(Form1);
        TStringStream *result = new TStringStream("");
        TStringList   *post   = new TStringList;
        TStringList   *header_lst = new TStringList;
        TStringList   *remove_key = new TStringList;
    
        //получаю хидер от браузера
        res = recv(client, header, sizeof(header), 0);
        if(res == SOCKET_ERROR || res == 0) return -1;
    
        ParseHeader(header, res, header_lst);
        //добавляю в хидер Connection: close
        header_lst->Insert(1, "Connection: close");
    
        //удаляю ключи
        remove_key->Add("Proxy-Connection");
        remove_key->Add("Keep-Alive");
    
        result_header = RemoveHeaderVal(header_lst, remove_key);
        //получаю host
        result_host = GetHeaderVal(header_lst, "Host");
    
        //перегоняю POST данные в base64
        result_header = Form1->Base64Encode->Encode(result_header);
        result_host   = Form1->Base64Encode->Encode(result_host);
    
        //с помощью TIdHTTP посылаю данные proxy.php
        post->Add("query=" + result_header);
        post->Add("host=" + result_host);
        tunnel->Post(proxy_data->remote_script, post, result);
    
    //посылаю результат обратно браузеру
        swap     = result->DataString;
        swap_len = result->DataString.Length();
        cur = 0;
        Form1->Memo1->Lines->Add(swap);
        while(swap_len > 0)
        {
            res = send(client, (swap.c_str() + cur), swap_len, 0);
            if(res == 0) break;
            else if(res == SOCKET_ERROR) {
                Form1->Memo->Lines->Add("Ошибка при передачи данных браузеру");
                break;
            }
            swap_len -= res;
            cur += res;
        }
    
        delete tunnel, post, header_lst, remove_key, result;
    
        closesocket(client);
        return 0;
    }
    //----------------------------------------------------------------------------
    
    void __fastcall TForm1::BStartClick(TObject *Sender)
    {
        HANDLE hThread;
    
        proxy_data.remote_script = EScript->Text;
        proxy_data.bind_port     = EPort->Text.ToInt();
    
        hThread = CreateThread(0, 0, ServerProxyThread, &proxy_data, 0, 0);
        if(hThread == INVALID_HANDLE_VALUE)
        {
            Memo->Lines->Add("Не могу создать поток");
            return;
        }
        CloseHandle(hThread);
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
        WSADATA wsaData;
    
        if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
        {
            Memo->Lines->Add("WSAStartup error");
            return;
        }    
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormDestroy(TObject *Sender)
    {
        WSACleanup();    
    }
    //---------------------------------------------------------------------------
    
    М.б кто найдёт баг
    вот исходники _http://slil.ru/29503509
     
    #135 just_panic, 27.07.2010
    В последний раз редактировалось: 27.07.2010
  16. coden

    coden New Member

    Регистрация:
    4.09.2009
    Сообщения:
    9
    Одобрения:
    1
    Репутация:
    0
    Хороший скрипт и клиентская часть, но есть проблема:
    -Соединения в потоках могут надолго подвисать, особенно это заметно после закачки больших файла в несколько потоков. После того как файл закачался, все эти потоки, вместе с открытыми соединениями, продолжительное время висят в памяти, мешая дальнейшей работе и существенно снижая скорость передачи.

    Нашел похожий скрипт от программера из Калькуты,Arunava Bhowmickа называется India Web Proxy v1.0

    Выделю несколько отличительных черт:
    -отслеживается конец передачи и своевременно завершаются соединения с сервером, благодаря этому потоки не весят долгое время в памяти.
    -Есть поддержка HTTP и HTTPS.
    -Клиентская часть выполнена на Java, следовательно пойдет во многих ОС.
    -Три уровня логирования, лог можно отключить совсем, что и рекомендуется сделать.
    -Можно включать шифрование трафика между нами и скриптом.

    Принцип действия тот же, закидываем на сервер скрипт. Запускаем программу, настраиваем, прописываем HTTP и SSL прокси в браузере и вперед. Все очень понятно и по шагам описано здесь.

    Тестируем и отписываемся у кого как работает, что можно улучшить, доработать.
     
    #136 coden, 3.08.2010
    В последний раз редактировалось: 4.08.2010
  17. flashdot

    flashdot New Member

    Регистрация:
    11.08.2010
    Сообщения:
    1
    Одобрения:
    0
    Репутация:
    0
    что-то не получается сделать gzip сжатие между клиентом и сервером, есть умельцы кто поможет ?
     
    #137 flashdot, 13.08.2010
    В последний раз редактировалось: 14.08.2010
  18. valyka80

    valyka80 Banned

    Регистрация:
    14.06.2010
    Сообщения:
    163
    Одобрения:
    20
    Репутация:
    16
    Долго искал пхп проксик на хост и все таки нашел.
    Мне понравилось круто сделанно.

    PHP Secure proxy - программа для туннелирования HTTP/HTTPS трафика через PHP-гейт.
    На написание меня подтолкнула идея bons'a, в реализации которого не было необходимого мне функционала, и самое главное, GUI.

    [ Возможности ]
    [+] Поддержка HTTPS для php-гейтов.
    [+] Туннелирование HTTPS трафика (добавлено в версии 1.1.0)
    [+] Возможность установки пароля на гейт.
    [+] Возможность работы с гейтом через SOCKS5 прокси.
    [+] Работа с гейтом происходит исключительно с помощью метода GET, что обеспечивает защиту от обнаружения по лог-файлам сервера.
    [+] Возможность установки Cookies, передаваемых при обращении к гейту. Это полезно при сокрытии кода гейта в файлах сайта. Формат: "mycookie=value; mycookie2=123;"
    [+] Обработка каждого соединения происходит в отдельном потоке.
    [+] Возможность скачивания и закачивания неограниченно больших файлов (в случае невозможности обхода ограничения set_time_limit() скачивание файлов возможно за несколько раз при условии поддержки докачки со стороны целевого сервера).
    [+] Механизм препроцессинга запросов оптимизирует работу под HTTP 1.0.
    [+] Наличие шифрования со случайным ключом (шифрование чисто символическое, чтобы скрыть трафик от любопытных глаз); все данные, включая пароль от гейта, передаются в зашифрованном виде. Включение/выключение шифрования не требует правки кода гейта.
    [+] Возможность работы сразу с несколькими гейтами. В этом случае за каждым гейтом закрепляется определённый User-Agent (назначаемый случайно), что не позволит на целевом сайте связать воедино запросы от разных гейтов.
    [+] Возможность выбора интерфейса для прослушивания.
    [+] Подробная статистика по сетевым соединениям, имеются разные уровни профилирования запросов (причём никакие логи не пишутся в файлы).
    [+] Ключи запуска:
    -tray - сворачивает окно в трей при запуске.
    -start - автоматически инициализирует прокси.
    Для запуска вместе с системой добавьте в Автозапуск ярлык "[dir]\VPSProxy.exe -tray -start"
    -hidden - делает то же самое что и -tray, плюс скрывает иконку из трея.

    [ Краткое руководство ]
    1. Закачиваем на сайт файл gate.php (пароль по умолчанию - "123").
    2. В программе добавляем URL на залитый гейт и пароль/cookies, если нужно. Выбираем его галочкой Use.
    3. Порты и интерфейс для прослушивания в большинстве случаев можно оставить по умолчанию.
    4. Нажимаем кнопку Start и настраиваем браузер на работу через проксиlocalhost:2222 (HTTP) и localhost:2223 (HTTPS).
    5. Прокси должен заработать. Пробуем зайти на internet.yandex.ru.

    Проверял на:
    http://leader.ru/secure/who.html
    http://www.anonymize.net/current-ID.phtml
    http://ipid.shat.net

    Ссылка:

    http://grabberz.com/showthread.php?p=300168
     
  19. HIMIKAT

    HIMIKAT Elder - Старейшина

    Регистрация:
    12.01.2007
    Сообщения:
    2 726
    Одобрения:
    570
    Репутация:
    402
    Все это можно было не писать, а скинуть ссылку на тред:

    https://forum.antichat.ru/thread227973.html

    который кстати находится по соседству
     
    Это одобряет 1 пользователь.
  20. lasttankist

    lasttankist New Member

    Регистрация:
    4.05.2008
    Сообщения:
    1
    Одобрения:
    1
    Репутация:
    5
    спасибо автору за скрипт.долгое время пользовался.к сожалению из-за отсутствия https пришлось перейти на VPSproxy. но т.к. была острая необходимость в подобном скрипте пришлось выучить и разобраться в PHP и Perl`е.Жирный плюс.