portal Michała Hanćkowiaka
Begin main content
Search · Index
No registered users in community Materiały
in last 10 minutes

SIK - Temat D - Protokół HTTP i inne

Protokół http może być używany do przesyłania komunikatów ogólnego przeznaczenia
(niekoniecznie chodzi o komunikację przeglądarka <-> serwer www !)
tzw "API RESTowe" to jest własnie czysty http + JSON/XML/YAML do repr. danych...
także "WebServisy/SOAP" używają prot http do transportu żadań/odp. SOAP...

Przykład klienta http w Tcl i w Javie: http01.txt;
dokumentacja pakietu http j. Tcl, pakietu java.net j. Java.
materiały o j.Tcl z których można pobrać interpy Tcl-a...

Serwer tclhttpd tclhttpd.tar.gz oraz wymagana przezeń bibl. tcllib tcllib.tar.gz;
włączanie tclhttpd z konsoli i def. proc obsługi url-i (tzw. direkturl-i): http02.txt
Uwaga 1: "tclkit_2" ma wbudowaną bibl. tcllib, dlatego jedyne czego potrzebujemy to sam tclhttpd...
Uwaga 2: tclhttpd wymaga tcl-a 8.4 co tym bardziej sugeruje użycie tclkit_2;
28.10.2021 obecnie tclkit_2 nie może otworzyć okna!!, obejście: patrz folder !!!

Zadanie D.1 "obsługa http w j. Tcl" (1.5pkt)
Zbuduj przykład pokazujący obsługę prot. http od strony klienta (pakiet http) jak i serwera (serwer tclhttpd).
Przykład powinien zawierać wysyłanie żądań http z parametrami (np. do usługi "sumaliczb")
zarówno metodą GET jak i POST (opcja -query).
Użyj szpiega gniazdkowego sockspy.tcl w celu zobaczenia komunikatów http (z met. GET i POST).
Klienta i serwer uruchom w osobnych konsolach!
Inne przykłady uruchamiania tclhttpd...

Zadanie D.2 "obsługa http w innych językach"
Proszę podać przykład w innym j. prog. (nie Tcl i nie Java) jak programuje się klientów http ...
(trochę mało czytelny przykład jak używać http spod .NET, docs klasy HttpWebRequest)

Zadanie D.3 "http nieskopoziomowo"
Spróbuj napisać klienta http przy pomocy "czystych" gniazdek strumieniowych (tcp);
język prgramowania dowolny;
przetestuj swój kod z serwerem www, np. z tclhttpd lub innym
opis prot. http: patrz np. slajdy wykł02, str 5 w pdf.

.....................................................

Usługa DNS...
Usługa DNS zajmuje się głównie zamianą nazw domenowych, np. wp.pl, na adresy IP, np. 212.77.98.9
można także zdobywać inne informacje o hostach/domenach...
Serwer DNS utrzymuje tablice rekordów (nazwa_domenowa, wartość, typ, ?),
gdzie "typ" to A (adres ip), NS (autorytatywny serwer domeny), MX (serwer pocztowy domeny), ...
Można zarządać rekordów określonego typu dla danej nazwy domenowej.
Jak się znajduje serwer DNS zawierający info o danej nazwie domenowej ?
hierarchiczne poszukiwanie, począwszy od domeny najwyższego poziomu...

Zadanie D.4 "usługa DNS"
Zbadaj jakie jeszcze informacje można "wyciągać" z DNS używając tcl-owego pakietu dns...
wikipedia o DNS, pakiet dns j. Tcl (tcllib), rfc1035.txt (poszukaj rozdz. 3.2.2), rozdział w NAG2
pakiet dns zezwala na używanie uri postaci: "dns:nazwa_domenowa;type=YYY"
co można podać jako YYY wyczytasz z rfc1035, rozdz. 3.2.2 ...
spróbuj np. wyszukać "serwery autorytatywne DNS" dla różnych domen (type=NS)

## przykład użycia pakietu dns:
#load ./tcludp.so udp; package re udp
  # + to jest konieczne, jeśli nasz ser. dns NIE używa prot TCP !
  #   (zip z pakietem udp j.Tcl jest w tym folderze)
lappend auto_path sciezka_do_tcllib; package re dns
  # + pakiet dns jest częścią zbioru tcllib;
  #   ew. można użyć "dużego" interpa tclkit_2, patrz materiały o j.Tcl
set n1 [dns::resolve wp.pl]
  #% ::dns::1
  # + wysyłamy zapytanie dns...
  # + jako argument resolve można też użyć "dns:nazwa_domenowa;type=YYY"
dns::address $n1
  #% 212.77.98.9 212.77.100.101
  # + kolejnosc sie zmienia!! load balancing!!!
join [dns::result $n1] \n
  #% name wp.pl type A class IN ttl 268 rdlength 4 rdata 212.77.98.9
name wp.pl type A class IN ttl 268 rdlength 4 rdata 212.77.100.101
  # + wszystkie odpowiedzi na zapytanie dns...
dns::cleanup $n1

.....................................................

Sieć TOR...
Sieć TOR służy do tzw "anonimizacji", czyli do ukrywania adresu IP klienta przed serwerem.
Działa to tak, że nie nawiązuje sie bezpośredniego połączenia klient-serwer,
tylko wiele pośrednich połączeń, pośrednie węzły to "węzły proxy"...
Aby połączyć się z siecią TOR należy włączyć lokalny węzeł sieci tor (program "tor");
program ten może być używany przez nasze programy (np. przegladarkę) jako "SOCKS proxy";
SOCKS to protokół przy pomocy którego nasz program komunikuje sie z lokalnym węzłem tor;
(SOCKS jest ogólnym prot. związanym z techniką proxy, niekoniecznie chodzi o tor !)
Materiały o TOR: https://www.torproject.org/, docs, tor wikipedia, tor control prot, tor design
SOCKS prot spec: wikipedia, rfc1928.txt
Klinent TOR dla linux-a 32bit jest w pliku tor_bin.zip w tym folderze;
koniecznie trzeba wykonac "export LD_LIBRARY_PATH=katalog_tor_bin" !!!

Zadanie D.5 "TOR - inna tożsamość"
Proszę przygotować eksperyment dowodzący, że serwer http istotnie nie widzi adresu IP klienta,
jeśli klient używa sieci tor...
Wskazówka: trzeba włączyć klienta tor, skonfigurowac przeglądarkę aby używała "socks proxy"
oraz otworzyć stonę www pokazującą adresy ip klientów... (np. /moj_adres);
do sprawozdania: zawartość strony moj_adres + opis jak skonfig. przeglądarkę

Zadanie D.6 "TOR - klient gniazdkowy w j. Tcl" (?)
Proszę przygotować eksperyment, w którym gniadkowy klient w j. Tcl
komunikuje się z gniadkowym serwerem w j. Tcl,
za pośrednictwem sieci TOR...
Załącz dane o gniazdku/połączeniu tcp pokazywane przez polecenie "fconfigure socket"
dla gnadka klienta oraz dla aktywnego gniadka serwera.
Można także użyć innego j. programowania, ale trzeba znaleźć impl. prot SOCKS !
Uwaga 1: serwer musi posiadać publiczny adres IP, zapora serwera musi mieć otwarty port;
Uwaga 2, 13.11.2019: to zadanie można nieco zmodyfikować:
podłączyć się niskopoziomowo, przez tor_socket, do /moj_adres

Poniżej mamy procedurę, która implementuje prot SOCKS v.4 ...

# skopiowane z http://wiki.tcl.tk/17263
# opis prot SOCKS v.4
proc socks4connect {proxy_host proxy_port host port {username {}}} {
  set connect_request \x04\x01
  append connect_request [binary format S $port]
  if {[regexp {[0-9]+.[0-9]+.[0-9]+.[0-9]+} $host]} {
    set use_host false
    append connect_request [binary format c4 [split $host .]]
  } else {
    # ip address 0.0.0.x is always invalid and signals that a hostname is specified
    set use_host true
    append connect_request [binary format c4 [split 0.0.0.1 .]]
  }
  append connect_request $username
  append connect_request \x00
  if {$use_host} {
    append connect_request $host
    append connect_request \x00
  }
  set s [socket $proxy_host $proxy_port]
  fconfigure $s -translation binary -encoding binary
  puts -nonewline $s $connect_request; flush $s
  set response [read $s 8]
  set rr [string index $response 1]
  if {$rr ne "\x5a"} {
    error "connection request rejected by proxy ($rr)"
  } else {
    return $s
  }
}

# ta proc jest komatybilna z poleceniem socket j. Tcl !!
# + węzeł tor standardowo używa nr portu 9050
proc tor_socket {host port} {
  socks4connect localhost 9050 $host $port
}

.....................................................

Zadanie D.7 "klient SSH jako SOCKS proxy"
okazuje się, że klient SSH może działać jako "socks proxy"...
patrz opcja "-D port" w manualu polecenia ssh;
końcowe poł. tcp tworzy serwer SSH;
czyli jest to jakby "tunel SSH", ale nie ma ograniczenia do pojedynczego nr portu
(jak w przypadku użycia opcji -L port_lokalny:serwer:port);
wypróbuj jak to działa przy pomocy przeglądarki i strony www, która pokazuje adr IP klienta.
Zastanów się, jakie ważne zastosowania może mieć omawiany mechanizm...
(odpowiedź na to pytanie JEST częścią tego zadania!)

.....................................................

LDAP czyli "usługa katalogowa"
usługa katalogowa czyli opis zasobów w sieci...
zasoby: użytkownicy, grupy użytkowników, komputery, zakłady, departamenty, drukarki, ...
drzewo obiektów/folderów, ścieżka od korzenia do wierzchołka (obiektu lub folderu)
ścieżka jest postaci "attr1=value1, attr2=value2, ..."
obiekty także mają atrybuty (np. user ma atrybut mail, description, displayName, ...)
...
można zadawać "zapytania o obiekty" z warunkiem ...; przykłady:
ldap::search $h "DC=labs,DC=wmi,DC=amu,DC=edu,DC=pl" "(CN=m*)" ""
ldap::search $h "OU=Students,OU=People,DC=labs,DC=wmi,DC=amu,DC=edu,DC=pl " "(CN=s40*)" ""
to są pytania o obiekty z podanego folderu, ktore maja zadany atrybut CN (common name)
...
można także uwierzytelnić użytkownika (ldap::bind ale lepiej w wersji ssl, ldap::secure_connect !)
jest to sposób na wpuszczanie użytk. do danego programu na podst. ldap-a wmi...
(uwaga, 11.2019, w ldap.tcl pkg ldap trzeba wyłączyć prot ssl3, "-ssl3 0")
...
dokumentacja: X.500, rfc2251, rfc4510, pakiet ldap j. Tcl (w tcllib)
http://www.openldap.org/doc/admin24/intro.html
...
Uwaga: dostęp do ldap-a WMI jest możliwy tylko z sieci WMI!!!
(ale można tunelować przez SSH:
ssh -L 5000:ldap.wmi.amu.edu.pl:389 ???@???.wmi.amu.edu.pl
i potem z poziomu tcl-a: "set h [ldap::connect localhost 5000]"
)

Zadanie D.8 "LDAP - wyciąganie informacji"
Spróbuj wyciągnąć z ldap-a różne informacje o WMI,
np. listę zakładów i listę pracowników zakładu:
CN=Zaklad_Teorii_Algorytmow_i_Bezpieczenstwa_Danych
Wskazówka do j. Tcl:
komenda ldap::search zwraca listę (zagnieżdżonych) słowników;
elem. listy wyciągamy komendą lindex, np. "lindex {qq ww ee} 1" zwróci "ww"
na słownikach operujemy komendą dict (w tcl8.4 wymaga "package re dict");
np. "dict get {q 111 w 222 e 333} q" zwróci "111"
........
patrz też przykład ldap_sik.tcl w folderze

uwaga: portal używa ciasteczek tylko do obsługi tzw. sesji...