Perl CGI Programowanie
Co to jest CGI
CGI jest utrzymywane przez NCSA NCSA CGI jest zdefiniowany w następujący sposób:
CGI (Common Gateway Interface), Common Gateway Interface, który to program uruchomiony na serwerze, na przykład: Serwer HTTP, interfejs kliencki z tej samej strony HTML.
przeglądanie stron internetowych
Aby lepiej zrozumieć, jak działa CGI, możemy kliknąć na link na stronie internetowej lub adresu URL procesu:
- 1, należy użyć przeglądarki, aby uzyskać dostęp do adresu URL i podłączyć do serwera HTTP.
- 2, serwer sieci Web odbiera komunikat żądania będą przetwarzane URL i wyszukać pliki dostępne na serwerze, jeśli istnieje, jeśli istnieje, aby przywrócić zawartość pliku, w przeciwnym wypadku zwraca komunikat o błędzie.
- 3, przeglądarka otrzymuje informacje z serwera i wyświetla otrzymane wiadomości plików lub błędów.
Programy CGI może być skrypt Python, Perl skrypt, skrypt powłoki, C lub C ++ programy.
Wykres CGI
Konfiguracja serwera WWW i wsparcie
Przed przeprowadzić programowanie CGI, upewnij się, że serwer WWW został skonfigurowany do obsługi CGI oraz obsługi CGI.
Apache obsługuje konfigurację CGI:
Konfigurowanie katalogu CGI:
ScriptAlias /cgi-bin/ /var/www/cgi-bin/
Wszystkie serwer HTTP w celu wykonania programów CGI są zapisywane we wstępnie skonfigurowane katalogu. Ten katalog jest nazywany katalogu CGI, a zgodnie z przyjętą konwencją, to nazywa się w katalogu / var / www / cgi-bin.
Plik rozszerzenie .cgi CGI, Perl może także używać rozszerzenia .pl.
Domyślnie konfiguracja serwera Linux działa katalogu cgi-bin jest / var / www.
Jeśli chcesz określić inny katalog do uruchamiania skryptów CGI, można zmodyfikować plik konfiguracyjny httpd.conf w następujący sposób:
<Directory "/var/www/cgi-bin"> AllowOverride None Options +ExecCGI Order allow,deny Allow from all </Directory>
Dodaj przyrostek .pl AddHandler, dzięki czemu możemy uzyskać dostęp do końcówkę .pl skryptu Perl:
AddHandler cgi-script .cgi .pl .py
Pierwszy program CGI
Poniżej utworzyć plik test.cgi, kod jest w następujący sposób:
#!/usr/bin/perl print "Content-type:text/html\r\n\r\n"; print '<html>'; print '<head>'; print '<meta charset="utf-8">'; print '<title>本教程(w3write.com)</title>'; print '</head>'; print '<body>'; print '<h2>Hello Word! </h2>'; print '<p>来自本教程第一个 CGI 程序。</p>'; print '</body>'; print '</html>'; 1;
Następnie otwórz przeglądarkę http: //localhost/cgi-bin/test.cgi, wyniki wyjściowe są następujące:
Wyjście z pierwszej linii skryptu "Content-Type: text / html \ r \ n \ r \ n" zostanie wysłana do przeglądarki i powiedzieć, że przeglądarka wyświetli typu zawartości "text / html".
nagłówek HTTP
Zawartość pliku test.cgi w: część nagłówka HTTP jest "Content-type text / html", zostanie ona wysłana do typu zawartości przeglądarka informuje pliki przeglądarki.
Format nagłówek HTTP jest następujący:
HTTP 字段名: 字段内容
Na przykład:
Content-type:text/html\r\n\r\n
Poniższa tabela przedstawia informacje w programach CGI nagłówka HTTP są często używane:
głowa | opis |
---|---|
Content-type: | Podmiot MIME odpowiadające żądanie informacji. Na przykład: Content-Type: text / html |
Wygasa: Data | data i czas reakcji wygasł |
Lokalizacja: URL | Aby przekierować odbiorcę na żądanie zakaz lokalizacji URL o uzupełnienie wniosku lub identyfikacji nowych zasobów |
Last modified: Data | Żądany zasób został ostatnio modyfikowany |
Content-Length: N | Żądanie Content-Length |
Set-Cookie: String | Ustawienia HTTP Cookie |
Zmienne środowiskowe CGI
Wszystkie programy CGI otrzymały następujące zmienne środowiskowe, które odegrały ważną rolę w programie CGI:
Nazwa zmiennej | opis |
---|---|
CONTENT_TYPE | Wartość ta wskazuje, że zmiennej środowiskowej do typu MIME przekazywania informacji. Obecnie, zmienne środowiskowe są zwykle CONTENT_TYPE: application / x-www-form-urlencoded, powiedział, że dane z formularza HTML. |
CONTENT_LENGTH | Jeśli informacje Serwer tryb transferu i program CGI jest POST, nawet jeśli zmienna środowiskowa wejścia STDIN liczba bajtów, które można odczytać aktualne dane z normą. Ta zmienna podczas odczytu danych wejściowych muszą być użyte. |
HTTP_COOKIE | Zawartość COOKIE w kliencie. |
HTTP_USER_AGENT | Dostarczanie informacji zawiera numer wersji przeglądarki klienta lub innych poufnych danych. |
PATH_INFO | Wartość tej zmiennej środowiskowej wskazuje nazwę programu CGI natychmiast po informacji dodatkowej ścieżki. często pojawia się on jako program CGI argumentem. |
QUERY_STRING | Jeśli informacje Serwer tryb transferu i program CGI jest informacja GET, wartość tej zmiennej środowiskowej nawet jeśli minął. Informacje te są następnie nazwę programu CGI, zarówno w środku ze znakiem zapytania "?" Separatora. |
REMOTE_ADDR | Wartość tej zmiennej środowiskowej jest adres IP klienta wysyła żądanie, na przykład, powyższa 192.168.1.67. Wartość ta jest zawsze obecny. I to jest konieczność zapewnienia klient internetowy unikalnego identyfikatora serwera sieci Web mogą być wykorzystane w programach CGI odróżnić innego klienta sieci Web. |
REMOTE_HOST | Wartość tej zmiennej środowiskowej zawiera nazwę hosta żądającego klienta CGI. Jeśli nie chcesz, by sprawdzić, nie trzeba zdefiniować tę zmienną. |
REQUEST_METHOD | Zapewnia metody nazywanej skrypt. Dla scenariusza HTTP / 1.0 protokołu tylko GET i POST znaczące. |
SCRIPT_FILENAME | Pełna ścieżka do skryptów CGI |
SCRIPT_NAME | Nazwa skryptu CGI |
SERVER_NAME | Jest to nazwa hosta, alias lub adres IP serwera sieci Web. |
SERVER_SOFTWARE | Wartość tej zmiennej środowiskowej zawiera wywołanie CGI nazwę programu i numer wersji serwera HTTP. Na przykład, powyższa wartość Apache / 2.2.14 (Unix) |
Oto prosty skrypt CGI zmienne środowiskowe CGI wyjście:
#!/usr/bin/perl print "Content-type: text/html\n\n"; print '<meta charset="utf-8">'; print "<font size=+1>环境变量:</font>\n"; foreach (sort keys %ENV) { print "<b>$_</b>: $ENV{$_}<br>\n"; } 1;
pliki do pobrania
Jeśli chcemy osiągnąć poprzez CGI Perl pobierania plików, wymaga innego zestawu informacji nagłówka w następujący sposób:
#!/usr/bin/perl # HTTP Header print "Content-Type:application/octet-stream; name=\"FileName\"\r\n"; print "Content-Disposition: attachment; filename=\"FileName\"\r\n\n"; # Actual File Content will go hear. open( FILE, "<FileName" ); while(read(FILE, $buffer, 100) ) { print("$buffer"); }
Za pomocą metody GET przesyłania danych
GET do wysyłania zakodowanych danych użytkownika do serwera, dane informacyjne jest zawarty w adresie URL żądania strony do liczby dzielą się na "?":
http://www.test.com/cgi-bin/test.cgi?key1=value1&key2=value2GET wnioski dotyczące niektórych innych uwag:
- GET Żądanie to może być buforowane
- Żądanie GET pozostaje w historii przeglądarki
- GET wnioski mogą być zakładka
- GET żądania nie powinny być wykorzystywane w kontaktach z danych wrażliwych
- GET wnioski mają ograniczenia długości
- GET wnioski powinny być stosowane wyłącznie do pobierania danych
Przykłady prostych url: Get metody
Poniżej znajduje się prosty URL, używając metody GET wysłać dwóch parametrów programu test.cgi:
/cgi-bin/test.cgi?name=本教程&url=http://www.w3write.com
Plik Kod test.cgi:
#!/usr/bin/perl local ($buffer, @pairs, $pair, $name, $value, %FORM); # 读取文本信息 $ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/; if ($ENV{'REQUEST_METHOD'} eq "GET") { $buffer = $ENV{'QUERY_STRING'}; } # 读取 name/value 对信息 @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%(pl)/pack("C", hex($1))/eg; $FORM{$name} = $value; } $name = $FORM{name}; $url = $FORM{url}; print "Content-type:text/html\r\n\r\n"; print "<html>"; print "<head>"; print '<meta charset="utf-8">'; print '<title>本教程(w3write.com)</title>'; print "</head>"; print "<body>"; print "<h2>$name网址:$url</h2>"; print "</body>"; print "</html>"; 1;
Sprawdź swoją przeglądarkę, wyniki wyjściowe są następujące:
Przykłady prostej formie: Get metody
Poniżej przedstawiono dwa wysłać dane do serwera za pomocą metody GET za pośrednictwem formularza HTML, przedstawiony ten sam dokument test.cgi skryptu serwera test kod jest w następujący sposób:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3write.com)</title> </head> <body> <form action="/cgi-bin/test.cgi" method="get"> 站点名称: <input type="text" name="name"> <br /> 站点 URL: <input type="text" name="url" /> <input type="submit" value="提交" /> </form> </body> </html>
Realizacja przeglądarka wyniki jest następująca:
Za pomocą metody POST, aby przekazać dane
Korzystanie z metody POST, aby przekazać dane do serwera jest bardziej bezpieczne i niezawodne, jak niektórzy poufnych informacji, takich jak hasła użytkownika należy użyć POST do przesyłania danych.
Poniżej znajduje również test.cgi, może również obsługiwać POST dane formularzy złożonych przez przeglądarkę:
#!/usr/bin/perl local ($buffer, @pairs, $pair, $name, $value, %FORM); # 读取文本信息 $ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/; if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); }else { $buffer = $ENV{'QUERY_STRING'}; } # 读取 name/value 对信息 @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%(pl)/pack("C", hex($1))/eg; $FORM{$name} = $value; } $name = $FORM{name}; $url = $FORM{url}; print "Content-type:text/html\r\n\r\n"; print "<html>"; print "<head>"; print '<meta charset="utf-8">'; print '<title>本教程(w3write.com)</title>'; print "</head>"; print "<body>"; print "<h2>$name网址:$url</h2>"; print "</body>"; print "</html>"; 1;
Poniżej przedstawiono dwa wysłać dane do serwera za pomocą metody GET za pośrednictwem formularza HTML, przedstawiony ten sam dokument test.cgi skryptu serwera test kod jest w następujący sposób:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3write.com)</title> </head> <body> <form action="/cgi-bin/test.cgi" method="post"> 站点名称: <input type="text" name="name"> <br /> 站点 URL: <input type="text" name="url" /> <input type="submit" value="提交" /> </form> </body> </html>
Realizacja przeglądarka wyniki jest następująca:
Program CGI do przekazywania danych za pośrednictwem wyboru
pole wykorzystywane do przedstawienia jednego lub więcej danych opcji, test kod jest w następujący sposób:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3write.com)</title> </head> <body> <form action="/cgi-bin/test.cgi" method="POST" target="_blank"> <input type="checkbox" name="w3big" value="on" /> 本教程 <input type="checkbox" name="google" value="on" /> Google <input type="submit" value="选择站点" /> </form> </body> </html>
Plik Kod test.cgi:
#!/usr/bin/perl local ($buffer, @pairs, $pair, $name, $value, %FORM); # 读取信息 $ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/; if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); }else { $buffer = $ENV{'QUERY_STRING'}; } # 读取 name/value 对信息 @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%(pl)/pack("C", hex($1))/eg; $FORM{$name} = $value; } if( $FORM{w3big} ){ $w3big_flag ="ON"; }else{ $w3big_flag ="OFF"; } if( $FORM{google} ){ $google_flag ="ON"; }else{ $google_flag ="OFF"; } print "Content-type:text/html\r\n\r\n"; print "<html>"; print "<head>"; print '<meta charset="utf-8">'; print '<title>本教程(w3write.com)</title>'; print "</head>"; print "<body>"; print "<h2> 本教程选中状态 : $w3big_flag</h2>"; print "<h2> Google 选择状态 : $google_flag</h2>"; print "</body>"; print "</html>"; 1;
Realizacja przeglądarka wyniki jest następująca:
transfer danych Radio poprzez program CGI
Radiowego przesyłania danych tylko do serwera test kod jest następujący:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3write.com)</title> </head> <body> <form action="/cgi-bin/test.cgi" method="post" target="_blank"> <input type="radio" name="site" value="w3big" /> 本教程 <input type="radio" name="site" value="google" /> Google <input type="submit" value="提交" /> </form> </body> </html>
Kod skryptu test.cgi przedstawia się następująco:
#!/usr/bin/perl local ($buffer, @pairs, $pair, $name, $value, %FORM); # 读取信息 $ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/; if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); }else { $buffer = $ENV{'QUERY_STRING'}; } # 读取 name/value 对信息 @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%(pl)/pack("C", hex($1))/eg; $FORM{$name} = $value; } $site = $FORM{site}; print "Content-type:text/html\r\n\r\n"; print "<html>"; print "<head>"; print '<meta charset="utf-8">'; print '<title>本教程(w3write.com)</title>'; print "</head>"; print "<body>"; print "<h2> 选择的网站 $site</h2>"; print "</body>"; print "</html>"; 1;
Realizacja przeglądarka wyniki jest następująca:
textarea transferu danych przez program CGI
Textarea przekazać wiele wierszy danych do serwera, test kod jest w następujący sposób:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3write.com)</title> </head> <body> <form action="/cgi-bin/test.cgi" method="post" target="_blank"> <textarea name="textcontent" cols="40" rows="4"> 在这里输入内容pl. </textarea> <input type="submit" value="提交" /> </form> </body> </html>
Kod skryptu test.cgi przedstawia się następująco:
#!/usr/bin/perl local ($buffer, @pairs, $pair, $name, $value, %FORM); # 读取信息 $ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/; if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); }else { $buffer = $ENV{'QUERY_STRING'}; } # 读取 name/value 对信息 @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%(pl)/pack("C", hex($1))/eg; $FORM{$name} = $value; } $text_content = $FORM{textcontent}; print "Content-type:text/html\r\n\r\n"; print "<html>"; print "<head>"; print '<meta charset="utf-8">'; print '<title>本教程(w3write.com)</title>'; print "</head>"; print "<body>"; print "<h2>输入的文本内容为:$text_content</h2>"; print "</body>"; print "</html>"; 1;
Realizacja przeglądarka wyniki jest następująca:
Program CGI do przekazywania danych za pośrednictwem rozwijanej
Kod HTML pole rozwijane w sposób następujący:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3write.com)</title> </head> <body> <form action="/cgi-bin/test.cgi" method="post" target="_blank"> <select name="dropdown"> <option value="w3big" selected>本教程</option> <option value="google">Google</option> </select> <input type="submit" value="提交"/> </form> </body> </html>
test.cgi kod skryptu w następujący sposób:
#!/usr/bin/perl local ($buffer, @pairs, $pair, $name, $value, %FORM); # 读取信息 $ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/; if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); }else { $buffer = $ENV{'QUERY_STRING'}; } # 读取 name/value 对信息 @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%(pl)/pack("C", hex($1))/eg; $FORM{$name} = $value; } $site = $FORM{dropdown}; print "Content-type:text/html\r\n\r\n"; print "<html>"; print "<head>"; print '<meta charset="utf-8">'; print '<title>本教程(w3write.com)</title>'; print "</head>"; print "<body>"; print "<h2>选择的网站是:$site</h2>"; print "</body>"; print "</html>"; 1;
Realizacja przeglądarka wyniki jest następująca:
CGI służy Cookie
Protokół HTTP w wielkim wadą jest źle ocenić tożsamości użytkownika, które dają programistom wiele niedogodności, ale wydaje funkcjonalności cookies nadrabiał ten niedobór.
cookies, które uzyskuje dostęp do skryptu, a klient przez przeglądarkę klienta na kliencie twardym pisać rekordy danych, pobieranie danych, gdy klient odwiedza kolejny skrypt, tak aby osiągnąć funkcję określania tożsamości, ciasteczka powszechnie stosowane przy weryfikacji tożsamości.
Składnia cookies
Http cookie jest wysyłane za pośrednictwem nagłówka HTTP osiągnąć, musiał przesyłać pliki, składni header set-Cookie to w następujący sposób:
Set-cookie:name=name;expires=date;path=path;domain=domain;secure
- name = nazwa: ustawić wartość cookie (nazwa nie może być używany "," i "," numer), gdy istnieje wiele wartości name ";" aby oddzielić, na przykład: nazwa1 = nazwa1, nazwa2 = name2 ; NAME3 = NAME3.
- wygasa = data: ciasteczka datę ważności w formacie: wygaśnięcia = "Wdy, DD- MMM-YYYY HH: MM: SS"
- path = ścieżka: ścieżka ustawić obsługę ciasteczek, jeśli ścieżka jest ścieżką, cookie dla wszystkich plików i podkatalogów pozycji katalogu w życie, na przykład: path = "/ cgi-bin /", jeśli ścieżka jest plik, cookie to odnosi się do wejścia w życie tego pliku, na przykład: path = "/ cgi-bin / cookie.cgi".
- domain = Domena: nazwa domeny cookie jest ważny, na przykład: domena = "www.w3write.com"
- zabezpieczenie: Jeśli ta flaga jest podane, że ciasteczka mogą być przesyłane wyłącznie za pośrednictwem protokołu SSL serwera https.
- Cookie jest odbierany przez ustawienie zmiennych środowiskowych HTTP_COOKIE osiągnięty, programy CGI mogą uzyskać informacje, pobierając zmienną cookie.
ustawienia cookies
Ustawienia cookies jest bardzo prosta, ciasteczko zostanie wysłane osobno w nagłówku HTTP. Poniższy przykład ustawia identyfikator użytkownika, hasło i wygasa w pliku cookie:
#!/usr/bin/perl print "Set-Cookie:UserID=XYZ;\n"; print "Set-Cookie:Password=XYZ123;\n"; print "Set-Cookie:Expires=Tuesday, 31-Dec-2017 23:12:40 GMT";\n"; print "Set-Cookie:Domain=www.w3write.com;\n"; print "Set-Cookie:Path=/perl;\n"; print "Content-type:text/html\r\n\r\n"; plplplplpl.其他 HTML 内容
Znajdź Cookie
Cookie stronę wyszukiwania informacji jest bardzo proste, w CGI Zmienne środowiskowe HTTP_COOKIE, format przechowywania jest następująca informacja jest przechowywana Cookie:
#!/usr/bin/perl $rcvd_cookies = $ENV{'HTTP_COOKIE'}; @cookies = split /;/, $rcvd_cookies; foreach $cookie ( @cookies ){ ($key, $val) = split(/=/, $cookie); # splits on the first =. $key =~ s/^\s+//; $val =~ s/^\s+//; $key =~ s/\s+$//; $val =~ s/\s+$//; if( $key eq "UserID" ){ $user_id = $val; }elsif($key eq "Password"){ $password = $val; } } print "User ID = $user_id\n"; print "Password = $password\n";
Powyższy przykład wyjście jest:
User ID = XYZ Password = XYZ123
moduł CGI
Perl CGI zapewnia wiele wbudowanych modułów, wykorzystywane następujących dwóch kryteriów: