php curl. Автоопределение http и socks прокси, как?

Discussion in 'PHP' started by Mixon, 14 Aug 2012.

  1. Mixon

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

    Joined:
    12 Mar 2008
    Messages:
    394
    Likes Received:
    119
    Reputations:
    12
    Всем известно что есть разные виды прокси (http,https,socks4,socks5...), но как в пхп можно определить, как с прокси работать, как с http или как с соксом соответственно?

    Насколько я знаю то у http,https одинаковый протокол работы с прокси, и с ними можно работать просто добавив к curl запросу эту строчку
    PHP:
    curl_setopt($chCURLOPT_PROXY'ip:port');
    У socks4,socks5 другой протокол, и работать они станут лишь так
    PHP:
    curl_setopt($chCURLOPT_PROXYTYPECURLPROXY_SOCKS5);
     
    curl_setopt($chCURLOPT_PROXY'ip:port');
    Но а как сделать автоматическое определение протокола работы с проксей без быдло-проверки "если так страница не появилась значить пробуем как сокс"?
     
  2. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Mixon
    Нет. Подробнее читайте в этом топике https://forum.antichat.ru/thread344815.html и про CURLOPT_HTTPPROXYTUNNEL

    Socks4 и socks5 разные протоколы. Курл не умеет работать через socks4

    Попробуйте подумать логически и придумать способ зная только ip:port без подключения "угадать" протокол. Все прокси-протоколы обязывают клиента первым отправлять запрос.

    И вообще: проверять прокси с помощью курла - неправильно. Например, достаточно сложно узнать на каком этапе произошла ошибка. Была ли это ошибка подключения к самой прокси, или ошибка подключения прокси к целевому сайту, или ошибка авторизации. Вариантов - много.
     
    _________________________
    #2 Gifts, 14 Aug 2012
    Last edited: 14 Aug 2012
  3. Mixon

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

    Joined:
    12 Mar 2008
    Messages:
    394
    Likes Received:
    119
    Reputations:
    12
    Ну тогда нужен хотя-бы более эстетический вариант проверки какой это прокси соединившись с ним, не через курл с его милионном параметров не нужных, пытаясь получить сайт какой-то а потом парсить его, и есть спарсился сайт - значит прокси жив и он такого-то типа, а то-то более изысканное.

    пока хз что, но мб можно допустим через fsockopen или что-то подобное подконнектится лишь чтоб узнать тип прокси?

    допустим тот-же пинг на компе, он-же не заставляет кучу данных принять и отправить о компе, а лишь маякает что да, я сдесь, так-же что-то надо чтоб проверить прокси на его тип, не нагружая его, если это возможно как-то
     
  4. VY_CMa

    VY_CMa Green member

    Joined:
    6 Jan 2012
    Messages:
    909
    Likes Received:
    461
    Reputations:
    722
    Mixon, могу только предположить... Проверять через свой скрипт. Допустим при коннекте чере простой прокс, $_SERVER имеет такие ключи, как
    Тестил на двух проксах. По поводу socks'сов сказать не могу поскольку не имею в наличии образца для теста, а искать некогда.
     
    _________________________
  5. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Mixon
    Socks4 и socks5 достаточно детерминированные протоколы и да, их достаточно легко проверить на работоспособность. С HTTP/HTTPS не все так очевидно и следует все таки подключаться к целевому серверу.

    У вас наблюдается непонимание работы сетевых протоколов (надеюсь вы не думаете что все работает на магии?). ICMP (пинг) - не самый простой в реализации протокол

    И да, VY_CMa, правильно советует - вы должны проверять не абы какой сайт, а собственный отдающий например JSON определенного формата. Чтобы не приходилось "парсить" левые данные
     
    _________________________
  6. Mixon

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

    Joined:
    12 Mar 2008
    Messages:
    394
    Likes Received:
    119
    Reputations:
    12
    Об этом и шла речь как я понял. надо сделать то что легче проверять, тобишь методом исключения, проверить, если это socks5 то значи юзать параметр сокса, если не он - юзать хттп, и всё....
    с дальнейшей проверкой хттп и прочего это уже не суть вопроса, нужно именно как-либо выбрать какой параметр использовать: CURLPROXY_SOCKS5 или CURLPROXY_HTTP (их всего 2)...
    по подробней плиз о том как можно сокс5й проверить что он сокс собстна без запроса к странице какой-либо.
     
  7. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Mixon
    http://www.opennet.ru/base/net/socks5_rfc1928.txt.html

    Если по простому - достаточно подключиться по адресу и отправить комбинацию "\x05\x01\x00"

    Если вернулось "\x05\x00" - это сокс5 прокси. Если \x05\xff - это сокс5 прокси, но с авторизацией. Если вернулось что-то иное или ничего не вернулось - это НЕ сокс5 прокси
     
    _________________________
  8. qaz

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

    Joined:
    12 Jul 2010
    Messages:
    1,582
    Likes Received:
    173
    Reputations:
    75
    а какже CURLPROXY_SOCKS4 ?
     
  9. Mixon

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

    Joined:
    12 Mar 2008
    Messages:
    394
    Likes Received:
    119
    Reputations:
    12
    его не существует

    [​IMG]

    во пасибки это всё что надо было, сейчас займусь)
     
  10. GRRRL Power

    GRRRL Power Moderator

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Стоит учесть, что на одном порту может крутиться как HTTP(S), так и SOCKS5-прокси.
     
    _________________________
  11. Mixon

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

    Joined:
    12 Mar 2008
    Messages:
    394
    Likes Received:
    119
    Reputations:
    12
    это редкие случаи, да и если так - то никаких проблем не возникнет, ибо хоть так хоть так работать будет, а ведь и надо-то чтоб работал...)
     
  12. qaz

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

    Joined:
    12 Jul 2010
    Messages:
    1,582
    Likes Received:
    173
    Reputations:
    75
    как так? я когда тестироват прокси чекер своими глазами видел как через прокси при CURLPROXY_SOCKS4 открывает сайт, а через CURLPROXY_SOCKS5 нет
     
  13. Mixon

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

    Joined:
    12 Mar 2008
    Messages:
    394
    Likes Received:
    119
    Reputations:
    12
    похоже на кнопку "сделать хорошо" :D

    п.с. http://php.net/manual/ru/function.curl-setopt.php
     
    #13 Mixon, 14 Aug 2012
    Last edited: 14 Aug 2012
  14. qaz

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

    Joined:
    12 Jul 2010
    Messages:
    1,582
    Likes Received:
    173
    Reputations:
    75
    Что ты етими словами хочешь сказать, я тебя не понял?


    ну а как тогда чекать сокс4?
     
  15. Mixon

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

    Joined:
    12 Mar 2008
    Messages:
    394
    Likes Received:
    119
    Reputations:
    12
    в курле поддержки сокс4 нет, если на то пошло, по документации
     
  16. qaz

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

    Joined:
    12 Jul 2010
    Messages:
    1,582
    Likes Received:
    173
    Reputations:
    75
    как тогда чекать сокс4? может кто ткнёт носом где почитать
     
  17. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    qaz По уточненным данным - есть поддержка сокс4 в курле в пхп. Просто документацию никто не удосужился изменить, но все константы - определены и работают.

    А как чекать - согласно протокола, естественно http://en.wikipedia.org/wiki/SOCKS#SOCKS4
     
    _________________________
  18. krypt3r

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

    Joined:
    27 Apr 2007
    Messages:
    1,508
    Likes Received:
    389
    Reputations:
    101
    SOCKS5 с авторизацией возвращает \x05\x02. \xff — метод не определен (fail, если короче).
    http://ru.wikipedia.org/wiki/Socks
    http://csocks.altervista.org/rfc/socks4.protocol.txt
    http://google.ru
    и т.д. У меня в древней чекалке для SOCKS4 написан такой код (Perl):
    Code:
      my $sk4_conn = "\x04"                      # Socks version
                   . "\x01"                      # Connect
                   . pack ('n', $check_port)     # Port
                   . gethostbyname ($check_host) # Remote address
                   . "\x00";
    
    $check_host и $check_port — запрашиваемый через SOCKS сайт ($check_port по дефолту 80). В ответ сервер отдает 8 байт, важными являются первые два: \x00\x5a (по RFC; \x5a — request granted).

    PS. Если не изменяет память, на практике некоторые SOCKS4 в ответе первым байтом отдают \x04, а не \x00. Обнаружилось это при отладке чекалки в сниффере.
     
  19. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    krypt3r
    Если бы вы внимательно посмотрели, то я предлагаю отправлять \x05\x01\x00 - что означает, что мы ожидаем прокси без авторизации. Ответ \x05\xFF означает, что метод без авторизации не поддерживается, но прокси - рабочая. И продолжая занудствовать - \x02 указывает на авторизацию plain-text, но еще существует GSSAPI авторизация + неограниченное число собственных.
     
    _________________________
  20. Lazy

    Lazy New Member

    Joined:
    19 Jul 2011
    Messages:
    95
    Likes Received:
    2
    Reputations:
    3
    Я правильно понимаю что использовать для этого curl уже никак не получится ? Он вроде ко всему приделывает http заголовки .
     
Loading...