Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] $_SERVER, proxy
Forum PHP.pl > Forum > Przedszkole
kaczors
Witam.
Jestem w trakcie próby stworzenia weryfikatora serwerów proxy, nie opierającego się na bazie znanych adresów ip serwerów proxy. Jak wiadomo należy bacznie prześledzić zmienne środowiskowe, które powinny nas doprowadzić do najbardziej prawdopodobnego wyniku.

Wzoruję się na takich stronach:

http://www.jockersoft.com/english/ipaddress.php
oraz
http://www.proxyserverprivacy.com/adv-free...-detector.shtml

Napotykam takie oto problemy: Na tych stronach odczytują:

Connection: keep-alive
Keep-Alive: 300

Pierwsza z informacji teoretycznie powinna się znaleźć w zmiennej 'HTTP_CONNECTION', lecz w moim skrypcie nie istnieje taka zmienna.
Czy widoczność tej zmiennej zależy od serwera na którym stoi skrypt??

Także po wejściu na te strony mam:

Proxy HTTP_X_FORWARDED Variable: (none)

Proxy HTTP_VIA Variable: (none)

Proxy HTTP_PROXY_CONNECTION: (none)

Gdzie w moim skrypcie te zmienne mają pewne wartości(dwie pierwsze)

print_r( $_SERVER );

Wynik działania powyższego kodu na moim serwerze

Array
(
[PATH] => /usr/local/bin:/usr/bin:/bin
[UNIQUE_ID] => SggzBldi3pgAAHLJkHsAAAA0
[REAL_HOST] => 193.239.80.21
[HTTP_HOST] => engineer.ovh.org
[HTTP_USER_AGENT] => Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10
[HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
[HTTP_ACCEPT_LANGUAGE] => pl,en-us;q=0.7,en;q=0.3
[HTTP_ACCEPT_ENCODING] => gzip,deflate
[HTTP_ACCEPT_CHARSET] => ISO-8859-2,utf-8;q=0.7,*;q=0.7
[HTTP_COOKIE] => SESS47f8c6f823598c9dba1c59fb62aeb1bb=f71f56b5e2896bb7eec0132c8f3457ef
[HTTP_CACHE_CONTROL] => max-age=0
[HTTP_MAX_FORWARDS] => 10
[HTTP_VIA] => 1.1 127.0.0.1
[HTTP_X_FORWARDED_FOR] => 193.239.80.21
[HTTP_X_FORWARDED_HOST] => engineer.ovh.org
[HTTP_X_FORWARDED_SERVER] => 127.0.0.1
[SERVER_SIGNATURE] =>
[SERVER_SOFTWARE] => Apache
[SERVER_NAME] => engineer.ovh.org
[SERVER_ADDR] => 87.98.222.152
[SERVER_PORT] => 80
[REMOTE_ADDR] => 193.239.80.21
[DOCUMENT_ROOT] => /home/e/n/g/engineer/www
[SERVER_ADMIN] => postmaster@engineer.ovh.org
[SCRIPT_FILENAME] => /home/e/n/g/engineer/www/index.php
[REMOTE_PORT] => 55217
[GATEWAY_INTERFACE] => CGI/1.1
[SERVER_PROTOCOL] => HTTP/1.1
[REQUEST_METHOD] => GET
[QUERY_STRING] =>
[REQUEST_URI] => /
[SCRIPT_NAME] => /index.php
[UID] => 105826
[PHP_SELF] => /index.php
[REQUEST_TIME] => 1242051334
[argv] => Array
(
[0] => index.php
)

[argc] => 1
)
wNogachSpisz
"Widoczność" zmiennych globalnych $_SERVER['HTTP_*']
zalezy w prostej linii od ich wystepowania w naglowku HTTP


Moim zdaniem najlepiej weryfikowac proxy na podstawie czasu dostepu, wrzuc do sieci plik txt i sprawdzaj laczac sie z nim jak szybko proxy go otworzy, oto masz wynik weryfikacji proxy, nie wiem po co chcesz patrzec w jakies naglowki.



Aha i poka koda.
kaczors
Czy możesz rozwinąć swoją wypowiedź odnośnie tego nagłówka http?
Jak to możliwe że na jednej stronie są inne zmienne niż na drugiej skoro wchodzę z tego samego hosta?

Analiza nagłówków potrzebna mi jest do rozróżnienia typów proxy, czy to jest zwykłe cache, czy też anonymuos itp.

Jak się ma czas dostępu do plików? Przez proxy jest znacznie dłuższy(krótszy)? Moim zdaniem proxy może działać tak, że jak już zbuforuje plik to drugie wejście może mieć inny czas dostępu. ?

Koda jeszcze nie mam w zasadzie, na razie testuję nagłówki,zmienne i szukam sposobu na weryfikacje proxy.
wNogachSpisz
Mogę Cię nakierować, ściagnij fajny sniffer http://www.nirsoft.net/utils/smsniff.zip,rzuć okiem jak wyglądają nagłowki rozgrywając dwa scenariusze:
 - twoj skrypt laczy sie z serwerem proxy
 - twoj skrypt jest serwerem i laczysz sie z nim przez przegladarke
Zobacz jak wyglada tablica $_SERVER['HTTP_*'] w obu przypadkach.

Nie powinno mieć znaczenia ze polaczenie będzie w ramach localhosta, sprawdź.

Buforowanie o którym mówisz to nic innego jak cache, opisany w wielu dokumentacjach rówież w języku polskim tongue.gif
cachowanie występuje w różnych wersjach, takich co łączą się przy każdym wywołaniu z serwerem zeby sprawdzic czy cos sie zminilo
oraz takie które tego nie robily opierając się czasie życia cachu,
wszystko zalezy wlasnie od naglowka HTTP.

Gdybym to ja robił skrypt określający szybkość serwera proxy, nie zerkałbym w superglobalne $_SERVER.
Zamiast tego lepiej połączyć się z docelowym proxy
i ręcznie stworzyć nagłowek HTTP a następnie sparsować odpowiedź serwera proxy ;p
( /* Pod uwage w ostatecznym wyniku wiąć długość nagłowka HTTP */ )
sprawdzić jak proxy zadziała przy różnych scenariuszach, z cachem, bez cachu, z duzym plikem, z malym plikiem.
Dokumentacje HTTP masz chociażby na wikipedii, to na prawde nie jest trudne ;p
Jeśli masz problem z napisaniem skryptu który odpowiednie sparsuje nagłowek HTTP, zapraszam na gielde smile.gif, (to doslownie 2 wyrażenie ragularne na krzyż)
Chętnie skrobne coś takiego w ramach rozrywki za równowartość 1 piwa marki Lech Premium smile.gif
 
Mam nadzieje że wraziłem się nie bardzo nie jasno.


Pytaj dalej tongue.gif
kaczors
Wszystko ładnie pięknie, ale niezupełnie o takie działanie skryptu mi chodzi.
Moim celem jest napisanie czegoś co rozpozna czy ktoś kto się łączy z naszą stroną używa proxy bądź nie, a jeżeli używa to w jakiego jest ono rodzaju.
Twoje rozwiązanie służy do testowania konkretnego proxy, możliwe że nie wyraziłem się jasno , ale nie o takie działanie mi chodzi.

Dlatego więc męczę te zmienne serwera ;] I dalej nie wiem jak pozyskać hosta jego typ połączenia smile.gif

Myślę, że ze sparsowaniem nagłówka bym sobie poradził, więc giełda nie jest dla mnie rozwiązaniem, tam się niczego nie nauczę tongue.gif

Wróćmy do problemów

W pierwszym poście wylistowałem wartości zmiennych $SERVER i tak np mamy:
HTTP_X_FORWARDED FOR: 193.239.80.21 (czyli moje ip)

a po wejściu na inną przykładową stronę sprawdzającą te zmienne jest (http://www.thisisarecording.com/proxy_check/):
HTTP_X_FORWARDED FOR: (none)

Skąd ta różnica, przecież te zmienne zależą od hosta i powinny być w obu przypadkach te same!?

Generalnie mam zamiar zbadać nagłówki (co jest naiwne) + zbadać typ połączenia + baza whois (zauważyłem że dla proxy nie podaje większości informacji tylko nazwa hosta). Powiązując to wszystko ze sobą mam nadzieję że z dosyć wysokim prawdopodobieństwem odgadnę czy ktoś się łączy przez proxy czy nie.
wNogachSpisz
No właśnie, ty o pierniku a ja...

Sprawdzanie czy user korzysta z proxy, teraz mamy jasność :P

Połącznie wygląda tak:
przeglądarka usera -> serwer proxy -> Twój skrypt

Nagłowki http wysyła do Twojego skryptu wyłącznie serwer proxy.
Może on oszukiwać na przerozmaite sposoby łącznie z emitowaniem nagłówków identycznych jak te odebrane od przeglądarki usera, więc pewna część użytkowników przejdzie bez problemu przez takie zabezpieczenie przechodzić.
Jeśli jednak nie chcesz łączyć się z zwenętrznymi serwerami w celu weryfikacji, to jest to jedyne sensowne rozwiązanie.


Jak ja bym to zrobił:

1. Skan IP w poszukiwaniu otwartego proxy
Minusem tego rozwiązania jest czas skanowania (nawet kilka minut), należy wobec tego przy pierwszy odwiedzinach wpuścić usera, w tle rozpocząć skanowanie IP i jeśli okaże się że to proxy, zablokować kolejne wywołania strony przez takiego użytkownika. To chyba najlepsze rozwiązanie 99,9% skuteczności.


2. Google
Jeśli pod wybrabym IP jest publiczne proxy, google wyplują slowo "proxy" w 3000 ekzemplarzach, ale może też zdarzyć się ze wypluje slow proxy jeśli tam proxy wcale nie ma i tym sposobem zablokujesz normalnego usera.

3. Whois:
Nie wiem gdzie we whois jest napisane że to proxy, jeśli już to nie za często, 3% skutecznosci :P


4. Jeszcze raz nagłowki
Jeśli uda Ci się zbudować skrypt rozpoznający nagłówki wysyłane przez 99% współczesnych przeglądarek internetowych (różne wersje), to takie rozwiązanie też będzie OK, 90% skuteczności.

Wszystko zależy od tego, jakie masz wymagania wobec skryptu, metod jak widzisz jest conajmniej kilka.

Coś do rozpoznawania przeglądraki od CodeIgnitera:

  1. <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
  2. /*
  3. | -------------------------------------------------------------------
  4. | USER AGENT TYPES
  5. | -------------------------------------------------------------------
  6. | This file contains four arrays of user agent data.  It is used by the
  7. | User Agent Class to help identify browser, platform, robot, and
  8. | mobile device data.  The array keys are used to identify the device
  9. | and the array values are used to set the actual name of the item.
  10. |
  11. */
  12.  
  13. $platforms = array (
  14.                  'windows nt 6.0'    => 'Windows Longhorn',
  15.                  'windows nt 5.2'    => 'Windows 2003',
  16.                  'windows nt 5.0'    => 'Windows 2000',
  17.                  'windows nt 5.1'    => 'Windows XP',
  18.                  'windows nt 4.0'    => 'Windows NT 4.0',
  19.                  'winnt4.0'            => 'Windows NT 4.0',
  20.                  'winnt 4.0'            => 'Windows NT',
  21.                  'winnt'                => 'Windows NT',
  22.                  'windows 98'        => 'Windows 98',
  23.                  'win98'                => 'Windows 98',
  24.                  'windows 95'        => 'Windows 95',
  25.                  'win95'                => 'Windows 95',
  26.                  'windows'            => 'Unknown Windows OS',
  27.                  'os x'                => 'Mac OS X',
  28.                  'ppc mac'            => 'Power PC Mac',
  29.                  'freebsd'            => 'FreeBSD',
  30.                  'ppc'                => 'Macintosh',
  31.                  'linux'                => 'Linux',
  32.                  'debian'            => 'Debian',
  33.                  'sunos'                => 'Sun Solaris',
  34.                  'beos'                => 'BeOS',
  35.                  'apachebench'        => 'ApacheBench',
  36.                  'aix'                => 'AIX',
  37.                  'irix'                => 'Irix',
  38.                  'osf'                => 'DEC OSF',
  39.                  'hp-ux'                => 'HP-UX',
  40.                  'netbsd'            => 'NetBSD',
  41.                  'bsdi'                => 'BSDi',
  42.                  'openbsd'            => 'OpenBSD',
  43.                  'gnu'                => 'GNU/Linux',
  44.                  'unix'                => 'Unknown Unix OS'
  45.              );
  46.  
  47.  
  48. // The order of this array should NOT be changed. Many browsers return
  49. // multiple browser types so we want to identify the sub-type first.
  50. $browsers = array(
  51.                  'Opera'                => 'Opera',
  52.                  'MSIE'                => 'Internet Explorer',
  53.                  'Internet Explorer'    => 'Internet Explorer',
  54.                  'Shiira'            => 'Shiira',
  55.                  'Firefox'            => 'Firefox',
  56.                  'Chimera'            => 'Chimera',
  57.                  'Phoenix'            => 'Phoenix',
  58.                  'Firebird'            => 'Firebird',
  59.                  'Camino'            => 'Camino',
  60.                  'Netscape'            => 'Netscape',
  61.                  'OmniWeb'            => 'OmniWeb',
  62.                  'Mozilla'            => 'Mozilla',
  63.                  'Safari'            => 'Safari',
  64.                  'Konqueror'            => 'Konqueror',
  65.                  'icab'                => 'iCab',
  66.                  'Lynx'                => 'Lynx',
  67.                  'Links'                => 'Links',
  68.                  'hotjava'            => 'HotJava',
  69.                  'amaya'                => 'Amaya',
  70.                  'IBrowse'            => 'IBrowse'
  71.              );
  72.  
  73. $mobiles = array(
  74.                  // legacy array, old values commented out
  75.                  'mobileexplorer'    => 'Mobile Explorer',
  76. //                    'openwave'            => 'Open Wave',
  77. //                    'opera mini'        => 'Opera Mini',
  78. //                    'operamini'            => 'Opera Mini',
  79. //                    'elaine'            => 'Palm',
  80.                  'palmsource'        => 'Palm',
  81. //                    'digital paths'        => 'Palm',
  82. //                    'avantgo'            => 'Avantgo',
  83. //                    'xiino'                => 'Xiino',
  84.                  'palmscape'            => 'Palmscape',
  85. //                    'nokia'                => 'Nokia',
  86. //                    'ericsson'            => 'Ericsson',
  87. //                    'blackberry'        => 'BlackBerry',
  88. //                    'motorola'            => 'Motorola'
  89.  
  90.                  // Phones and Manufacturers
  91.                  'motorola'            => "Motorola",
  92.                  'nokia'                => "Nokia",
  93.                  'palm'                => "Palm",
  94.                  'iphone'            => "Apple iPhone",
  95.                  'ipod'                => "Apple iPod Touch",
  96.                  'sony'                => "Sony Ericsson",
  97.                  'ericsson'            => "Sony Ericsson",
  98.                  'blackberry'        => "BlackBerry",
  99.                  'cocoon'            => "O2 Cocoon",
  100.                  'blazer'            => "Treo",
  101.                  'lg'                => "LG",
  102.                  'amoi'                => "Amoi",
  103.                  'xda'                => "XDA",
  104.                  'mda'                => "MDA",
  105.                  'vario'                => "Vario",
  106.                  'htc'                => "HTC",
  107.                  'samsung'            => "Samsung",
  108.                  'sharp'                => "Sharp",
  109.                  'sie-'                => "Siemens",
  110.                  'alcatel'            => "Alcatel",
  111.                  'benq'                => "BenQ",
  112.                  'ipaq'                => "HP iPaq",
  113.                  'mot-'                => "Motorola",
  114.                  'playstation portable'     => "PlayStation Portable",
  115.                  'hiptop'            => "Danger Hiptop",
  116.                  'nec-'                => "NEC",
  117.                  'panasonic'            => "Panasonic",
  118.                  'philips'            => "Philips",
  119.                  'sagem'                => "Sagem",
  120.                  'sanyo'                => "Sanyo",
  121.                  'spv'                => "SPV",
  122.                  'zte'                => "ZTE",
  123.                  'sendo'                => "Sendo",
  124.  
  125.                  // Operating Systems
  126.                  'symbian'                => "Symbian",
  127.                  'SymbianOS'                => "SymbianOS", 
  128.                  'elaine'                => "Palm",
  129.                  'palm'                    => "Palm",
  130.                  'series60'                => "Symbian S60",
  131.                  'windows ce'            => "Windows CE",
  132.  
  133.                  // Browsers
  134.                  'obigo'                    => "Obigo",
  135.                  'netfront'                => "Netfront Browser",
  136.                  'openwave'                => "Openwave Browser",
  137.                  'mobilexplorer'            => "Mobile Explorer",
  138.                  'operamini'                => "Opera Mini",
  139.                  'opera mini'            => "Opera Mini",
  140.  
  141.                  // Other
  142.                  'digital paths'            => "Digital Paths",
  143.                  'avantgo'                => "AvantGo",
  144.                  'xiino'                    => "Xiino",
  145.                  'novarra'                => "Novarra Transcoder",
  146.                  'vodafone'                => "Vodafone",
  147.                  'docomo'                => "NTT DoCoMo",
  148.                  'o2'                    => "O2",
  149.  
  150.                  // Fallback
  151.                  'mobile'                => "Generic Mobile",
  152.                  'wireless'                 => "Generic Mobile",
  153.                  'j2me'                    => "Generic Mobile",
  154.                  'midp'                    => "Generic Mobile",
  155.                  'cldc'                    => "Generic Mobile",
  156.                  'up.link'                => "Generic Mobile",
  157.                  'up.browser'            => "Generic Mobile",
  158.                  'smartphone'            => "Generic Mobile",
  159.                  'cellphone'                => "Generic Mobile"
  160.              );
  161.  
  162. // There are hundreds of bots but these are the most common.
  163. $robots = array(
  164.                  'googlebot'            => 'Googlebot',
  165.                  'msnbot'            => 'MSNBot',
  166.                  'slurp'                => 'Inktomi Slurp',
  167.                  'yahoo'                => 'Yahoo',
  168.                  'askjeeves'            => 'AskJeeves',
  169.                  'fastcrawler'        => 'FastCrawler',
  170.                  'infoseek'            => 'InfoSeek Robot 1.0',
  171.                  'lycos'                => 'Lycos'
  172.              );
  173.  
  174. /* End of file user_agents.php */
  175. /* Location: ./system/application/config/user_agents.php */
  176. ?>
kaczors
Propozycja 1.
Strona ma działać raczej od razu jednorazowo sprawdzając proxy, więc skanowanie nie wchodzi w grę, zdecydowanie za długo by trwało.

Propozycja 2.
Nie do końca tak jest, np 66.197.167.120 (pewne Anonymous Proxy Online z googla) ma tylko 150 wyników ,więc nijak ma się liczba wyników od adresu IP proxy

Propozycja 3.

Zauważyłem (możesz to sam sprawdzić), że jak wpiszesz np swoje IP do whois (jeżeli nie jesteś za proxy) to dostaniesz wszystkie info od ISP, a jak wpiszesz IP proxy to wyskoczy tylko nazwa hosta. No ale właśnie patrzę, że także i to nie jest żadną regułą.

Propozycja 4.
Tu chciałbym się skupić. Za pewną stroną wnioskuję, że:
Analiza nagłówków VIA, PROXY_CONNECTION i X_FOWARDED_FOR pozwala nam wykryć transparent proxy, ponieważ te proxy nie ukrywa adresów IP. Dalej sprawa jest bardziej skomplikowana, jeżeli w nagłówkach nasze IP się powtarza lub go nie ma to możemy mieć do czynienia z anonymous lub elite proxy, ale też doskonale może tam go nie być. Znalazłem także popularne porty dla proxy (8080,80,6588,8000,3128,553,554) lecz widzę że to nie jest regułą i nie można na tym oprzeć weryfikacji, kolejną wskazówką jest connection type oraz cache control. No ale jak już pisałem mam problemy z tymi cholernymi nagłówkami.

No i tu koło się zamyka, ponieważ mam problemy z tymi zmiennymi. Powtarzam moje pytanie: dlaczego jak wylistowuję moje zmienne $SERVER na moim serwerze (moja strona) to mam niekiedy inne wyniki niż np na (tym) weryfikatorze proxy? Np. Proxy HTTP_VIA , nie wspominając o tym, że np typu połączenia wogóle nie mam u siebie blinksmiley.gif .

?


// BTW: Dzięki za zainteresowanie tematem //
wNogachSpisz
propozycja 1.
Jeśli zeksanujesz tylko popularne porty na jakich działają http proxy ( sam napisałeś (8080,80,6588,8000,3128,553,554) ), to będzie to trwało raptem kilka sekund.

propozycja 2.
Nie do końca się zrozumieliśmy, google na zapytanie: http://www.google.pl/search?&q=66.197.167.120 zwaraca wyniki z 7-krotnym powtórzeniem słowa "proxy", uznajemy na tej podstawie że to proxy, jeśli powiedzmy są 2 powtórzenia i mniej, uznajemy że to nie proxy, niestety google po kilku tysiącach takich zapytań wrzuci bana na IP Twojego serwera.

propozycja 3.
We wpisach whois nie będziesz miał informacji że pod tym IP jest proxy.



Odp na pytanie:
Różne proxy to różne nagłowki, dlatego.
kaczors
No ale przecież ja nie wchodzę tam przez proxy, po prostu odpalam moją stronę i stronę tego weryfikatora w tej samej przeglądarce, korzystając z tego samego połączenia, czy zmienne środowiskowe nie powinny być takie same?
wNogachSpisz
To czym się różni jedno wejście od drugiego?
kaczors
Szanowny kolego, doceniam Twoje starania, ale mam wrażenie że nie możemy się dogadać. Nie wiem, może to wynika z mojej niewiedzy (w końcu to dział "przedszkole"). Może zróbmy taki eksperyment. Tu jest kawałek kodu:

  1. <?php
  2. echo 'HTTP_VIA: '. $_SERVER['HTTP_VIA'].'
  3. ';
  4.  echo 'HTTP_CONNECTION: '. $_SERVER['HTTP_CONNECTION'].'
  5. ';
  6.   ?>

Wyświetli nam zawartość zmiennych HTTP_VIA oraz HTTP_CONNECTION i teraz: umieszczamy to sobie na swoim serwerze. Wchodzimy naszą stronę i przed oczami ukazuję się mi odpowiednio: "1.1 127.0.0.1" oraz pusto. Po czym wchodzimy na stronę Free Proxy Detector i przed naszymi oczami pokazuję się nam odpowiednio taka wartość tych samych zmiennych: pusto oraz "keep-alive". Jak to możliwe że te zmienne są różne? Czy nagle dla innej strony zmienia się sposób łączenia? Połączenie jest takie same, wpisuje oba adresy w tym samym oknie przeglądarki. Te zmienne powinny zależeć od przeglądarki? Niech ktoś mi to wytłumaczy ostatecznie?

================================================================================
==========

Dobra, chyba to rozwiązuje sprawę różnicy zmiennych:

"$_SERVER
Contains information about your server. Because
your Web server provides the information, the
information that’s available depends on what
server you’re using."

Może ktoś ma jeszcze jakieś sposoby weryfikacji proxy, choć podejrzewam że większość została tu już napisana....

Pozdrawiam
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.