IPConnection.UseProxy

From SunFlurry wiki
Revision as of 09:03, 7 August 2023 by Admin (talk | contribs) (1 revision imported)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search
  UseProxy (Задает прокси сервер для соединения)
Объект:Объект IP
Статус разработки: Реализована
Тип:Функция
Обращение к БД:Нет
Исключения:Невозможно превратить в строку, неверные аргументы
Визуальность:Нет

Функция настраивает прокси сервер для использования с данным соединением. Функция должна быть вызвана до фактического соединения с удаленной стороной на неактивном объекте, затем этот объект может использоваться совместно с функцией Connect. Для получения неактивного объекта соединения необходимо использовать функцию Create. Прокси сервер может быть использован как для прямых, так и для шифрованных соединений. Причем, SOCKS прокси работает для любых передач, а WEB прокси только для работы с Web-запросами (функции группы HTTP).

Синтаксис

IPConnection.UseProxy(<Адрес и порт прокси сервера (STRING)>,<Тип прокси сервера (STRING)>,<Имя пользователя прокси (STRING)>,<Пароль пользователя прокси (STRING)>,<Дополнительные параметры прокси (STRING)>)

Аргументы

  • <Адрес и порт прокси сервера (STRING)> - Адрес прокси сервера задается в виде <Доменное имя сервера, адрес IPv4 или IPv6>[:<Номер порта>] (примеры: 127.0.0.1:8080, webproxy.orgname.local:200, <::1=8080). При указании IP адреса (xxx.xxx.xxx.xxx или xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx), можно использовать квадратные скобки [, ] для отделения IP адреса от номера порта. Номер порта можно указывать после знака : или знака =, для IPv6 адресов можно использовать только знак = или использовать квадратные скобки, как разделитель, так как : занят для указания элементов адреса (примеры: 127.0.0.1=8080, [::1]:2020). Если номер порта в адресе не задан, используется порт 8080. Доменное имя будет автоматически закодировано в формат Punycode. (необязательный аргумент) Для некоторых видов прокси (к примеру, SFSERVER), этот аргумент не используется и должен быть пропущен.
  • <Тип прокси сервера (STRING)> - Указание на тип используемого прокси сервера. Возможны следующие значения:
    • SOCKS4 -- для данного типа прокси не может использоваться пароль (имя пользователя можно передать). Прокси сервер работает только с IPv4 и требует прямое указание на IP-адрес с которым будет происходить соединение. Если для идентификации удаленной стороны при соединении используется URL нотация, а не IP-адрес, система автоматически в момент соединения попытается ее превратить в IP и передать прокси. Если DNS-серверы в сети недоступны, соединение не будет выполнено.
    • SOCKS4A -- является дополнением к SOCKS4, позволяющим передавать на прокси сервер не только IP-адрес соединения, но и URL. В случае, когда в сети недоступны DNS-серверы, прокси-соединение будет продолжать работать корректно.
    • SOCKS5 -- является развитием SOCKS4, позволяющим задавать пароль и использовать IPv6.
    • HTTP или HTTPS -- равнозначные указания на Web-прокси (HTTP прокси может использоваться для нешифрованных соединений и наоборот), который может использоваться для доступа к Web-страницам. При указании этого типа сервера, пятый аргумент функции задает метод аутентификации (см. ниже).
    • SFSERVER -- позволяет перенаправить TCP соединение через сервер базы данных. Фактически пакеты соединения будут проходить по тому же каналу, по которому клиент программы соединен с сервером. Такое перенаправление может сильно упростить работу, если клиент используется для соединения с удаленным в интернете сервером. Практически, программа будет иметь доступ к ресурсам сети, которые доступны на машине сервера (таким образом, к примеру, можно получить доступ к серверу УТМ ЕГАИС, работая с клиентом из интернета и использовать тот же код, который использовался для работы с ним в локальной сети). При использовании такого типа прокси, нужно понимать:
      • В данный момент разрешено только перенаправление нешифрованных соединений (планируется к реализации).
      • Не рекомендуется использовать это перенаправление для передачи большого объема информации (это может замедлить работу клиента).
      • В прокси соединении будет отказано, пока на сервере не будут разрешены адрес и порт, к которым происходит соединение. Для соответствующих установок сервера, см. статью Установки сервера.
    • NGRC, NGRCCHANNEL -- позволяет перенаправить TCP соединение через сервер ngRC или сервер перенаправления (каналов), к которому в свою очередь соединен сервер ngRC, отвечающий по именованному каналу. Использование прокси такого рода удобно, так как серверы ngRC могут использоваться в организации для удаленного администрирования сети. Сервер каналов ngRC позволяет использовать удаленное администрирование в случае, когда удаленный сервер не имеет постоянного входящего адреса IP. С помощью этого типа прокси программа может получить доступ к сервисам, находящимся в сети, единственный способ подключения к которой -- сервер ngRC. Поддерживаются как шифрованные соединения (соединения с ключами), так и не шифрованные соединения, как для прямых серверов ngRC, так и для серверов каналов ngRC. В прокси соединении будет отказано, пока на ngRC сервере в его установках или в установках соединяющегося ключа не будут разрешены адрес и порт перенаправления, к которым происходит соединение. Для соответствующих установок сервера, см. статью Установки сервера. Для установки соединения с прямыми серверами ngRC, необходимо корректно заполнить первый (адрес и порт сервера ngRC), третий (бинарный ключ соединения, если соединение шифрованное) и четвертый (пароль сервера ngRC) аргументы. Для установки соединения с сервером каналов ngRC, необходимо корректно заполнить первый (адрес и порт сервера каналов ngRC), третий (бинарный ключ соединения, если соединение шифрованное), четвертый (пароль сервера ngRC)и пятый (пароль сервера каналов и имя канала) аргументы. См. описание соответствующих аргументов.
  • <Имя пользователя прокси (STRING)> - (необязательный аргумент) В зависимости от типа прокси сервера, аргумент задает:
    • SOCKS4, SOCKS4A, SOCKS5, HTTP, HTTPS: имя пользователя прокси сервера.
    • NGRC, NGRCCHANNEL: Если аргумент не задан или является пустой строкой, будет произведена попытка установки нешифрованного соединения с сервером ngRC (обычный порт сервера 37887), иначе задает ANSI строку с бинарным файлом ключа пользователя для установки шифрованного соединения (обычный порт сервера 37932).
    • SFSERVER: не используется.
  • <Пароль пользователя прокси (STRING)> - (необязательный аргумент) В зависимости от типа прокси сервера, аргумент задает:
    • SOCKS5, HTTP, HTTPS: пароль прокси сервера.
    • NGRC, NGRCCHANNEL: пароль ngRC сервера.
    • SOCKS4, SOCKS4A, SFSERVER: не используется.
  • <Дополнительные параметры прокси (STRING)> - (необязательный аргумент) Задает дополнительные параметры в зависимости от типа прокси-сервера. Возможны следующие значения аргумента:
    • Для HTTP или HTTPS серверов аргумент задает метод аутентификации и может принимать значения:
      • Basic -- (по умолчанию) простой метод аутентификации, передающий имя пользователя и пароль в заголовке HTTP пакета.
      • Bearer -- (планируется к реализации) аутентификация с помощью особой строки (токена), полученного от прокси-сервера ранее и имеющего определенный срок жизни.
      • OAuth -- (планируется к реализации) аутентификация, не передающая в заголовке прямым текстом имя пользователя и пароль, а только их хеш. Позволяет не опасаться, что пароль станет известен третьим лицам, если прокси сервер находится в Интернете.
      • SCRAM-SHA-1 или SCRAM-SHA-256 -- (планируется к реализации) методы аутентификации, позволяющие использовать хеши, ключи и шифрование.
    • Для SFSERVER прокси аргумент задает таймаут при передаче данных в миллисекундах. Если аргумент не задан, будет использовано время по умолчанию (обычно 10 минут). Соединение будет закрыто, если в течение указанного количества времени по нему не будет передана информацию в какую-либо сторону.
    • Для NGRCCHANNEL прокси аргумент задает пароль сервера каналов и имя ngRC канала, к которому необходимо подключиться. Связка задается в виде: [<Пароль сервера каналов>]<Знак 1><Имя канала для подключения>. "Знак 1" представляет собой знак с кодом 1, который можно получить вызовом Chr(1).

Примеры

//Измененный пример из статьи Connect показывает, как можно осуществить загрузку веб-страницы по ее адресу посредством SOCKS5 прокси сервера.
//Для загрузки по протоколу https требуется указание пути к библиотекам OpenSSL или LibreSSL.

  Function LoadPage(URL)
    bHTTPs:=pos("https://",Lowercase(URL));
    If pos("//",URL)>0 Then
      tearStr(URL,"//");
    EndIf;
    СтрДоб:=URL;    
    URL:=tearStr(СтрДоб,"/");
    //URL может содержать название параграфа
    СтрДоб:=TearStr(СтрДоб,"#");
    For i:=1 to 3 Do
      //Создаем неактивное соединение
      tcp:=IPConnection.Create();
      //Задаем прокси сервер для текущего соединения
      tcp.UseProxy("192.168.1.1:8080","SOCKS5","User","test123");
      if bHTTPs Then
        tcp.Connect(URL+?(Pos(":",URL)+Pos("=",URL)=0,"=443"),1);
      Else
        tcp.Connect(URL+?(Pos(":",URL)+Pos("=",URL)=0,"=80"));
      EndIf;  
      if tcp.IsConnected Then
        Break;
      EndIf;
    EndDo;
    if not tcp.IsConnected Then
      Message("Could not connect: "+URL,"!");
      Exit;
    EndIf;
    СтрДоб:="/"+СтрДоб;
    if bHTTPs then
      //tcp.InitEncryption("LibreSSL","C:\LibreSSL255\libtls-15.dll");
      tcp.InitEncryption("OpenSSL","C:\OpenSSL111e\libssl-1_1.dll");
    endif;  
    tcp.HTTPSetOperation("GET "+СтрДоб+" HTTP/1.0");
    tcp.HTTPSetHeaderField("Host",tcp.HTTPPunycodeEncode(URL));
    tcp.HTTPSetHeaderField("User-Agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)");
    tcp.HTTPSetHeaderField("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
    tcp.HTTPSetHeaderField("Accept-Language","en");
    tcp.HTTPSetHeaderField("Connection","Close");
    Стр:="";
    Try
      If tcp.HTTPSendAndReceive Then
        Стр:=tcp.HTTPBodyAsString;
        If _And(Pos(_NEWLINE,Стр)=0,Pos(Chr(10),Стр)>0) Then
          Стр:=Replace(Стр,Chr(10),_NEWLINE);
        EndIf;
      EndIf;
    Except
      Message("Could not load: "+URL,"!");
    EndTry;  
    Exit Стр;
  EndFunction

s:=LoadPage("https://en.wikipedia.org/wiki/Main_Page");
Message(s);