![]() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| C/C++ / CGI / Sieć Novell / PHP / Java / SQL / Oracle / WebSphere MQ / WebSphere Message Broker / JavaScript / Humor / IT Quiz | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
|
![]() |
Informacje podstawowe Bezpieczeństwo : CGI - Co to jest ? Dane wejściowe Dynamiczna grafika Kodowanie CGI Komunikacja klient/serwer Konfiguracja CGI Konfiguracja SSI Metoda GET Metoda POST Nagłówki Polecenia SSI Przykładowe skrypty Status HTTP Typy MIME (część) Zmienne CGI Literatura Jeden plik Legenda w przygotowaniu * w trakcie tworzenia Język C/C++ W dużym skrócie skrypty CGI są to specjalne programy uruchamiające sie na serwerze , a których wywołąnie umieszcza się na stronach WWW jako zwykły odsyłacz lub wyjście formularza.Przykładem może tu być "Książka gość", np. ta, która się znajduje na tej stronie, gdzie po kliknięciu na odpowiedni odsyłacz uruchomiony zostaje skrypt CGI, który na standardowe wyjście wysyła kod HTML strony. Drugim przykładem może tu być typowa bramka pocztowa. Klient wypełnia dokładnie formularz, następnie po wysłaniu wypełnionego formularza na serwer odpowiedni skrypt CGI przetwarza wprowadzone dane i wg nich wysyła maila pod wskazany adres. Pierwszym problemem z jakim się spotyka początkowy programista skryptów CGI, jest odczyt parametrów wywołania skryptu. Wszystkie dane do serwera są wysyłane za pomocą dwóch metod : GET POST Pierwsza z nich dołącza dane bezpośrednio do adresu URL skryptu, druga wysyła dane na bezpośrednie wyjście. Warto tu zauważyć, że dane te przed wysłaniem są specjalnie kodowane. Przy metodzie GET : Najprostszy sposób to zachowanie w odpowiednim łańcuchu tekstowym zmiennej środowiskowej QUERY_STRING. //łańcuch zawierający zmienną środowiskową QUERY_STRING #define QUERY_STRING getenv("QUERY_STRING") void main() { ... printf("%s\n",QUERY_STRING); ... } Przy metodzie POST : Należy sprawdzić zmienną środowiskową CONTENT_LENGTH. Jeśli będziemy mieli do czynienia z metodą POST zmienna ta będzie zawierała długość danych wejściowych, w przeciwnym przypadku wartość NULL //łańcuch zawierający zmienną środowiskową CONTENT_LENGTH #define CONTENT_LENGTH getenv("CONTENT_LENGTH") void main() { char *data unsigned int content_length_int ... //jeśli to metoda POST if ( CONTENT_LENGTH != NULL ) { //do zmiennej content_length_int zapisz wartość zmiennej środowiskowowej CONTENT_LENGTH content_length_int = atoi ( CONTENT_LENGTH ); //zarezerwuj pamięć dla danych wejściowych data = ( char * ) malloc (sizeof ( char ) * content_length_int + 1 ); //czytaj ze standardowego wejścia if ( fread ( data , sizeof ( char ) , content_length_int , stdin ) != content_length_int) printf("Błąd podczas czytania ze standardowego wejścia\n"); } //zakończ łańcuch znakiem '\0' data [ content_length_int ] = '\0'; ... //zwolnij pamięć free ( data ) } Wszystkie dane wysyłane do skryptu CGI są specjalnie kodowane. Kodowanie to wygląda następująco Dane podzielone są na grupy tj. nazwa pola i jego wartość. Poszczególne grupy oddzielone są znakiem '&', a nazwę pola i jego wartość rozdziela znak '='. Wszystkie spacje zastąpione są znakiem '+', a znaki niestandardowe znakiem '%' oraz dwucyfrowym kodem tego znaku. Poszczególne fazy odkodowania danych wejściowych dla skryptu przebiegają następująco Wyizolowanie interesującej grupy lub wszystkich par "nazwa=wartość"Rozdzielenie nazwy i wartości z grupyOdkodowanie wszystkich znaków niestandardowych, tj. zastąpienie znaku '%' oraz następującego po nim dwucyfrowego kodu znakiem o tym kodzie. Przykład Skrypt na wejściu otrzymuje dane w postaci : Imie=Marcin&Nazwisko=Kasi%F1ski Faza 1 : rozdzielenie poszczególnych par Faza 2 : rozbicie pary na jej nazwę i wartość Faza 3 : odkodowanie wszystkich znaków niestandardowych Faza 4 : zapisanie tak przygotowanych danych do odpowiedniej struktury Struktura ta może wyglądać następująco : struct cgi_input { //nazwa char *name; //wartość char *value; }; Deklaracja struktury (wersja statyczna) : cgi_input cgi_in[10] Deklaracja struktury (wersja dynamiczna) : ... cgi_input *cgi_in ... //zarezerwuj n bajtów dla danych wejściowych if ((cgi_in = (cgi_input *) malloc(n)) == NULL) { printf("Za mało pamięci\n"); exit(1); } ... //zwolnij pamięć free(cgi_in); ... Komunikacja pomiędzy klientem WWW ( np. przeglądarką ), a serwerem WWW odbywa się zapomocą protokołu HTTP. Transakcję pomiędzy klientem, a serwerem możemy podzielić naposzczególne etapy wg poniższego schematu: Utworzenie połączenia pomiędzy klientem a serwerem. Wysłanie żądania konkretnego zasobu przez klienta. Wysłanie odpowiedzi przez serwer do klienta. Zamknięcie połączenia pomiędzy klientem a serwerem. Utworzenie połączenia pomiędzy klientem a serwerem dokonuje się poprzez połączenie sięz konkretnym protokołem, w tym wypadku HTTP. Polega to na połączeniu się z programem serwera poprzez odpowiedni port (standardowo dla protokołu HTTP jest to port 80).Dla sprawdzenia możemy się tu posłużyć programem telnet, np: telnet gss.abis.lodz.pl 80 Klient aby móc otrzymać określony zasób od serwera musi do niego wysłać żądanie w określonymformacie zrozumiałym dla serwera. Ogólny format żądania ma postać: POLECENIE lokalizacja wersja protokołu Ewentualne nagłówki linia pusta Ewentualne dane przesyłane do serwera POLECENIE : Określa typ żądania, gdzie najważniejsze z nich to: GET HEAD POST lokalizacja : umiejscowienie żądanego zasobu na serwerze np. /info.htm wersja protokołu : np. HTTP/1.0 Ewentualne nagłówki : dodatkowe informacje dołączane do żądania w formacie Nagłówek: paramertr/y Ewentualne dane : najczęściej dane przesyłane do skryptu z formularza za pomocą metody POST. Przykładowe żądania Jest to metoda nie wymagająca żadnych dodatkowych danych, żąda ona pobrania z serwera określonego pliku, np.: GET /info.ktm HTTP/1.0 : żąda pobrania z serwera pliku /info.htm za pomocą protokołu HTTP w wersji 1.0. GET / HTTP/1.0 : żąda pobrania z serwera dokumentu głównego. GET /script.cgi?data1=12&data2=34 HTTP/1.0 : żąda pobrania z serwera wyniku uruchomienia skryptu /script.cgi, którego dane określiliśmy na : data1=12&data2=34. Taki sam wynik da nam w przeglądarce wypełnienie formularza z danymi jak wyżej i wysłanie go do skryptu za pomocą metody GET. Jest to metoda diagnostyczna. Pobiera ona z serwera tylko i wyłącznie informacje nagłówkowe bez pobrania samego dokumentu. Metoda ta jest stosowana najczęściej w programach sprawdzających poprawność odnośników hipertekstowych w dokumentach WWW. Przykład: HEAD /info.ktm HTTP/1.0 : żąda pobrania z serwera informacji o pliku /info.htm za pomocą protokołu HTTP w wersji 1.0. HEAD / HTTP/1.0 : żąda pobrania z serwera informacji o dokumencie głównym. Metoda POST jest stosowana przy żądaniach zasobu wyjścia skryptu CGI poprzez formularz WWW.W tej metodzie dodatkowe dane przesyłane do skryptu nie są dołączane do adresy URL, jak toma miejsce w metodzie GET, lecz przesyłane są za pomocą standardowego wyjścia.Należy tu zwrócić uwagę, iż przy metodzie POST konieczne jest występowanie nagłówkaContent-length: len, gdzie len jest długością bloku danych przesyłanych doskryptu. Wszystkie pozostałe nagłówki są opcjonalne i teoretycznie mogą nie występować. Przykład: POST /post/post.cgi HTTP/1.0 Content-length: 30 pusta linia FROM=11&TO=22&TITLE=33&Text=44 Lista najczęściej używanych nagłówków żądania: Accept : akceptowane typy MIME przez klienta. Accept-Encoding : akceptowane metody kompresji. Accept-Language : akceptowane język w postaci skrótu. Allow : uzgadnia metodę dostępu do dokumentu. Authorization : metoda kodowania oraz użytkownik i hasło. Content-Enciding : metoda kompresji danych. Content-Length : długość danych wysyłanych przez klienta za pomocą metody POST. Content-Type : typ przesyłanych danych. Extension-Header : definiuje dodatkowy nagłówek. From : adres e-mail klienta. Najczęściej adres twórcy etycznego robota skanującego serwer. If-Modified-Since : żądanie pobrania zasobu, który nie został zmieniony po dacie zgodnej z protokołem HTTP podanej jako parametr. MIME-version : wersja protokołu MIME. Pragma : specjalne dyrektywy dla serwera. Referer : adres URI, zawierający żądany odnośnik. User-Agent : nazwa klienta (przeglądarka, robot itp. ). Poniżej przedstawiam kilka przykładów żądań, a ich analizę pozostawiam innym w oparciu oinformacje umieszczone w tym kursie. Źądanie głównego dokumentu za pomocą metody GET GET / HTTP/1.0 Host: gss.abis.lodz.pl Accept: text/html, text/plain, application/applefile, application/x-metamail-patch, sun-deskset-message, mail-file, default, postscript-file, audio-file, x-sun-attachment, text/enriched, text/richtext, application/andrew-inset, x-be2 Accept: application/postscript, message/external-body, message/partial, application/pgp, application/pgp, video/mpeg, video/*, image/*, audio/mod, text/sgml, */*;q=0.01 Accept-Encoding: gzip, compress Accept-Language: en Negotiate: trans User-Agent: Lynx/2.8.1rel.2 libwww-FM/2.14 pusta linia Źądanie wyjścia skryptu CGI za pomocą metody POST POST /post/post.cgi HTTP/1.0 Host: gss.abis.lodz.pl Accept: text/html, text/plain, application/applefile, application/x-metamail-patch, sun-deskset-message, mail-file, default, postscript-file, audio-file, x-sun-attachment, text/enriched, text/richtext, application/andrew-inset, x-be2 Accept: application/postscript, message/external-body, message/partial, application/pgp, application/pgp, video/mpeg, video/*, image/*, audio/mod, text/sgml, */*;q=0.01 Accept-Encoding: gzip, compress Accept-Language: en Pragma: no-cache Cache-Control: no-cache User-Agent: Lynx/2.8.1rel.2 libwww-FM/2.14 Referer: http://gss.abis.lodz.pl/post/post.htm Content-type: application/x-www-form-urlencoded Content-length: 30 pusta linia FROM=11&TO=22&TITLE=33&Text=44 Źądanie wyjścia skryptu CGI za pomocą metody GET GET /cgi/script.cgi?data1=11&data2=22 HTTP/1.0 Host: gss.abis.lodz.pl Accept: text/html, text/plain, application/applefile, application/x-metamail-patch, sun-deskset-message, mail-file, default, postscript-file, audio-file, x-sun-attachment, text/enriched, text/richtext, application/andrew-inset, x-be2 Accept: application/postscript, message/external-body, message/partial, application/pgp, application/pgp, video/mpeg, video/*, image/*, audio/mod, text/sgml, */*;q=0.01 Accept-Encoding: gzip, compress Accept-Language: en Pragma: no-cache Cache-Control: no-cache User-Agent: Lynx/2.8.1rel.2 libwww-FM/2.14 Referer: http://gss.abis.lodz.pl/post/post.htm Content-type: application/x-www-form-urlencoded pusta linia Ogólny format odpowiedzi serwera na określone żądanie ma postać: wersja protokołu stan odpowiedzi komunikat Ewentualne nagłówki linia pusta Przesłany dokument wersja protokołu : np. HTTP/1.0 stan odpowiedzi : liczba określająca czy żądanie zakończyło się sukcesem, czy pojawiły się jakieś problemy komunikat : dowolny łańcuch tekstowy będący uzupełnieniem stanu odpowiedzi, np. Internal Server Error lub Internal Server Error Ewentualne nagłówki : dodatkowe informacje dołączane do odpowiedzi w formacie Nagłówek: paramertr/y Przykładowe odpowiedzi Lista najczęściej używanych nagłówków odpowiedzi: Allow : uzgadnia metodę dostępu do dokumentu. Content-Enciding : metoda kompresji danych. Content-Length : długość danych wysyłanych przez klienta za pomocą metody POST. Content-Type : typ przesyłanych danych. Date : data zgodna z protokołem HTTP. Expires : data ważności dokumentu, po której klient nie powinien dokument pobierać w postaci kopii, lecz bezpośrednio z serwera. Extension-Header : definiuje dodatkowy nagłówek. Last-Modified : data ostatniej modyfikacji dokumentu. Location : pełny adres dokumentu. Server : nazwa serwera i system na jakim on pracuje. WWW-Authenticate : odpowiedź na żądanie 401 informujące o potrzebie autoryzacji. Poniżej przedstawiam kilka przykładów odpowiedzi serwera. odpowiedź zakończona sukcesem HTTP/1.1 200 OK Date: Sun, 12 Dec 1999 12:42:27 GMT Server: Apache/1.3.6 (Unix) (Red Hat/Linux) Last-Modified: Wed, 07 Apr 1999 21:17:54 GMT ETag: "97a0-799-370bcb82" Accept-Ranges: bytes Content-Length: 1945 Connection: close Content-Type: text/html < HTML > < head > < title > Moja strona HTML < /title > < /head > < FRAMESET COLS="25%,*" > < FRAME NAME="left" SRC="left.htm" NORESIZE MARGINHEIGHT="2" MARGINWIDTH="2" > < FRAME NAME="right" SRC="right.htm" NORESIZE > < /FRAMESET > < /HTML > odpowiedź informująca o błędzie HTTP/1.1 500 Internal Server Error Date: Sun, 12 Dec 1999 12:43:57 GMT Server: Apache/1.3.6 (Unix) (Red Hat/Linux) Connection: close Content-Type: text/html < HTML > < head > < title > Błąd < /title > < /head > < BODY > < center > Nastąpił błąd pracy serwera. Skontaktuj się z Webmasterem!!! < /BODY > < /HTML > Dotyczy serwera Apache. Ustawienie katalogu, którego wszystkie pliki będą traktowane jako skrypty CGI. W tym celu w pliku konfiguracyjnym powinna znajdować się linia : ScriptAlias wirtualny_katalog rzeczywisty_katalog gdzie: wirtualny_katalog : Wirtualna nazwa katalogu, do której będziemy mogli się odnosić uruchamiając skrypty CGI. Najczęściej wartość ta przybiera postać /cgi-bin/ rzeczywisty_katalog : Nazwa rzeczywistego katalogu znajdującego się na serwerze, gdzie są składowane skrypty CGI. Przykład: ScriptAlias /cgi-bin/ /usr/local/etc/http/cgi/ Ustawienie rozszerzenia plików będących skryptami CGI, co spowoduję że serwer plik o podanym rozszerzeniu potraktuje jako skrypt CGI. W tym celu w pliku konfiguracyjnym powinna znajdować się linia, która tworzy odpowiedni typ MIME dla skryptów CGI: AddType application/x-httpd-cgi .cgi Następnie należy tak skonfigurować serwer, aby była możliwość uruchamiania skryptów CGI z dowolnego katalogu. Option Indexes FollowSymLinks ExecCGI Dotyczy serwera Apache. Ustawienie rozszerzenia plików zawierających polecenia SSI. Serwer przed wyprowadzeniem do przeglądarki plików o podanym rozszerzeniu wstępnie przeszuka je na okoliczność występowania w nich poleceń SSI. W tym celu w pliku konfiguracyjnym powinna znajdować się linia : AddType text/x-server-parsed-html .shtml Należy również w pliku konfiguracyjnym umieścić linię : Options Indexes FollowSymLinks co spowoduje włączenie pełnej obsługi SSI. lub: Options IndexesNOEXEC FollowSymLinks co spowoduje włączenie wszystkich poleceń SSI, z wyjątkiem polecenia exec uniemożliwiając w ten sposób uruchamianie za pomącą poleceń SSI skryptów CGI i poleceń systemowych. Metoda ta dołącza dane bezpośrednio do adresu URL skryptu. Ograniczeniem tej metody jest długość przesyłanych danych , która nie może pzrekroczyć z góry ustalonej wartośći. Wartością tą jest maksymalna długość zmiennej środowiskowej QUERY_STRING , gdzie zostaną skopiowane przesłane dane i którymi później poprzez tą zmienną będziemy mogli manipulować. Przykłąd < a href="/cgi-bin/skrypt.cgi?data1=abc&data2=def" > Wywołanie < /a > gdzie: "data1" i "data2" : parametry wywołania "abc" i "def" : wartości tych parametrów Zmienna QUERY_STRING przy takich parametrach będzie miała postać: data1=abc&data2=def Metoda ta wysyła dane na standordowe wyjście. Nie ma ona ograniczeń co do długości przesyłanych danych Typowe nagłówki wysyłane przeglądarki przez serwer to Location: URL : Zmiana bieżącej strony WWW Content-Type: MIME/typ : ustala typ danych wysyłanych do przeglądarki Status: kod wiadomość : Ustawia programowo kod stanu serwera Wysłanie odpowiedniego nagłówka może mieć postać : printf("Location: /strona.html \r\n\r\n"); lub : printf("Content-Type : text/html\r\n\r\n"); lub : printf("Status: 401 Wiadomość \r\n\r\n"); Można również stosować dowolne połączenie powyższych nagłówków. Polecenia SSI są specyjalnymi poleceniami serwera, które można dołączać bezpośrednio do dokumentu HTML.Przed wysłaniem dokumentu do przeglądarki serwer przeszukuje go na okoliczność występowania w nim znaczników SSI. <!-#polecenie znacznik="wartość"-> : Składnia polecenia SSI config : Konfiguruje polecenia SSI: <!-#config errmsg="Błąd polecenia SSI"-> : Komunikat o błędzie pojawiający się w przypadku błędów spowodowanych przez polecenia SSI. <!-#config sizefmt="bytes"-> : Konfiguruje polecenie fsize do potwierdzania wielkości pliku <!-#config timefmt="%A, %B %d, %Y"-> : Konfiguruje format łańcucha daty wyświetlany przy sprawdzaniu daty ostatniej modyfikacji pliku, w tym przpadku: nazwa dnia tygodnia, nazwa miesiąca, dzień miesiąca i rok echo : Wyświetla specjalne zmienne środowiskowe SSI: <!-#echo var="DOCUMENT_NAME"-> : Nazwa dokumentu zwracanego przez serwer <!-#echo var="DOCUMENT_URL"-> : Adres URL dokumentu <!-#echo var="QUERY_STRING_UNESCAPED"-> : Nie odkodowany QUERY_STRING <!-#echo var="DATE_LOCAL"-> : Lokalna data <!-#echo var="DATE_GMT"-> : Data wg. GMT <!-#echo var="LAST_MODIFIED"-> : Data ostatniej modyfikacji dokumentu exec : Dołącza wyjście skryptu CGI lub programu systemowego <!-#exec cgi="/cgi-bin/search.cgi"-> : Dołącza wyjście skryptu CGI <!-#exec cmd="/bin/date"-> : Dołącza wyjście programu systemowego <!-#fsize file="plik"-> : Wyświetla wielkość pliku, parametry file i virtual jak w przypadku #include <!-#flastmod file="plik"-> : Wyświetla datę ostatniej modyfikacji pliku, parametry file i virtual jak w przypadku #include Include : Dołącza inny plik <!-#include file="plik.htm"-> : Dołącza plik w odniesieniu do bieżącej ścieżki <!-#include virtual="/plik.htm"-> : Dołącza plik w odniesieniu do głównego katalogu dokumentu W tej części postaram się przedstawić przykładowe funkcje, czy też pełne kodyźródłowe skryptów CGI.W miarę możliwości liczba przykładów będzie się zwiększać.
Opis Skrypt ten pobiera dane umieszczone w zmiennej QUERY_STRING i wyświetla zawartość tej zmiennej. Sposób wykorzystania Kod żródłowy #include <stdio.h> #include <stdlib.h> //QUERY_STRING zawiera dane wejściowe #define QUERY_STRING getenv("QUERY_STRING") void main(void) { //wysyła do klienta standardowy nagłówek informujący, że będzie przesyłał dokument html printf("Content-type: text/html\n\n"); //przykładowa treść dokumentu printf("< HTML > < HEAD > < META HTTP-EQUIV=\"Content-Type\" "); printf(" CONTENT=\"text/html; charset=iso-8859-2\" > "); printf("< TITLE > Przykład CGI < /TITLE > < /HEAD > "); printf("< BODY Background=\"/images/bg/brown.jpg\" BGCOLOR=\"ffffff\" LINK=\"blue\" ALINK=\"brown\" VLINK=\"brown\" > "); printf("< BR > < CENTER > "); //wyświetla zmienną QUERY_STRING if(QUERY_STRING==NULL) printf("Nie podałeś parametru\n"); else printf("Zmienna < B > QUERY_STRING < /B > ma postać: < BR > %s",QUERY_STRING); printf("< /BODY > < /HTML > "); } W celu przetestowania skryptu wprowadź dowolne dane do formularzy i wyślij je za pomocą przycisku. Lista stanu odpowiedzi serwera na napływające żądania: 200 : Żądanie zakończyło się sukcesem i została wysłana właściwa odpowiedź 201 : Jeśli zasób lub plik został stworzony przez serwer, serwer wysyła kod stanu 201 wraz z lokacją nowego zasobu 202 : Żądanie zostało zaakceptowane, chociaż mogło nie zostać jeszcze przetworzone. 204 : Żądanie zakończyło się sukcesem, ale, z powodu braku treści, nic nie zostanie zwrócone 301 : Żądany dokument posiada nowy, stały adres URL. Nowa lokacja powinna zostać określona w nagłówku Location 302 : Żądany dokument został tymczasowo przeniesiony inne miejsce, określone w nagłówku Location 304 : Klient zażądał warunkowego GET (tj., jeżeli klient pobierze plik tylko wtedy, gdy uległ on modyfikacji po określonej dacie), a plik nie uległ modyfikacji 400 : Żądanie było nieprawidłowe i niemożliwe do odczytania. Status pojawia się w przeglądarkach posiadających wewnętrzne błędy 401 : Klient zażądał pliku, który wymaga weryfikacji tożsamości użytkownika. 403 : Serwer zrozumiał żądanie, ale odmawia jego realizacji. Dzieje się tak głównie wtedy, gdy serwer lub klient nie posiada praw dostępu do żądanego pliku 404 : Żądany dokument nie został odnaleziony 500 : W serwerze pojawił się jakiś wewnętrzny błąd, więc serwer nie może zrealizować żądania. Błąd ten pojawia się wtedy, gdy program CGI zawiera błędy lub wysyła nagłówki, których serwer nie jest w stanie przetworzyć 501 : Polecenie wysłane przez klienta nie jest obsługiwane przez serwer 502 : Serwer otrzymał nieprawidłową odpowiedź od innego serwera 503 : Serwer jest przeciążony i nie może obsłużyć dodatkowych żądań Wysłanie odpowiedniego nagłówka statusu może mieć postać : printf("Status 500 Błąd pracy serwera \r\n\r\n"); Odpowiedź serwera Text/plain : Czysty tekst, typ ustawiony domyślnie dla plików, których rozszerzenie serwer nie rozpozna Text/html : Plik HTML Image/gif : Plik graficzny w formacie gif Image/jpeg : Plik graficzny w formacie jpg Image/tiff : Plik graficzny w formacie tif Audio/x-wav : Plik muzyczny w formacie wav Video/mpeg : Skompresowany obraz wideo w formacie MPEG Application/zip : Format kompresji zip Application/msword : Dokument programu Microsoft Word Dla przykładu : chcesz wysłać na przeglądarkę plik graficzny w formacie jpg. W kodzie umieszczamy informacje co bedziemy wysyłać do przeglądarki printf("Content-Type : Image/jpeg\r\n\r\n"); a następnie wysyłamy na standardowe wyjście odpowiedni plik graficzny AUTH_TYPE : wykorzystywany schemat identyfikacji (zazwyczaj Basic) CONTENT_LENGTH : długość danych wejściowych przy korzystaniu z metody POST CONTENT_TYPE : sposób kodowania danych DOCUMENT_ROOT : główny katalog dokumentu na serwerze GATEWAY_INTERFACE : wersja protokołu CGI HTTP_ACCEPT : lista typów MIME akceptowanych przez przeglądarkę HTTP_ACCEPT_LANGUAGE : lista języków obsługiwanych przez przeglądarkę HTTP_COOKIE : wartości ciasteczek HTTP_REFERER : URL, z którego nastąpiło przejście do bieżącej strony HTTP_USER_AGENT : nazwa, wersja i platforma przeglądarki PATH_INFO : dane dołączane do adresu URL po znaku ukośnika PATH_TRANSLATED : ścieżka względem katalogu głównego dokumentu REMOTE_ADDR : adres IP maszyny klienta REMOTE_GROUP : nazwa grupy, jeśli było potwierdzenie REMOTE_HOST : nazwa maszyny klienta REMOTE_USER : imię użytkownika, jeli było potwierdzenie REQUEST_METHOD : sposób przesyłania danych do serwera (GET lub POST) QUERY_STRING : łańcuch znaków zawierający dane wejściowe dla skryptu CGI. Łańcuch dołączony do adresu URL po pytajniku SCRIPT_NAME : nazwa skryptu CGI SERVER_ADMIN : adres e-mail administratora serwera SERVER_NAME : nazwa maszyny serwera ( host ) SERVER_PORT : port, na którym jest uruchomiony serwer (najczęściej 80) SERVER_PROTOCOL : wersja protokołu HTTP SERVER_SOFTWARE : nazwa oprogramowania serwera Pobranie zmiennej środowiskowej może mieć postać : #define QUERY_STRING getenv("QUERY_STRING") lub np. : char buffer[1024]; strcpy( buffer, getenv("QUERY_STRING")); "CGI - Programowanie CGI pzrewodnik" : Eugene Eric Kim ISBN 83-87115-10-X LT&P "Programowanie WWW" : Kris Jamsa, Suleiman "Sam" Lalani, Steve Weakley ISBN 83-7158-055-X Mikom 1997 "Apache Przewodnik encyklopedyczny" : Ben Laurie, Peter Laurie ISBN 83-7197-181-8 Helion 2000 |
![]() |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
|
![]() |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||