Cgi ukazi. Jasna e-trgovina

E-trgovina v jasni ruščini. Kako poteka spletno poslovanje?

V zadnjem času je vedno več projektov, povezanih s spletnim trgovanjem. Med preučevanjem tega področja nisem našel splošnega in razumljivega opisa procesa. Zato sem se odločil narediti nekaj takega kot goljufija, na katero se lahko vedno obrnete, da bi razumeli postopek na področju, kot je e-trgovina.

Takoj bom rekel, da sem se osredotočil na procese in kanale, ki pomagajo privabiti stranke.

E-trgovina: za kaj gre?

Definicije iz različnih virov povedo nekaj o prodaji blaga ali storitev prek interneta. Preprosto povedano, e-trgovina je vsaka spletna dejavnost, kjer se pojavi denar.

Nakupovanje, prodaja, zavarovanje, bančništvo, elektronski denar, vse je tukaj. Vzemi in podpiši.

Od cilja

Da bi razumeli težavo, predlagam, da začnete pot od samega konca. Kaj je cilj vsakega podjetja? Tako je, zasluži denar. Torej, predstavljajte si kateri koli izdelek, na primer silikonske nogavice. Zakaj ne!

Vzel sem prvo stvar, ki mi je padla na pamet, izkazalo se je, da je nekaj takega ...

Naša naloga je zaslužiti na teh nogavicah. Razmišljamo o internetu. Hmm...zakaj ne bi stran "posekali" in tako bo šla prodaja, samo Maldivi mi ostanejo! A ni tako preprosto.

Zelo rada rišem. To pomaga razumeti različne procese. Gremo risati?!

Zaenkrat je naš model videti takole. Vzamemo nogavice, jih damo na internet in dobimo denar. To je preprosto super! Oči vas pečejo, dlani se vam potijo ​​in že se želite lotiti posla. Toda ali morate narediti spletno stran ali prodajno platformo?

Spletna stran ali platforma za prodajo

Obstajajo različne rešitve za umestitev vašega izdelka na svetovni splet. Ustvarite lahko lastno spletno mesto ali uporabite platforme tretjih oseb (skupine, strani na družbenih omrežjih, oglasne deske itd.). Ustavimo se na mestu.

Naročili ste spletno stran, vzeli že pripravljeno predlogo ali jo ustvarili sami z graditeljem spletnih strani (lahko googlate CMS), ni pomembno. Nato so postavili kup različnih silikonskih nogavic in bili srečni.

Oprostite, ker motim branje. Pridružite se mojemu telegram kanalu. Sveže objave člankov, razvoj digitalnih produktov in vdor v rast, vse je tu. Čakam te! Nadaljujmo ...

Plačilni sistemi

Toda, da bi oseba kupila od vas tukaj in zdaj, bo treba prilagoditi plačilne sisteme. To je nekakšna storitev, ki omogoča nakupovanje preko spleta preko: bančnih kartic, internetnega denarja, mobilnih telefonov in še kup drugih stvari. Za to si boste morali deliti odstotek transakcij, vendar si boste na ta način precej olajšali življenje.

Izberite storitev, ki vam ustreza. Nekje bo odstotek večji, nekje pa bo naročnina ali kaj drugega. Samo malo raziščite. Vnesite zahtevano kodo na svojo spletno stran, povežite vse transakcije s svojim kartičnim računom in voila!

Zdelo se je, da je to vse. Obstaja spletna stran, kartice izdelkov tudi, tudi gumb »kupi« deluje, a nekaj manjka ... Pretoka kupcev, ki bi kupovali, ni.

Tokovi strank

Kje je: CAC = strošek pridobivanja nove stranke. MCC (stroški marketinške kampanje) = skupni strošek stroškov trženja, namenjenih privabljanju strank (vendar ne obdržanju). W (plače) = plača za tržnike in vodje prodaje. S (programska oprema) = Stroški programske opreme, uporabljene pri oglaševanju in prodaji (na primer uporabljena prodajna platforma, avtomatizacija trženja, A/B testiranje, analitične storitve itd.). PS (strokovne storitve) = Stroški strokovnih storitev za tržne in prodajne oddelke (oblikovanje, svetovanje itd.). O (other) = Drugi režijski stroški, povezani z oddelki trženja in prodaje. CA (customersacquired) = skupno število privabljenih strank.

Vendar ne smemo pozabiti na kakovost stranke; LTV bo pomagal.

Pomembna metrika: LTV

Live Time Value, življenjski cikel stranke, je še en kazalnik v e-trgovini, ki ga je treba upoštevati. Prikazuje, koliko dohodka v povprečju prinese ena stranka. Obstajajo različni pristopi k izračunu, sam sem izbral dejanskega glede na dobiček, kot enega najbolj natančnih.

To je preprosto vsota celotnega prihodka v celotni zgodovini nakupov za vsako posamezno stranko. Vsoto vseh nakupov (transakcij) strank dodajte transakciji N, pri čemer je transakcija N zadnji nakup, ki ga je stranka opravila pri vašem podjetju. Če imate dostop do vseh podatkov o transakcijah strank, lahko to preprosto izračunate z uporabo Excela.

LTV = (transakcija 1 + transakcija 2 + transakcija 3... + transakcija N) x delež dobička v prihodku.

Izračun LTV na podlagi čistega dobička na koncu pokaže dejanski dobiček, ki ga stranka prinese vašemu podjetju. To upošteva stroške storitev za stranke, stroške zadrževanja, stroške privabljanja itd. Rezultat je cel kompleks izračunov na podlagi posameznih podatkov. Skupni dobiček, ustvarjen na stranko skozi čas, vam bo dal natančno razumevanje dobičkonosnosti vaših strank do danes.

Druge pristope lahko najdete na.

Pomembni indikatorji: razmerje CAC in LTV

Za razumevanje sposobnosti preživetja podjetja je zelo pomembno pogledati razmerje obeh omenjenih razmerij CAC:LTV.

  • Manj kot 1:1 - Z vso hitrostjo drvite proti bankrotu.
  • 1:1 – Izgubite denar za vsako privabljeno stranko.
  • 1:2 – Zdi se dobro, a zdi se, da ne vlagate dovolj denarja in bi se lahko hitreje razvijali. Zaženite bolj agresivne kampanje za pridobivanje strank in dosegajte stopnje blizu 1:3.
  • 1:3 – idealno razmerje. Imate uspešno podjetje in močan poslovni model.

Pomembni kazalniki: ne pozabite na donosnost naložbe

Kot smo razpravljali zgoraj, morate pri e-trgovini jasno razumeti, ali je donosna uporaba kanala za pridobivanje ali ne. Poleg LTV in CAC obstaja še en pomemben kazalnik: ROI. Pokaže, ali se je vaša naložba, v našem primeru v oglaševanje, izplačala. To je. koliko nam je na koncu prinesel 1 vloženi rubelj.

Za izračun se uporablja zelo preprosta formula:

Pri čemer je »prihodek oglaševalske akcije« razlika med prihodkom od kanala in stroški vašega izdelka. In za izračun dobička odštejte stroške oglaševanja.

Tako bi bila podrobnejša formula videti takole:

ROI = (prihodek kanala – stroški) – stroški oglaševanja / stroški oglaševanja x 100 %

Preberite podrobnejši primer z izračunom. Pravzaprav je ta preprosta formula postavljena v isto Excelovo tabelo, kjer se vse samodejno izračuna.

Vsi trije kazalniki, o katerih smo razpravljali, so pomembni v e-trgovini. Vsak od njih vam omogoča iskanje ozkih grl v vaših tokovih in delo z njimi. Tu se skriva potencial za rast podjetja. Naš model z nogavicami sem še malo dodala.

Nemogoče je vse strniti v en material in kdo ga bo bral tako dolgo? Kasneje bom naredil ločen vodnik o odtenkih e-trgovine, ki lahko motijo ​​​​prodajo.

Skupaj

Na splošno zdaj na splošno razumete spletno trgovanje ali e-trgovino. Nadalje, kot pravijo: "Hudič je v podrobnostih." Preučite vsak kanal posebej, izračunajte kazalnike uspešnosti in iščite nova spoznanja v malenkostih. Internetna prodaja za vas in še več! In še en material imam.

Da, skoraj sem pozabil, srečno novo leto, dragi bralci! Želim vam veliko zmag in dosežkov naslednje leto!

Poglavje #9.

Programiranje s pomočjo CGI

Vključitev razdelka o CGI v knjigo o bazah podatkov se morda zdi tako čudna kot vključitev poglavja o popravilu avtomobila v kuharsko knjigo. Seveda, če želite iti v trgovino, potrebujete delujoč avto, toda ali je o tem primerno govoriti? Popolna razprava o CGI in spletnem programiranju na splošno presega obseg te knjige, vendar je kratek uvod v te teme dovolj za izboljšanje zmožnosti MySQL in mSQL za predstavitev podatkov na področju spleta.

To poglavje je namenjeno predvsem tistim, ki se učijo baz podatkov, a bi radi pridobili nekaj znanja o spletnem programiranju. Če je vaš priimek Berners-Lee ali Andreessen, tukaj verjetno ne boste našli ničesar, česar še ne poznate. A tudi če CGI še niste začetnik, vam je lahko hitra referenca med potapljanjem v skrivnosti MySQL in mSQL zelo koristna.

Kaj je CGI?

Tako kot večina akronimov tudi Common Gateway Interface (CGI) v resnici ne pove veliko. Vmesnik s čim? Kje je ta prehod? O kakšni skupnosti govorimo? Da bi odgovorili na ta vprašanja, se vrnimo malo nazaj in si oglejmo WWW kot celoto.

Tim Berners-Lee, fizik, ki je delal v CERN-u, je leta 1990 prišel na idejo o spletu, čeprav načrt sega v leto 1988. Ideja je bila omogočiti raziskovalcem fizike delcev preprosto in hitro izmenjavo večpredstavnostnih podatkov – besedila. , slike in zvok - prek interneta. WWW je bil sestavljen iz treh glavnih delov: HTML, URL in HTTP. HTML - Jezik za oblikovanje, ki se uporablja za predstavitev vsebine na spletu. URL - to je naslov, ki se uporablja za pridobivanje HTML (ali druge) vsebine s spletnega strežnika. In končno HTTP - je jezik, ki ga razume spletni strežnik in omogoča odjemalcem, da od strežnika zahtevajo dokumente.

Možnost pošiljanja vseh vrst informacij prek interneta je bila revolucionarna, vendar so kmalu odkrili še eno možnost. Če lahko pošljete poljubno besedilo prek spleta, zakaj potem ne morete poslati besedila, ki ga ustvari program in ne vzame iz že pripravljene datoteke? To odpira morje možnosti. Preprost primer: uporabite lahko program, ki prikazuje trenutni čas, tako da bralec vidi točen čas vsakič, ko si ogleda stran. Nekaj ​​pametnih glav v Nacionalnem centru za superračunalniške aplikacije (NCSA), ki je ustvarjalo spletni strežnik, je videlo to priložnost in kmalu se je rodil CGI.

CGI je nabor pravil, ki programom na strežniku omogočajo pošiljanje podatkov odjemalcem prek spletnega strežnika. Specifikacijo CGI so spremljale spremembe HTML in HTTP, ki so uvedle novo funkcijo, znano kot obrazci.

Če CGI programom omogoča pošiljanje podatkov odjemalcu, potem obrazci to zmožnost razširijo tako, da odjemalcu omogočijo pošiljanje podatkov temu programu CGI. Zdaj lahko uporabnik ne samo vidi trenutni čas, ampak tudi nastavi uro! Oblike CGI so odprle vrata resnični interaktivnosti v spletnem svetu. Pogoste aplikacije CGI vključujejo:

  • Dinamični HTML. Celotna spletna mesta je mogoče ustvariti z enim programom CGI.
  • Iskalniki, ki najdejo dokumente, ki vsebujejo uporabniško določene besede.
  • Knjige gostov in oglasne deske, kjer lahko uporabniki dodajajo svoja sporočila.
  • Naročilnice.
  • Vprašalniki.
  • Pridobivanje informacij iz baze podatkov, ki gostuje na strežniku.

V naslednjih poglavjih bomo obravnavali vse te aplikacije CGI, pa tudi nekatere druge. Vsi nudijo odličen način za povezavo CGI z bazo podatkov, kar nas zanima v tem razdelku.

Obrazci HTML

Preden raziščemo posebnosti CGI, je koristno pogledati najpogostejši način, na katerega končni uporabniki zagotovijo vmesnik programom CGI: obrazci HTML. Obrazci so del jezika HTML, ki končnemu uporabniku ponuja različne vrste polj. Podatke, vnesene v polja, lahko pošljete na spletni strežnik. Polja se lahko uporabljajo za vnos besedila ali so gumbi, ki jih lahko uporabnik klikne ali preveri. Tukaj je primer strani HTML, ki vsebuje obrazec:

<НТМL><НЕАD><ТITLЕ>Moja stran z obrazci


<р>To je stran z obrazcem.


Vnesite svoje ime:



Ta obrazec ustvari niz s 40 znaki, kamor lahko uporabnik vnese svoje ime. Pod vrstico za vnos je gumb, s klikom na katerega se podatki obrazca prenesejo na strežnik. Spodaj so navedene oznake, povezane z obrazci, ki jih podpira HTML 3.2, danes najbolj razširjen standard. Imena oznak in atributov lahko vnesete v katerem koli primeru, vendar se držimo izbirnega dogovora, da so začetne oznake napisane z velikimi črkami, zaključne oznake pa z malimi črkami.


Ta oznaka označuje začetek obrazca. Na koncu obrazca je obvezna zaključna oznaka

. Med oznakami
Dovoljeni so trije atributi: ACTION določa URL ali relativno pot do programa CGI, v katerega bodo poslani podatki; METHOD določa metodo HTTP, prek katere bo oddan obrazec (to je lahko GET ali POST, vendar bomo skoraj vedno uporabljali POST); ENCTYPE določa metodo kodiranja podatkov (to uporabite le, če jasno razumete, kaj počnete).


Zagotavlja najbolj prilagodljiv način za uporabniški vnos. Dejansko obstaja devet različnih vrst oznak . Tip je določen z atributom TYPE. Prejšnji primer uporablja dve oznaki : eden s tipom SUBMIT in drugi s privzetim tipom TEXT. Devet vrst je naslednjih:

BESEDILO

Polje, v katerega lahko uporabnik vnese eno vrstico besedila.

GESLO

Enako kot TEXT, vendar besedilo, ki ga vnesete, ni prikazano na zaslonu.

POTRDITVNO POLJE

Potrditveno polje, ki ga lahko uporabnik izbere in počisti.

RADIO

Izbirni gumb, ki ga je treba kombinirati z vsaj enim drugim izbirnim gumbom. Uporabnik lahko izbere samo enega izmed njih.

POŠLJI

Gumb, ki ob kliku odda obrazec spletnemu strežniku.

PONASTAVITI

Gumb, ki ob kliku povrne obrazec na privzete vrednosti.

MAPA

Podobno besedilnemu oknu, vendar zahteva vnos imena datoteke, ki bo poslana strežniku.

SKRITO

Nevidno polje, v katerem se lahko shranjujejo podatki.

SLIKA

Podobno kot gumb POŠLJI, vendar lahko za sliko na gumbu nastavite sliko.

Poleg oznak atributov TYPE običajno imajo atribut NAME, ki podatke, vnesene v polje, poveže z nekim imenom. Ime in podatki so poslani strežniku v slogu vrednost=vrednost. V prejšnjem primeru je bilo besedilno polje poimenovano firstname. Z atributom VALUE lahko dodelite vnaprej določene vrednosti poljem vrste TEXT, PASSWORD, FILE in HIDDEN. Isti atribut, ki se uporablja z gumbi, kot sta SUBMIT ali PONASTAVI, na njih prikaže določeno besedilo. Polji tipa RADIO in CHECKBOX so lahko prikazani kot potrjeni z uporabo atributa CHECKED brez podajanja vrednosti.

Atribut SIZE se uporablja za nastavitev dolžine polj TEXT, PASSWORD in FILE. Z atributom MAXLENGTH lahko omejite dolžino vnesenega besedila. Atribut SRC določa URL slike, uporabljene v vrsti SLIKA. Končno, atribut ALIGN določa poravnavo slike za vrsto SLIKE in je lahko ZGOR, SREDINA, SPODAJ (privzeto), LEVO ali DESNO (gor, sredina, dol, levo, desno).

.

Enako kot oznaka , pri oznaki in vsako besedilo med oznakama bo sprejeto kot privzeto besedilo , podobno kot atribut VALUE za oznako . Za oznako

, ki zagotavlja prostor za vnos eseja. Podatek se imenuje "esej". Blok besedila je širok 70 znakov in globok 10 vrstic. Presledek med oznakami

lahko uporabite za vzorčni esej. -->

tipi "SUBMIT" oziroma "RESET". Gumb »ODDAJ« ima preglaseno oznako »Vnesi podatke«, gumb »PONASTAVI« pa ima privzeto oznako (ki jo določi brskalnik). S klikom na gumb "POŠLJI" boste podatke poslali na spletni strežnik, ki bo povrnil podatke v prvotno stanje in izbrisal vse uporabniško vnesene podatke. -->


Edina vrsta vnosa, ki je tukaj nismo uporabili, je vrsta IMAGE za oznako . Lahko se uporabi kot alternativna metoda oddaje obrazca. Vendar pa je vrsta IMAGE redko združljiva z besedilnimi in manj odzivnimi brskalniki, zato se ji je pametno izogniti, razen če je na vašem spletnem mestu veliko grafike.

Ko se naučite osnov obrazcev HTML, se lahko začnete učiti o samem CGI.

Specifikacija CGI

Torej, kaj točno je "nabor pravil", ki omogoča programu CGI v, recimo, Batavii, Illinois, da komunicira s spletnim brskalnikom v Zunanji Mongoliji? Uradno specifikacijo CGI, skupaj z množico drugih informacij o CGI, lahko najdete na strežniku NCSA na http://hoohoo . ncsa.uluc.edu/cgi/. Vendar to poglavje obstaja prav zaradi tega, da vam ni treba dolgo potovati in ga sami iskati.

Obstajajo štirje načini, na katere CGI posreduje podatke med okvirjem CGI-npor in spletnim strežnikom ter s tem spletnim odjemalcem:

  • Spremenljivke okolja.
  • Ukazna vrstica.
  • Standardna vhodna naprava.
  • Standardna izhodna naprava.

S temi štirimi metodami strežnik posreduje vse podatke, ki jih odjemalec pošlje programu CGI. Program CGI nato naredi svojo čarovnijo in pošlje izhod nazaj na strežnik, ki ga posreduje odjemalcu.

Ti podatki temeljijo na strežniku HTTP Apache. Apache je najpogostejši spletni strežnik, ki deluje na skoraj vseh platformah, vključno z Windows 9x in Windows NT. Lahko pa veljajo za vse strežnike HTTP, ki podpirajo CGI. Nekateri lastniški strežniki, kot sta strežnika Microsoft in Netscape, imajo lahko dodatne funkcije ali delujejo nekoliko drugače. Ker se podoba spleta še naprej spreminja z neverjetno hitrostjo, se standardi še vedno razvijajo in nedvomno bo prišlo do sprememb v prihodnosti. Ko pa gre za CGI, se zdi, da je tehnologija uveljavljena – za ceno, da jo nadomestijo druge tehnologije, kot so programčki. Vsi programi CGI, ki jih napišete z uporabo teh informacij, bodo skoraj zagotovo lahko delovali več let na večini spletnih strežnikov.

Ko je program CGI priklican prek obrazca, najpogostejšega vmesnika, brskalnik pošlje strežniku dolg niz, ki se začne s potjo do programa CGI in njegovim imenom. Temu sledijo različni drugi podatki, imenovani informacije o poti, ki se posredujejo programu CGI prek spremenljivke okolja PATH_INFO (slika 9-1). Informacijam o poti sledi znak »?«, ki mu sledijo podatki obrazca, ki se pošljejo strežniku z metodo HTTP GET. Ti podatki so na voljo programu CGI prek spremenljivke okolja QUERY_STRING. Vsi podatki, ki jih stran pošlje z metodo HTTP POST, ki je najpogosteje uporabljena metoda, bodo posredovani programu CGI prek standardne vhodne naprave. Tipičen niz, ki ga lahko strežnik prejme od brskalnika, je prikazan na sliki. 9-1. Ime programa formread v katalogu cgi-bin kliče strežnik z dodatnimi informacijami o poti dodatne/informacije in izbira=podatki o zahtevi za pomoč - verjetno kot del izvirnega URL-ja. Končno se sami podatki obrazca (besedilo "programiranje CGI" v polju "ključne besede") pošljejo prek metode HTTP POST.

Spremenljivke okolja

Ko strežnik zažene program CGI, mu najprej posreduje nekaj podatkov za izvajanje v obliki spremenljivk okolja. Specifikacija uradno opredeljuje sedemnajst spremenljivk, vendar se jih veliko več uporablja neformalno prek spodaj opisanega mehanizma, imenovanega HTTP_/nec/zams/n. CGI program

ima dostop do teh spremenljivk na enak način kot katera koli spremenljivka okolja lupine, ko se zažene iz ukazne vrstice. V lupinskem skriptu je na primer do spremenljivke okolja F00 mogoče dostopati kot $F00; v Perlu je ta klic videti kot $ENV("F00"); v C - getenv("F00"); itd. Tabela 9-1 navaja spremenljivke, ki jih vedno nastavi strežnik - tudi če so ničelne. Poleg teh spremenljivk so podatki, ki jih odjemalec vrne v glavi zahteve, dodeljeni spremenljivkam v obliki HTTP_F00, kjer je F00 ime glave. Na primer, večina spletnih brskalnikov vključuje informacije o različici v glavi, imenovani USEfl_AGENT. Vaš CGI-npor-ramma lahko pridobi te podatke iz spremenljivke HTTP_USER_AGENT.

Tabela 9-1.Spremenljivke okolja CGI

Spremenljivka okolja

Opis

CONTENT_LENGTH

Dolžina podatkov, prenesenih z metodama POST ali PUT, v bajtih.

CONTENT_TYPE

Vrsta MIME podatkov, priloženih z metodama POST ali PUT.

GATEWAY_INTERFACE

Številka različice specifikacije CGI, ki jo podpira strežnik.

PATH_INFO

Dodatne informacije o poti, ki jih pošlje stranka. Na primer za zahtevo http://www.myserver.eom/test.cgi/this/is/a/ pot?polje=zeleno vrednost spremenljivke PATH_ INFO bo /to/je/pot.

PATH_TRANSLATED

Enako kot PATH_INFO, vendar strežnik ustvari vse


Možen prevod, na primer razširitve imena, kot je "-račun". »

QUERY_STRING

Vsi podatki, ki sledijo "?" v URL. To so tudi podatki, posredovani, ko je REQ-UEST_METHOD obrazca GET.

REMOTE_ADDR

IP naslov odjemalca, ki je poslal zahtevo.

REMOTE_HOST

Ime gostitelja odjemalskega računalnika, če je na voljo.

REMOTE_IDENT

Če spletni strežnik in odjemalec podpirata identifikacijo vrste identd potem je to uporabniško ime računa, ki postavlja zahtevo.

REQUEST_METHOD

Metoda, ki jo stranka uporablja za izdelavo zahteve. Za programe CGI, ki jih bomo ustvarili, bo to običajno POST ali GET.

SERVER_NAME Ime gostitelja - ali naslov IP, če ime ni na voljo - računalnika, ki izvaja spletni strežnik.
SERVER_PORT Številka vrat, ki jih uporablja spletni strežnik.
SERVER_PROTOCOL
Protokol, ki ga odjemalec uporablja za komunikacijo s strežnikom. V našem primeru je ta protokol skoraj vedno HTTP.
SERVER_SOFTWARE Informacije o različici spletnega strežnika, ki izvaja program CGI.

SCRIPT_NAME

Pot do skripta za zagon, kot ga določi odjemalec. Lahko se uporablja, ko se URL nanaša na samega sebe in tako, da se lahko skripti, navedeni na različnih lokacijah, izvajajo različno, odvisno od lokacije.

Tukaj je primer skripta CGI Perl, ki natisne vse spremenljivke okolja, ki jih je nastavil strežnik, kot tudi vse podedovane spremenljivke, kot je PATH, ki jih je nastavila lupina, ki je zagnala strežnik.

#!/usr/bin/perl -w

tiskanje<< HTML;

Vrsta vsebine: besedilo/html\n\n

<р>Spremenljivke okolja

HTML

foreach (tipke %ENV) ( print "$_: $ENV($_)
\n";)

tiskanje<

HTML

Vse te spremenljivke lahko vaš program CGI uporablja in celo spreminja. Vendar te spremembe ne vplivajo na spletni strežnik, ki izvaja program.

Ukazna vrstica

CGI omogoča, da se argumenti posredujejo programu CGI kot parametri ukazne vrstice, kar se redko uporablja. Uporablja se redko, ker je njegovih praktičnih uporab malo, zato se o njem ne bomo podrobneje ukvarjali. Bistvo je, da če spremenljivka okolja QUERY_STRING ne vsebuje znaka "=", se bo program CGI izvedel s parametri ukazne vrstice, vzetimi iz QUERY_STRING. na primer http://www.myserver.com/cgi- bin/finger?root bo zagnal prstni koren www.myserver.com.

Obstajata dve glavni knjižnici, ki nudita vmesnik CGI za Perl. Prvi je cgi-lib.pl Pripomoček cgi-lib.pl zelo pogosta, ker je bila dolgo časa edina razpoložljiva velika knjižnica. Zasnovan je za delo v Perlu 4, deluje pa tudi v Perlu 5. Druga knjižnica, CGI.pm, novejši in v marsičem boljši cgi-lib.pl. CGI.pm napisan za Perl 5 in uporablja popolnoma objektno usmerjeno zasnovo za delo s podatki CGI. Modul CGI.pm razčleni standardno vhodno napravo in spremenljivko QUERY_STRING ter shrani podatke v objekt CGI. Vaš program mora samo ustvariti nov objekt CGI in uporabiti preproste metode, kot je paramQ, da pridobi podatke, ki jih potrebujete. Primer 9-2 služi kot kratek prikaz, kako CGI.pm interpretira podatke. Vsi primeri Perla v tem poglavju bodo uporabljali CGI.pm.

Primer 9-2. Razčlenjevanje podatkov CGI v Perlu

#!/usr/bin/perl -w

uporabite CGI qw(:standard);

# Uporabljen je modul CGI.pm. qw(:standard) uvozi

# imenski prostor standardnih funkcij CGI, ki jih je treba pridobiti

# jasnejša koda. To je mogoče storiti, če je v scenariju

# uporabljen je samo en objekt CGI.

$mycgi = nov CGI; #Ustvarite objekt CGI, ki bo prehod do podatkov obrazca

@polja = $mycgi->param; # Pridobi imena vseh izpolnjenih polj obrazca

tiskanje glave, start_html("test CGI.pm"); ft Metodi "header" in "start_html",

# zagotovljeno

# CGI.pm, olajšajte pridobivanje HTML.

# "header" izpiše zahtevano glavo HTTP, a

#"start_html" izpiše glavo HTML z danim imenom,

#a je tudi oznaka .

natisni"<р>Podatki obrazca:
";

foreach (@fields) ( print $_, ":",- $mycgi->param($_), "
"; }

# Za vsako polje natisnite ime in vrednost, pridobljeno z uporabo

# $mycgi->param("ime polja").

natisni konec_html; # Okrajšava za prikaz končnih oznak "".

Obdelava vhodnih podatkov v C

Ker sta osnovna API-ja za MySQL in mSQL napisana v jeziku C, ne bomo popolnoma opustili jezika C v korist Perla, vendar bomo navedli nekaj primerov jezika C, kjer je primerno. Obstajajo tri široko uporabljene knjižnice C za programiranje CGI: cgic Tom Boutell*; cgihtml Eugene Kim in libcgi iz EIT*. To verjamemo cgic je najbolj popoln in enostaven za uporabo. Kar pa mu manjka, je zmožnost seznama vseh spremenljivk obrazca, če jih ne poznate vnaprej. Pravzaprav ga je mogoče dodati s preprostim popravkom, vendar to presega obseg tega poglavja. Zato v primeru 9-3 uporabljamo knjižnico cgihtml, ponovite zgornji skript Perl v C.

Primer 9-3.Razčlenjevanje podatkov CGI v C

/* cgihtmltest.c - Tipičen CGI program za prikaz ključev in njihovih vrednosti

iz podatkov prejetih iz obrazca */

#vključi

#include "cgi-lib.h" /* To vsebuje vse definicije funkcij CGI */

#include "html-lib.h" /* To vsebuje "vse definicije funkcij pomoči HTML */

void print_all(lllist 1)

/* Te funkcije izpišejo podatke, ki jih predloži obrazec, v isti obliki kot zgornji skript Perl. Cgihtml nudi tudi vgrajeno funkcijo

Print_entries(), ki naredi isto stvar z uporabo oblike seznama HTML. */ (

okno vozlišča*;

/* Vrsta "vozlišča" je definirana v knjižnici cgihtml in se nanaša na povezan seznam, ki shranjuje vse podatke obrazca. */

okno = I.glava; /* Nastavi kazalec na začetek podatkov obrazca */

medtem ko (okno != NULL) ( /* Skozi povezani seznam do zadnjega (prvega praznega) elementa */

printf(" %s:%s
\n",window->entry. name,replace_ltgt(window->entry.value));

/* Izpis podatkov. Replace__ltgt() je funkcija, ki razume kodiranje HTML besedila in zagotavlja, da je pravilno prikazano brskalniku odjemalca. */

okno = okno->naprej; /* Premakni se na naslednji element seznama. */

} }

int main() (

seznam vnosov; /* Kazalec na razčlenjene podatke*/

int stanje; /* Celo število, ki predstavlja status */

Html__header(); /* Pomožna funkcija HTML, ki izpiše glavo HTML*/

Html_begin("test cgihtml");

/* Pomožna funkcija HTML, ki natisne začetek strani HTML z navedenim naslovom. */

status = read_cgi_input(&vnosi); /* Vnese in razčleni podatke obrazca*/

Printf("<р>Podatki obrazca:
");

Natisni_vse(vnose); /* Pokliče zgoraj definirano funkcijo print_all(). */

html_end(); /* Pomožna funkcija HTML, ki natisne konec strani HTML. */

List_clear(&vnosi); /* Sprosti pomnilnik, ki ga zasedajo podatki obrazca. */

vrni 0; )

Standardna izhodna naprava

Podatke, ki jih program CGI pošlje standardni izhodni napravi, prebere spletni strežnik in jih pošlje odjemalcu. Če se ime skripta začne z nph-, potem se podatki pošljejo neposredno odjemalcu brez posredovanja spletnega strežnika. V tem primeru mora program CGI ustvariti pravilno glavo HTTP, ki jo bo odjemalec razumel. V nasprotnem primeru naj spletni strežnik namesto vas ustvari glavo HTTP.

Tudi če ne uporabljate nph-scenarij, mora strežnik dobiti eno direktivo, ki mu bo povedala informacije o vašem izhodu. To je običajno glava HTTP Content-Type, lahko pa je tudi glava Location. Glavi mora slediti prazna vrstica, to je podajanje vrstice ali kombinacija CR/LF.

Glava Content-Type pove strežniku, kakšno vrsto podatkov proizvaja vaš program CGI. Če je to stran HTML, mora biti niz Content-Type: besedilo/html. Glava lokacije pove strežniku drug URL - ali drugo pot na istem strežniku - kam naj usmeri odjemalca. Glava bi morala izgledati takole: Lokacija: http:// www. moj strežnik. com/drugo/mesto/.

Po glavah HTTP in prazni vrstici lahko pošljete dejanske podatke, ki jih ustvari vaš program – stran HTML, sliko, besedilo ali karkoli drugega. Med programi CGI, ki so priloženi strežniku Apache, so nph-test-cgi in test-cgi ki lepo prikazujejo razliko med naslovi v slogu nph in ne-nph.

V tem razdelku bomo uporabljali knjižnice CGI.pm in cgic, ki imajo funkcije za izpis glav HTTP in HTML. Tako se boste lahko osredotočili na prikaz dejanske vsebine. Te pomožne funkcije so uporabljene v primerih, navedenih prej v tem poglavju.

Pomembne lastnosti skriptov CGI

V bistvu že veste, kako deluje CGI. Odjemalec pošlje podatke, običajno prek obrazca, na spletni strežnik. Strežnik izvaja program CGI in mu posreduje podatke. Program CGI obdela svojo obdelavo in vrne svoje rezultate strežniku, ki jih posreduje odjemalcu. Od razumevanja, kako okvirji CGI npor delujejo, moramo preiti na razumevanje, zakaj se tako pogosto uporabljajo.

Čeprav iz tega poglavja že veste dovolj, da lahko sestavite preprost delujoč program CGI, morate obravnavati še nekaj pomembnih vprašanj, preden lahko ustvarite dejansko delujoče programe za MySQL ali mSQL. Najprej se morate naučiti delati z več obrazci. Nato se morate naučiti nekaterih varnostnih ukrepov, ki bodo napadalcem preprečili nezakonit dostop do vaših strežniških datotek ali njihovo uničenje.

Shranjevanje stanja

Spominjanje stanja je bistveno sredstvo za zagotavljanje dobre storitve vašim uporabnikom in ne samo za boj proti zadrtim kriminalcem, kot se morda zdi. Težavo povzroča dejstvo, da je HTTP tako imenovani "memoryless" protokol. To pomeni, da odjemalec pošlje podatke strežniku, strežnik vrne podatke odjemalcu, potem pa gre vsak svojo pot. Strežnik ne shranjuje podatkov o stranki, ki bi lahko bili potrebni pri nadaljnjih operacijah. Prav tako ni nobenega zagotovila, da bo naročnik obdržal kakršne koli podatke o transakciji, ki bi jih lahko kasneje uporabil. To takoj in znatno omeji uporabo svetovnega spleta.

Skriptiranje CGI s tem protokolom je podobno, kot da si ne bi mogli zapomniti pogovora. Kadarkoli se z nekom pogovarjate, ne glede na to, kako pogosto ste se z njim pogovarjali prej, se morate predstaviti in poiskati skupno temo za pogovor. Ni treba razlagati, da to ne prispeva k produktivnosti. Slika 9-2 prikazuje, da kadar koli zahteva doseže program CGI, je to povsem nov primerek programa, brez povezave s prejšnjim.

Na strani odjemalca se je s prihodom Netscape Navigatorja pojavila na videz na hitro narejena rešitev, imenovana piškotki. Sestoji iz ustvarjanja nove glave HTTP, ki se lahko pošilja naprej in nazaj med odjemalcem in strežnikom, podobno kot glava Content-Type in Location. Brskalnik odjemalca mora po prejemu glave piškotka shraniti podatke v piškotek ter ime domene, v kateri piškotek deluje. Potem, ko se obišče URL znotraj podane domene, mora biti glava piškotka vrnjena strežniku za uporabo s programi CGI na tem strežniku.

Metoda piškotkov se uporablja predvsem za shranjevanje ID-ja uporabnika. Podatke o obiskovalcu lahko shranite v datoteko na strežniškem računalniku. Enolični ID tega uporabnika se lahko pošlje kot piškotek uporabnikovemu brskalniku, nato pa vsakič, ko uporabnik obišče spletno mesto, brskalnik samodejno pošlje ta ID strežniku. Strežnik ID posreduje programu CGI, ki odpre ustrezno datoteko in pridobi dostop do vseh podatkov o uporabniku. Vse to se zgodi neopazno za uporabnika.

Kljub uporabnosti te metode je večina velikih spletnih mest ne uporablja kot edino sredstvo za pomnjenje stanja. Razlogov za to je več. Prvič, vsi brskalniki ne podpirajo piškotkov. Do nedavnega glavni brskalnik za osebe z omejenim vidom (da o osebah z nezadostno hitrostjo internetne povezave niti ne govorimo) – Lynx – ni podpiral piškotkov. Še vedno jih "uradno" ne podpira, čeprav nekatere njegove široko dostopne "stranske veje" podpirajo. Drugič, kar je še pomembneje, piškotki uporabnika vežejo na določen stroj. Ena od velikih prednosti spleta je, da je dostopen od kjerkoli na svetu. Ne glede na to, kje je bila vaša spletna stran ustvarjena ali shranjena, jo je mogoče prikazati s katerega koli računalnika, povezanega z internetom. Vendar, če poskušate dostopati do spletnega mesta, ki podpira piškotke, z računalnika nekoga drugega, bodo vsi vaši osebni podatki, ki jih hrani piškotek, izgubljeni.

Številna spletna mesta še vedno uporabljajo piškotke za prilagajanje uporabniških strani, vendar jih večina dopolnjuje s tradicionalnim vmesnikom v slogu prijave/gesla. Če se na stran dostopa iz brskalnika, ki ne podpira piškotkov, se na strani nahaja obrazec, v katerega uporabnik vnese uporabniško ime in geslo, ki sta mu bila dodeljena ob prvem obisku strani. Običajno je ta obrazec majhen in nezahteven, da ne prestraši večine uporabnikov, ki jih ne zanima nobena personalizacija, ampak preprosto želijo iti naprej. Ko uporabnik vnese prijavno ime in geslo v obrazec, CGI najde datoteko s podatki o tem uporabniku, kot da bi bilo ime poslano s piškotkom. S to metodo se lahko uporabnik registrira na prilagojenem spletnem mestu kjerkoli na svetu.

Poleg nalog upoštevanja uporabniških preferenc in dolgoročnega shranjevanja informacij o njem lahko damo bolj subtilen primer pomnjenja stanja, ki ga ponujajo priljubljeni iskalniki. Ko iščete s storitvami, kot sta AltaVista ali Yahoo, boste običajno dobili veliko več rezultatov, kot jih je mogoče prikazati v lahko berljivi obliki. To težavo rešimo tako, da prikažemo majhno število rezultatov - običajno 10 ali 20 - in omogočimo navigacijo za ogled naslednje skupine rezultatov. Medtem ko se to vedenje povprečnemu spletnemu brskalcu zdi normalno in pričakovano, je dejanska implementacija netrivialna in zahteva shranjevanje stanja.

Ko uporabnik prvič izvede poizvedbo v iskalniku, ta zbere vse rezultate, morda omejene na neko vnaprej določeno mejo. Trik je v tem, da ustvarite te rezultate v majhnih količinah naenkrat, pri tem pa se spomnite, kakšen uporabnik je zahteval te rezultate in kakšen delež pričakuje naslednji. Če pustimo ob strani kompleksnost samega iskalnika, se srečujemo s problemom doslednega zagotavljanja uporabniku nekaterih informacij na eni strani. Razmislite o primeru 9-4, ki prikazuje skript CGI, ki natisne deset vrstic datoteke in ji daje možnost ogleda naslednjih ali prejšnjih deset vrstic.

Primer 9-4. Shranjevanje stanja v skriptu CGI

#!/usr/bin/perl -w

uporabite CGI;

Open(F,"/usr/dict/words") ali die("Ne more odpreti! $!");

#To je datoteka, ki bo prikazana, lahko je karkoli.

$output = nov CGI;

sub print_range ( # To je glavna funkcija programa, moj $start = shift;

# Začetna vrstica datoteke, my $count = 0;

# Kazalec, moja $line = "";

# Trenutna vrstica datoteke, natisnite $output->header,

$output->start_html("Moj slovar");

# Izdela HTML z naslovom "Moj slovar", natisni " \n";

medtem ko (($count< $start) and ($line = )) ($count++;)

# Preskoči vse vrstice pred prvo, medtem ko (($count< $start+10) and ($line ? )) ( print $line; $count++; )

# Natisnite naslednjih 10 vrstic.

moj $newnext = $start+10; moj $newprev = $start-10;

# Nastavite začetne nize za »Naslednji« in »Prejšnji« URL-je,

natisni"

";

unless ($start == 0) ( # Vključi "Prejšnji" URL, razen če

# ni več na začetku.

natisni qq%Prejšnji%; )

unless (eof) ( # Vključite "Naslednji" URL, razen če # ne na koncu datoteke.

natisni qq%Naprej%;

}

natisni "HTML;HTML

izhod(0); )

# Če ni podatkov, začni znova,

if (ne $output->param) (

&print_obseg(0); )

# V nasprotnem primeru začnite od vrstice, navedene v podatkih.

&print_range($output->param("start"));

V tem primeru je stanje shranjeno z uporabo najenostavnejše metode. S shranjevanjem podatkov ni težav, saj jih hranimo v datoteki na strežniku. Vedeti moramo le, kje začeti izhod, zato skript preprosto vključi v URL začetno točko za naslednjo ali prejšnjo skupino vrstic – vse, kar je potrebno za ustvarjanje naslednje strani.

Vendar, če potrebujete več kot le možnost listanja po datoteki, je lahko zanašanje na URL okorno. To težavo lahko ublažite z uporabo obrazca HTML in vključitvijo podatkov o stanju v oznake tip SKRITO. Ta metoda je bila uspešno uporabljena na številnih spletnih mestih, kar omogoča vzpostavitev povezav med povezanimi programi CGI ali razširitev uporabe enega samega programa CGI, kot v prejšnjem primeru. Namesto da kažejo na določen objekt, kot je domača stran, lahko podatki URL kažejo na samodejno ustvarjen ID uporabnika.

Tako delujejo AltaVista in drugi iskalniki. Prvo iskanje ustvari ID uporabnika, ki je skrit v zakulisju naslednjih URL-jev. S tem ID-jem je povezana ena ali več datotek, ki vsebujejo rezultate poizvedbe. URL vključuje še dve vrednosti: vaš trenutni položaj v datoteki z rezultati in smer, v katero želite nadaljevati v njej. Te tri vrednosti so vse, kar je potrebno za delovanje močnih navigacijskih sistemov velikih iskalnikov.

Vendar pa še vedno nekaj manjka. Datoteka, uporabljena v našem primeru /usr/diet/words zelo velik. Kaj pa, če na polovici branja obupamo, a se želimo k njej vrniti pozneje? Če se ne spomnite URL-ja naslednje strani, se ne morete vrniti nazaj, niti AltaVista tega ne bo dovolila. Če znova zaženete računalnik ali uporabite drug računalnik, se ne boste mogli vrniti na prejšnje rezultate iskanja brez ponovnega vnosa iskanja. Vendar pa je ta dolgoročna shramba stanja v središču personalizacije spletnega mesta, o kateri smo govorili zgoraj, in vredno je pogledati, kako jo je mogoče uporabiti. Primer 9-5 je spremenjena različica primera 9-4.

Primer 9-5. Stabilno pomnjenje stanja

#!/usr/bin/perl -w

uporabite CGI;

umask 0;

Open(F,"/usr/dict/words") ali die("Ne more odpreti! $!");

Chdir("uporabniki") ali die("Ne morem iti v imenik $!");

# To je imenik, kjer bodo shranjeni vsi podatki

# o uporabniku.

Izhod = nov CGI;

if (not$output->param) (

natisni $output->header,

$output->start_html("Moj slovar");

natisni "HTML;


<р>Vnesite svoje uporabniško ime:


HTML

izhod(0); )

$user = $output->param("uporabniško ime");

## Če ni uporabniške datoteke, jo ustvarite in namestite

## začetna vrednost je "0",

če (ne -e "$uporabnik") (

open (U, ">$user") ali die("Ne morem odpreti! $!");

natisni U "0\n";

zapri U;

&print_range("0");

## če uporabnik obstaja in ni določen v URL-ju

## začetna vrednost, preberite zadnjo vrednost in začnite od tam.

) elsif (ne $output->param("start")) (

Open(U,"User") ali die("Ne morem odpreti uporabnika! $!");

$start = ; zapri U;

chomp $starl;

uprint obseg ($start);

## Če uporabnik obstaja in ni določen v URL-ju

## začetna vrednost, zapišite začetno vrednost

## v uporabniško datoteko in začnite izpis.

) sicer (

Open(U,">$user") ali die("Ne morem odpreti uporabnika za pisanje! $!");

natisni U $output->param("start"), "\n";

zapri U;

&print_range($output->param("start 1)); )

subprint_obseg(

moj $start = shift;

moj $count = 0;

moja $line = " "

natisni $output->header,

$output->start_html(" Moj slovar ");

natisni"

\n"; 

medtem ko (($count< $start) and ($line = )) ($count++;)

medtem ko (($count< $start+10) and ($line = ))

natisni $line; $count++;

moj $newnext = $start+10;

moj $newprev = $start-10;

natisni"

razen če (Sstart == 0)

{

tiskanje

qq %

Prejšnji %;

}

razen če (eof) ( print qq% Next%;

# Upoštevajte, da je uporabniško ime "uporabniško ime" dodano URL-ju.

# V nasprotnem primeru bo CGI pozabil, s katerim uporabnikom je imel opravka.

}

natisni $output->end_html;

izhod (0") ;

}

Varnostni ukrepi

Pri upravljanju internetnih strežnikov, ne glede na to, ali gre za HTTP ali druge vrste strežnikov, je varnost kritična skrb. Izmenjava podatkov med odjemalcem in strežnikom poteka znotraj

CGI odpira številna pomembna vprašanja v zvezi z varstvom podatkov. Sam protokol CGI je precej varen. Program CGI prejema podatke s strežnika prek standardnih vhodnih ali okoljskih spremenljivk, ki sta varni metodi. Ko pa ima program CGI nadzor nad podatki, ni nobenih omejitev glede tega, kaj lahko počne. Slabo napisan program CGI bi lahko napadalcu omogočil dostop do strežniškega sistema. Razmislite o naslednjem primeru programa CGI:

#!/usr/bin/perl -w

uporabite CGI;

moj $output = nov CGI;

moje $uporabniško ime = $output»param("uporabniško ime");

natisni $output->header, $output->start_html("Finger Output"),

"

", "prst $uporabniško ime", "
", $output->end_html;

Ta program zagotavlja veljaven vmesnik CGI za ukaz prst.Če zaženete program preprosto kot finger.cgi, prikazal bo seznam vseh trenutnih uporabnikov na strežniku. Če ga vodite kot finger.cgi?username=fred, potem bo prikazal informacije o uporabniku "fred" na strežniku. Lahko ga celo vodite kot prst. cgi?userna-me=bob@f oo.com za prikaz informacij o oddaljenem uporabniku. Vendar, če ga vodite kot finger.cgi?username=fred; [e-pošta zaščitena] Lahko se zgodijo nezaželene stvari. Operator hrbtne poteze """" v Perlu sproži lupinski proces in izvede ukaz, ki vrne rezultat. V tem programu " prst $uporabniško ime* se uporablja kot preprost način za izvajanje prstnega ukaza in pridobivanje njegovega izhoda. Vendar vam večina ukaznih procesorjev omogoča kombiniranje več ukazov v eni vrstici. Na primer, kateri koli procesor, kot je procesor Bourne, to stori z uporabo simbola "; " Zato"finger fred;mail [e-pošta zaščitena] bo prvi zagnal ukaz prst, in nato ukaz pošta [e-pošta zaščitena] ki lahko pošlje celotno datoteko z geslom strežnika nezaželenemu uporabniku.

Ena rešitev je razčlenitev podatkov obrazca za iskanje zlonamerne vsebine. Lahko, recimo, poiščete simbol ";" in izbrišite vse znake, ki sledijo. Tak napad je mogoče onemogočiti z alternativnimi metodami. Zgornji program CGI je mogoče prepisati na naslednji način:

#!/usr/local/bin/perl -w

uporabite CGI;

moj $output = nov CGI;

moje $uporabniško ime = $output->param("uporabniško ime");

$|++;

# Onemogočite medpomnjenje, da pošljete vse podatke odjemalcu,

print $output->header, $putput->start_html("Finger Output"), "

\n"; 

$pid = open(C_OUT, "-|");# Ta idiom Perla sproži podrejeni proces in odpre

# kanal med nadrejenimi in podrejenimi procesi,

if ($pid) (# To je nadrejeni proces.

tiskanje ; ft Natisnite izhod podrejenega procesa.

natisni"

", $output->end_html;

izhod (O); ft Končajte program. )

elsif (definiran $pid) ( # To je podrejeni proces.

$|++; # Onemogoči medpomnjenje.

exec("/usr/bin/finger",$uporabniško ime) ali die("klic exec() ni uspel.");

# Izvede prstni program z uporabniškim imenom kot edinim
# argument ukazne vrstice. ) else ( die("fork() ni uspelo"); )

# Preverjanje napak.

Kot lahko vidite, to ni veliko bolj zapleten program. Če pa ga vodiš kot finger.cgi?username=fred; [e-pošta zaščitena] nato se bo prstni program izvedel z argumentom fred;pošta [e-pošta zaščitena] kot eno uporabniško ime.

Kot dodaten varnostni ukrep ta skript izvaja finger izrecno kot /usr/bin/finger. V malo verjetnem primeru, da spletni strežnik vašemu programu CGI posreduje neobičajno POT, lahko zagon samo s prstom povzroči izvedbo napačnega programa. Drug varnostni ukrep, ki ga lahko sprejmete, je pregled spremenljivke okolja PATH in zagotovitev, da ima sprejemljivo vrednost. Dobro je, da odstranite trenutni delovni imenik iz PATH, razen če ste prepričani, da ni tako, da morate dejansko izvesti program v njem.

Drug pomemben varnostni vidik se nanaša na pravice uporabnikov. Spletni strežnik privzeto izvaja program CGI s pravicami uporabnika, ki je zagnal sam strežnik. To je običajno psevdouporabnik, kot je "nihče", ki ima omejene pravice, zato ima tudi program CGI malo pravic. To je običajno dobra stvar, kajti če lahko napadalec pridobi dostop do strežnika prek programa CGI, ne bo mogel narediti veliko škode. Primer programa za krajo gesel kaže, kaj je mogoče storiti, vendar je dejanska škoda za sistem običajno omejena.

Vendar delovanje kot omejen uporabnik prav tako omejuje zmogljivosti CGI. Če mora program CGI brati ali pisati datoteke, lahko to stori le, če ima tako dovoljenje. Na primer, v drugem primeru shranjevanja stanja se datoteka vzdržuje za vsakega uporabnika. Program CGI mora imeti dovoljenje za branje in pisanje v imeniku, ki vsebuje te datoteke, da ne omenjamo samih datotek. To lahko storite tako, da ustvarite imenik kot isti uporabnik kot strežnik, z dovoljenji za branje in pisanje samo za tega uporabnika. Vendar pa ima za uporabnika, kot je "nihče", to možnost samo root. Če niste superuporabnik, boste morali ob vsaki spremembi CGI komunicirati s sistemskim skrbnikom.

Drug način je omogočiti imenik za prosto branje in pisanje, s čimer v bistvu odstranimo vso zaščito z njega. Ker je do teh datotek mogoče dostopati samo iz zunanjega sveta prek vašega programa, nevarnost ni tako velika, kot se morda zdi. Če pa se v programu odkrije napaka, bo imel oddaljeni uporabnik popoln dostop do vseh datotek, vključno z možnostjo, da jih uniči. Poleg tega bodo zakoniti uporabniki, ki se izvajajo na strežniku, prav tako lahko spreminjali te datoteke. Če boste uporabili to metodo, morajo biti vsi uporabniki strežnika vredni zaupanja. Prav tako uporabite odprti imenik samo za datoteke, ki jih potrebuje program CGI; z drugimi besedami, ne ogrožajte nepotrebnih datotek.

Če se prvič ukvarjate s programiranjem CGI, obstaja več načinov, ki jih lahko nadaljujete z raziskovanjem. Na to temo je bilo napisanih na desetine knjig, od katerih mnoge ne predvidevajo nobenega znanja o programiranju. "Programiranje CGI na svetovnem spletu" izdal O"Reilly and Associates, zajema gradivo od preprostih pisav v različnih jezikih do resnično neverjetnih trikov in trikov. Javne informacije so na voljo tudi v izobilju na WWW. Dober kraj za začetek je CGI je zelo enostavno(Res samo o CGI) pri http://www.jmarshall.com/easy/cgi/ .

CGI in baze podatkov

Od začetka dobe interneta so baze podatkov vplivale na razvoj svetovnega spleta. V praksi veliko ljudi gleda na splet kot na eno samo ogromno podatkovno zbirko multimedijskih informacij.

Iskalniki so vsakdanji primer prednosti baz podatkov. Iskalnik se ne odpravi po celem internetu in išče ključne besede v trenutku, ko jih vprašate. Namesto tega razvijalci spletnih mest uporabljajo drugo programsko opremo za ustvarjanje velikanskega indeksa, ki služi kot zbirka podatkov, iz katere iskalnik pridobiva vnose. Baze podatkov shranjujejo informacije v obliki, ki omogoča hitro iskanje z naključnim dostopom.

Ker so podatkovne baze tekoče, dajejo spletu še večjo moč: postanejo potencialni vmesnik za karkoli. Administracija sistema se lahko na primer izvaja na daljavo prek spletnega vmesnika, namesto da bi se skrbnik moral prijaviti v želeni sistem. Povezovanje baz podatkov s spletom je v središču nove ravni interaktivnosti na internetu.

Eden od razlogov za redno povezovanje baz podatkov s spletom se pojavlja: veliko svetovnih informacij je že v bazah podatkov. Baze podatkov, ki so nastale pred spletom, se imenujejo podedovane baze podatkov (v nasprotju z bazami podatkov, ki niso povezane s spletom, ustvarjenimi pred kratkim, kar bi morali imenovati "slaba ideja"). Številne korporacije (in celo posamezniki) se zdaj soočajo z izzivom zagotavljanja dostopa do teh podedovanih baz podatkov prek spleta. Razen če je vaša podedovana baza podatkov MySQL ali mSQL, ta tema presega obseg te knjige.

Kot že rečeno, le vaša domišljija lahko omeji možnosti komunikacije med bazami podatkov in spletom. Trenutno je na spletu dostopnih na tisoče edinstvenih in uporabnih baz podatkov. Vrste baz podatkov, ki delujejo zunaj teh aplikacij, se zelo razlikujejo. Nekateri od njih uporabljajo programe CGI kot vmesnik do strežnika baze podatkov, kot sta MySQL ali mSQL. Te vrste so za nas najbolj zanimive. Drugi uporabljajo komercialne aplikacije za vmesnik s priljubljenimi namiznimi bazami podatkov, kot sta Microsoft Access in Claris FileMaker Pro. Drugi preprosto delajo s ploščatimi besedilnimi datotekami, ki so najpreprostejše možne zbirke podatkov.

Z uporabo teh treh vrst baz podatkov lahko razvijete uporabna spletna mesta katere koli velikosti ali zahtevnosti. Eden od naših ciljev v naslednjih nekaj poglavjih bo uporaba moči MySQL mSQL v spletu z uporabo programiranja CGI.

Stran 1 od 30

Danes so stvari, kot so knjiga gostov, iskanje po strežniku in obrazec za pošiljanje sporočil, sestavni atribut skoraj vsake resne spletne strani. Problem uvajanja teh in drugih zvončkov seveda na vse možne načine vzbuja domišljijo začetnika spletnega skrbnika, mu odvzema spanec, apetit in željo po pivu. Na žalost preučevanje virov HTML strani konkurentov ne daje ničesar drugega kot povezave do določenega "cgi-bin", v novičarskih skupinah pa se včasih omenjajo nekateri cgi skripti. Ta članek je posvečen osnovam uporabe istih skriptov CGI za slavo in blaginjo vašega spletnega mesta.

Za začetek mislim, da moramo razumeti koncepte. Skript CGI je program, ki se izvaja na spletnem strežniku na zahtevo odjemalca (to je obiskovalca spletnega mesta). Ta program se v bistvu ne razlikuje od običajnih programov, ki so nameščeni na vašem računalniku - naj bo to MS Word ali igra Quake. CGI ni programski jezik, v katerem je skript napisan, ampak je Common Gateway Interface poseben vmesnik, prek katerega se skript zažene in z njim komunicira.

Kratka digresija o CGI

Kaj je torej? CGI- skripte in podobne stvari nasploh. Začnimo z dejstvom, da vaš brskalnik (ko ste tipkali URL) povezuje prek protokola HTTP z navedenim strežnikom in ga vpraša za zahtevano datoteko, nekaj takega:

GET /~paaa/cgi-bin/guestbbok.cgi HTTP/1.0-To je najpomembnejša stvar v zahtevi

No, če je na primer zahtevana preprosta datoteka .htmlče taka datoteka obstaja, bo strežnik poslal brskalniku odgovor:

HTTP/1.0 200 V redu
Vrsta vsebine: besedilo/html

Nadalje za prazno vrstico (potrebno je ločiti naslov od telo) informacije prihajajo iz URL"A ...
To je v bistvu vse WWW...greš od povezave do povezave....
Kaj pa, če morate temu dolgočasnemu procesu nekaj dodati? zares interaktivno, dinamično, lepo in veličastno....? No, obstaja odgovor na to vprašanje. Le kaj ko v zahtevanem URL označite poseben program ( CGI,program Skupni vmesnik prehoda - Skupni vmesnik prehoda) in tisto, kar ta program proizvede, se nato pošlje v brskalnik.... Strežnik se zažene .cgi program in vas na primer po obdelavi podatkov obrazca vnese nekam v svojo bazo podatkov in vam bo povedal, da ti si super fant :)
No, upam, da sem vas zaintrigirala......?

Kratke informacije o tem, kaj morate vedeti za pisanje CGI skripte: No, najprej morate vedeti, kaj je to Internet in kako deluje (veš? ;))) ) No, in malo sposobnosti programiranja (to je najbolj pomembna stvar)
Napišiva skupaj kakšen preprost scenarij in potem ti povem, kje je pes brskal...
No, najprej ustvarite imenik v domačem imeniku cgi-bin:

cd public_html
mkdir cgi-bin
chmod 0777 cgi-bin

Zadnja vrstica bo zelo pomembna.
Vzemite urejevalnik in vnesite: #!/usr/bin/perl
#first.cgi
print "Content-Type: text/html\n\n";
natisni" ";
natisni"

Živjo ti!!!

";
natisni "";

Shranite ga v imenik cgi-bin pod imenom prvi.cgi.No, kako si ga shranil?
Zdaj naj bo izvršljiv (navsezadnje je program):

chmod +x prvi.cgi

No, bližamo se slovesnemu trenutku.... vtipkajte v vrstico brskalnika http://www.uic.nnov.ru/~your_login/cgi-bin/first.cgi
in poglej kaj se zgodi. To bo ena od dveh stvari, ali bo skript deloval in boste videli stran, ki jo je ustvaril (čestitke, naš polk je prišel!) ali napaka notranjega strežnika- potem ne bodi razburjen, naredil si nekaj narobe. Potem boste potrebovali vodnik za lovljenje bolh. No, najprej je mogoče preveriti sintakso na naslednji način:

perl -s prvim.cgi

Perl vam bo takoj izdal sporočila o napakah (no, včasih ste zgrešili podpičje, pozabili zapreti oklepaje ali narekovaje ...) to je mogoče takoj popraviti med potjo.
Bolj logičen pristop je preskočiti izpis prazne vrstice, ki ločuje glavo od telesa:
print "Content-Type: text/html\n\n"; #Vse je prav
print "Content-Type: text/html\n"; #NAPAKA!!!

Analizirajmo skript:
Prva vrsta #!/usr/bin/perl Preprosto nakazuje, kje se Perl nahaja v sistemu. Drugo je le komentar - za znakom lahko zbodeš karkoli #
Potem pride print "Content-Type: text/html\n\n"; To je glava, ki označuje vrsto vsebine; vse, kar skript natisne v svoj standardni izhod STDOUT, gre v obdelavo strežniku. Prazna vrstica loči glavo od telesa, kar v našem primeru je

Živjo ti!!!



Strežnik bo obdelal odgovor skripte in na podlagi tega generiral in poslal odgovor brskalniku (strežnik običajno ne spremeni telesa sporočila, le dopolni glavo s polji, potrebnimi za HTTP protokol).

No, osnove so že obvladane, vse ni tako težko in depresivno, kot se morda zdi na prvi pogled
Zdaj lahko sami vadite pisanje tako preprostih skriptov, da boste pri tem boljši.

Lastniki spletnih trgovin poznajo pojem "elektronsko poslovanje" iz prve roke, odgovor na vprašanje "e-poslovanje - kaj je to?" Če pa prideš zadevi do dna, se pokažejo številne nianse in ta izraz dobi širši pomen.

E-trgovina: kaj je to?

Splošni koncept je naslednji: e-trgovina se razume kot določen pristop k poslovanju, ki vključuje vključitev številnih operacij, ki uporabljajo digitalni prenos podatkov pri zagotavljanju blaga ali opravljanju storitev/dela, vključno z uporabo Internet.

Gre torej za vsako komercialno transakcijo, ki se opravi z uporabo elektronskega komunikacijskega sredstva.

Potek dela je naslednji:

  • vsakdo je lahko bloger ali katerikoli drug lastnik svoje internetne strani) se registrira v ta sistem;
  • dobi svojo povezavo;
  • na svojo spletno stran postavi posebno kodo - prikaže se oglas za izbranega uradnega partnerja e-Commerce Partners Network;
  • spremlja konverzijo spletne strani;
  • zasluži določen odstotek za vsak nakup obiskovalca vaše spletne strani, ki sledi partnerski povezavi.

WP e-trgovina

Veliko ljudi se zdaj navdušuje nad e-poslovanjem, predvsem zaradi želje po izdelavi lastne spletne strani, edinstvene spletne trgovine za prodajo lastnih izdelkov. Da bi zadostili temu naraščajočemu povpraševanju, so se razvijalci osredotočili na ustvarjanje predlog za e-trgovino. Poglejmo, kaj je to naslednje.

Eden takih primerov predloge je e-trgovina WordPress. Je vtičnik nakupovalne košarice za WordPress (eden najbolj znanih sistemov za upravljanje spletnih virov), namenjen predvsem ustvarjanju in organiziranju blogov). Na voljo je popolnoma brezplačno in obiskovalcem spletnega mesta omogoča nakupovanje na spletnem mestu.

Z drugimi besedami, ta vtičnik vam omogoča ustvarjanje spletne trgovine (ki temelji na WordPressu). Ta vtičnik za e-trgovino ima vsa potrebna orodja, nastavitve in možnosti, ki ustrezajo sodobnim potrebam.

Zahvaljujoč svetovnemu spletu lahko skoraj vsak posreduje informacije na spletu v obliki, ki je prijetna za oči in se lahko široko razširja. Brez dvoma ste že brskali po internetu in si ogledali druga spletna mesta, zdaj pa verjetno veste, da so grozljivi akronimi, kot sta »HTTP« in »HTML«, preprosto okrajšava za »splet« in »način, kako so informacije izražene na internetu«. Morda že imate nekaj izkušenj s predstavljanjem informacij na internetu.

Internet se je izkazal kot idealen medij za distribucijo informacij, kar je razvidno iz njegove izjemne priljubljenosti in širokega razvoja. Čeprav nekateri dvomijo o uporabnosti interneta in njegov širok razvoj in priljubljenost pripisujejo predvsem vsiljivemu oglaševanju, je internet nedvomno pomemben medij za podajanje najrazličnejših informacij. Ne samo, da so na voljo številne storitve za zagotavljanje najnovejših informacij (novice, vreme, športni dogodki v živo) in referenčnega gradiva v elektronski obliki, na voljo so tudi znatne količine drugih vrst podatkov. Davčna uprava, ki je vse svoje obrazce za davčne napovedi za leto 1995 in druge informacije razposlala prek svetovnega spleta, je nedavno priznala, da je prejela pošto oboževalcev za svojo spletno stran. Kdo bi si mislil, da bo davčna uprava kdaj prejela pošto oboževalcev? To ni bilo zato, ker je bilo njegovo spletno mesto dobro zasnovano, temveč zato, ker se je izkazalo za resnično uporabno orodje za tisoče, morda milijone ljudi.

Zakaj je splet edinstven in tako privlačen informacijski servis? Prvič, zagotavlja hipermedijski vmesnik za podatke. Pomislite na trdi disk vašega računalnika. Običajno so podatki izraženi linearno, podobno kot datotečni sistem. Na primer, imate več map in v vsaki mapi so dokumenti ali druge mape. Splet uporablja drugačno paradigmo za izražanje informacij, imenovano hipermedija. Hiperbesedilni vmesnik je sestavljen iz dokumenta in povezav. Povezave so besede, na katere se klikne, da se prikažejo drugi dokumenti ali poiščejo druge vrste informacij. Splet razširi koncept hiperteksta na druge vrste medijev, kot so grafika, zvoki, video (od tod tudi ime "hipermedij"). Izbiranje besedila ali grafike v dokumentu vam omogoča ogled povezanih informacij o izbrani postavki v poljubnem številu oblik.

Ta preprost in edinstven način predstavitve in distribucije informacij lahko koristi skoraj vsem, od akademikov, ki želijo takoj uporabiti podatke s svojimi sodelavci, do poslovnežev, ki informacije o svojem podjetju delijo z vsemi. Čeprav je dajanje informacij izjemno pomembno, pa so v zadnjih nekaj letih številni menili, da je prav tako pomemben proces tudi prejemanje informacij.

Čeprav splet ponuja edinstven hipermedijski vmesnik za informacije, obstaja veliko drugih učinkovitih načinov za distribucijo podatkov. Na primer, omrežne storitve, kot sta File Transfer Protocol (FTP) in novičarska skupina Gopher, so obstajale že dolgo pred svetovnim spletom. Elektronska pošta je primarni medij za komunikacijo in izmenjavo informacij na internetu in večini drugih omrežij skoraj od samega začetka teh omrežij. Zakaj je internet postal tako priljubljen način distribucije informacij? Večpredstavnostni vidik interneta je znatno prispeval k njegovemu uspehu brez primere, a da bi bil internet najbolj učinkovit, mora biti interaktiven.

Brez zmožnosti sprejemanja uporabniških vnosov in zagotavljanja informacij bi bil splet popolnoma statično okolje. Informacije bi bile na voljo samo v obliki, ki jo določi avtor. To bi spodkopalo eno od zmožnosti računalništva na splošno: interaktivne informacije. Na primer, namesto da bi uporabnika prisilili, da si ogleda več dokumentov, kot če bi brskal po knjigi ali slovarju, bi bilo bolje, da bi uporabniku omogočili, da identificira ključne besede o temi, ki ga zanima. Uporabniki lahko prilagodijo predstavitev podatkov, namesto da se zanašajo na togo strukturo, ki jo določi ponudnik vsebine.

Izraz "spletni strežnik" je lahko zavajajoč, saj se lahko nanaša tako na fizični stroj kot na programsko opremo, ki jo uporablja za komunikacijo z internetnimi brskalniki. Ko brskalnik zahteva dani spletni naslov, se najprej poveže z napravo prek interneta in pošlje programski opremi spletnega strežnika zahtevo za dokument. Ta programska oprema deluje neprekinjeno, čaka, da takšne zahteve prispejo, in se ustrezno odzove.

Čeprav lahko strežniki pošiljajo in prejemajo podatke, ima sam strežnik omejeno funkcionalnost. Na primer, najbolj primitiven strežnik lahko brskalniku pošlje samo zahtevano datoteko. Strežnik običajno ne ve, kaj naj naredi s tem ali onim dodatnim vnosom. Če ponudnik internetnih storitev strežniku ne pove, kako naj ravna s temi dodatnimi informacijami, bo strežnik najverjetneje prezrl vnos.

Da bi lahko strežnik poleg iskanja in pošiljanja datotek v spletni brskalnik izvajal še druge operacije, morate znati razširiti funkcionalnost strežnika. Spletni strežnik na primer ne more iskati po zbirki podatkov na podlagi ključne besede, ki jo je vnesel uporabnik, in vrniti več ujemajočih se dokumentov, razen če je bila taka zmožnost na nek način vprogramirana v strežnik.

Kaj je CGI?

Common Gateway Interface (CGI) je vmesnik do strežnika, ki omogoča razširitev funkcionalnosti strežnika. Z uporabo CGI lahko interaktivno komunicirate z uporabniki, ki dostopajo do vašega spletnega mesta. Na teoretični ravni CGI omogoča strežniku, da lahko razčleni (interpretira) vnos iz brskalnika in vrne informacije na podlagi uporabnikovega vnosa. Na praktični ravni je CGI vmesnik, ki programerju omogoča pisanje programov, ki zlahka komunicirajo s strežnikom.

Običajno bi morali za razširitev zmogljivosti strežnika sami spremeniti strežnik. Ta rešitev je nezaželena, ker zahteva razumevanje nižje ravni omrežnega programiranja internetnega protokola. To bi zahtevalo tudi urejanje in ponovno prevajanje izvorne kode strežnika ali pisanje strežnika po meri za vsako nalogo. Recimo, da želite razširiti zmožnosti strežnika, tako da deluje kot prehod med spletom in e-pošto, pri čemer podatke, ki jih vnese uporabnik, prevzame iz brskalnika in jih po e-pošti pošlje drugemu uporabniku. Strežnik bi moral vstaviti kodo za razčlenitev vnosa iz brskalnika, ga posredovati po e-pošti drugemu uporabniku in posredovati odgovor nazaj v brskalnik prek omrežne povezave.

Prvič, taka naloga zahteva dostop do kode strežnika, kar ni vedno mogoče.

Drugič, težko je in zahteva obsežno tehnično znanje.

Tretjič, to velja samo za določen strežnik. Če morate strežnik premakniti na drugo platformo, boste morali zagnati ali vsaj porabiti veliko časa za prenos kode na to platformo.

Zakaj CGI?

CGI ponuja prenosljivo in preprosto rešitev za te težave. Protokol CGI definira standardni način za komunikacijo programov s spletnim strežnikom. Brez posebnega znanja lahko napišete program v katerem koli strojnem jeziku, ki je vmesnik in komunikacija s spletnim strežnikom. Ta program bo deloval z vsemi spletnimi strežniki, ki razumejo protokol CGI.

Komunikacija CGI poteka s standardnim vhodom in izhodom, kar pomeni, da če znate tiskati in brati podatke z uporabo svojega programskega jezika, lahko napišete aplikacijo spletnega strežnika. Razen razčlenjevanja vnosa in izhoda je programiranje aplikacij CGI skoraj enakovredno programiranju katere koli druge aplikacije. Na primer, za programiranje programa "Hello, World!" uporabite funkcije tiskanja vašega jezika in format, določen za programe CGI, da natisnete ustrezno sporočilo.

Izbira programskega jezika

Ker je CGI univerzalni vmesnik, niste omejeni na noben določen strojni jezik. Pomembno vprašanje, ki se pogosto postavlja, je: kateri programski jeziki se lahko uporabljajo za programiranje CGI? Uporabite lahko kateri koli jezik, ki vam omogoča naslednje:

  • Tiskanje na standardni izhod
  • Branje iz standardnega vnosa
  • Branje iz spremenljivih načinov

Skoraj vsi programski jeziki in številni skriptni jeziki izvajajo te tri stvari in lahko uporabite katero koli od njih.

Jeziki spadajo v enega od naslednjih dveh razredov: prevedeni in tolmačeni. Prevedeni jezik, kot sta C ali C++, je običajno manjši in hitrejši, medtem ko prevedeni jeziki, kot sta Perl ali Rexx, včasih zahtevajo nalaganje velikega tolmača ob zagonu. Poleg tega lahko distribuirate binarne kode (kodo, ki se prevede v strojni jezik) brez izvorne kode, če je vaš jezik prevedljiv. Distribucija interpretabilnih skriptov običajno pomeni distribucijo izvorne kode.

Preden izberete jezik, morate najprej razmisliti o svojih prioritetah. Pretehtati morate prednosti hitrosti in učinkovitosti enega programskega jezika ter enostavnost programiranja drugega. Če se želite naučiti drugega jezika, namesto tistega, ki ga že poznate, dobro pretehtajte prednosti in slabosti obeh jezikov.

Dva najpogosteje uporabljena jezika za programiranje CGI sta C in Perl (oba sta obravnavana v tej knjigi). Oba imata jasne prednosti in slabosti. Perl je jezik na zelo visoki ravni, hkrati pa zmogljiv jezik, še posebej primeren za razčlenjevanje besedila. Čeprav je zaradi enostavne uporabe, prilagodljivosti in moči privlačen jezik za programiranje CGI, je zaradi njegove razmeroma velike velikosti in počasnejšega delovanja včasih neprimeren za nekatere aplikacije. Programi C so manjši, učinkovitejši in zagotavljajo nadzor sistema na nižji ravni, vendar so bolj zapleteni za programiranje, nimajo lahkih vgrajenih rutin za obdelavo besedila in jih je težje odpraviti.

Kateri jezik je najbolj primeren za programiranje CGI? Tisti, ki se vam zdi bolj priročen s programskega vidika. Oba sta enako učinkovita za programiranje aplikacij CGI in imata z ustreznimi knjižnicami oba podobne zmogljivosti. Če pa imate težko dostopen strežnik, lahko uporabite manjše, prevedene programe C. Če morate hitro napisati aplikacijo, ki zahteva veliko obdelave besedila, lahko namesto tega uporabite Perl.

Opozorila

Obstaja nekaj pomembnih alternativ za aplikacije CGI. Številni strežniki zdaj vključujejo programiranje API, kar olajša programiranje neposrednih strežniških razširitev v nasprotju s samostojnimi aplikacijami CGI. Strežniki API so na splošno učinkovitejši od programov CGI. Drugi strežniki vključujejo vgrajeno funkcionalnost, ki lahko obravnava posebne elemente, ki niso CGI, kot je povezovanje baze podatkov. Nazadnje, nekatere aplikacije lahko obravnavajo nekatere nove tehnologije na strani odjemalca (namesto na strani strežnika), kot je Java. Bo ob tako hitrih spremembah tehnologije CGI hitro zastarel?

Komaj. CGI ima več prednosti pred novejšimi tehnologijami.

  • Je vsestranski in prenosljiv. Aplikacijo CGI lahko napišete s skoraj katerim koli programskim jezikom na kateri koli platformi. Nekatere alternative, kot je strežniški API, vas omejujejo na določene jezike in se jih je veliko težje naučiti.
  • Malo verjetno je, da bodo tehnologije na strani odjemalca, kot je Java, nadomestile CGI, ker obstajajo nekatere aplikacije, za katere so aplikacije na strani strežnika veliko bolj primerne za izvajanje.
  • Številne omejitve CGI so omejitve HTML ali HTTP. Z razvojem internetnih standardov kot celote se razvijajo tudi zmogljivosti CGI.

Povzetek

Common Gateway Interface je protokol, po katerem programi komunicirajo s spletnimi strežniki. Vsestranskost CGI omogoča programerjem, da pišejo prehodne programe v skoraj vseh jezikih, čeprav je z različnimi jeziki povezanih veliko kompromisov. Brez te zmožnosti bi bilo ustvarjanje interaktivnih spletnih strani težko, v najboljšem primeru bi zahtevalo spremembe strežnika, interaktivnost pa ne bi bila na voljo večini uporabnikov, ki niso skrbniki spletnega mesta.

2. poglavje: Osnove

Pred nekaj leti sem ustvaril stran za fakulteto na Harvardu, kjer so lahko ljudje oddali komentarje o njih. Takrat je bil internet mlad in dokumentacije je bilo malo. Tako kot mnogi drugi sem se pri učenju programiranja CGI zanašal na kratko dokumentacijo in programske sisteme, ki so jih ustvarili drugi. Čeprav je ta metoda študija zahtevala nekaj iskanja, veliko poskusov in je ustvarila številna vprašanja, je bila zelo učinkovita. To poglavje je rezultat mojega zgodnjega dela s CGI (seveda z nekaj popravki).

Čeprav traja nekaj časa, da popolnoma razumemo in obvladamo skupni vmesnik prehoda, je sam protokol precej preprost. Vsakdo, ki ima nekaj osnovnih veščin programiranja in je seznanjen s spletom, se lahko hitro nauči programirati precej zapletene aplikacije CGI, tako kot sem se jaz in drugi naučil početi pred nekaj leti.

Namen tega poglavja je predstaviti osnove CGI na celovit, čeprav zgoščen način. Vsak koncept, obravnavan tukaj, je podrobno predstavljen v naslednjih poglavjih. Vendar pa lahko po zaključku tega poglavja takoj začnete programirati aplikacije CGI. Ko dosežete to raven, se lahko naučite zapletenosti CGI, bodisi tako, da preberete preostanek te knjige ali preprosto eksperimentirate sami.

Programiranje CGI lahko strnete na dve nalogi: prejemanje informacij iz spletnega brskalnika in pošiljanje informacij nazaj v brskalnik. To naredite povsem intuitivno, ko se seznanite z običajno uporabo aplikacij CGI. Pogosto se od uporabnika zahteva, da izpolni nek obrazec, na primer vstavi svoje ime. Ko uporabnik izpolni obrazec in pritisne Enter, se te informacije pošljejo programu CGI. Program CGI mora te informacije nato pretvoriti v nekaj, kar razume, jih ustrezno obdelati in nato poslati nazaj v brskalnik, naj bo to preprosta potrditev ali rezultat iskanja v večnamenski bazi podatkov.

Z drugimi besedami, programiranje CGI zahteva razumevanje, kako prejeti vhod iz internetnega brskalnika in kako poslati izhod nazaj. Kaj se zgodi med vhodno in izhodno stopnjo programa CGI je odvisno od razvijalčevega cilja. Ugotovili boste, da je glavna težava pri programiranju CGI v tej vmesni stopnji; Ko se enkrat naučite delati z vhodnimi in izhodnimi podatki, je to v bistvu dovolj, da postanete razvijalec CGI.

V tem poglavju se boste naučili načel v ozadju vnosa in izhoda CGI ter drugih osnovnih veščin, ki jih boste potrebovali za pisanje in uporabo CGI, vključno s stvarmi, kot je ustvarjanje obrazcev HTML in poimenovanje vaših programov CGI. To poglavje zajema naslednje teme:

  • Tradicionalni program "Zdravo, svet!";
  • Izhod CGI: pošiljanje informacij nazaj za prikaz v internetnem brskalniku;
  • Konfiguriranje, namestitev in zagon aplikacije. Spoznali boste različne spletne platforme in strežnike;
  • Vnos CGI: Interpretacija informacij, ki jih pošlje spletni brskalnik. Uvod v nekaj uporabnih programskih knjižnic za razčlenjevanje takega vnosa;
  • Preprost primer: zajema vse lekcije v danem poglavju;
  • Strategija programiranja.

Zaradi narave tega poglavja se nekaterih tem le rahlo dotaknem. Ne skrbite; Vse te teme so veliko bolj poglobljeno obravnavane v drugih poglavjih.

Pozdravljen, svet!

Začnete s tradicionalnim uvodnim problemom programiranja. Napisali boste program, ki prikaže "Hello, World!" v vašem spletnem brskalniku. Preden napišete ta program, morate razumeti, katere informacije spletni brskalnik pričakuje od programov CGI. Prav tako morate vedeti, kako zagnati ta program, da ga boste lahko videli v akciji.

CGI je jezikovno neodvisen, zato lahko ta program implementirate v katerem koli jeziku. Tukaj se uporablja več različnih jezikov, da se pokaže neodvisnost vsakega jezika. V Perlu je program "Hello, World!" prikazano v seznamu 2.1.

Seznam 2.1. Pozdravljen, svet! v Perlu. #!/usr/local/bin/perl # Hello.cgi - Moj prvi program CGI print "Content-Type: text/html\n\n"; natisni" \n"; natisni " Pozdravljen, svet!"; natisni "\n"; natisni " \n"; natisni "

Pozdravljen, svet!

\n"; natisni " \n";

Shranite ta program kot hello.cgi in ga namestite na ustrezno mesto. (Če niste prepričani, kje je, ne skrbite; to boste izvedeli v razdelku »Namestitev in zagon programa CGI« kasneje v tem poglavju.) Za večino strežnikov je imenik, ki ga potrebujete, cgi-bin . Zdaj pokličite program iz spletnega brskalnika. Za večino to pomeni odpiranje naslednjega enotnega lokatorja virov (URL):

http://imegostitelja/imeimenika/hello.cgi

Ime gostitelja je ime vašega spletnega strežnika, ime imenika pa je imenik, kamor vnesete hello.cgi (verjetno cgi-bin).

Razdelitev hello.cgi

Pri hello.cgi je treba upoštevati nekaj stvari.

Najprej uporabite preproste ukaze za tiskanje. Programi CGI ne zahtevajo posebnih deskriptorjev datotek ali izhodnih deskriptorjev. Če želite poslati izhod v brskalnik, preprosto natisnite v stdout.

Drugič, upoštevajte, da se vsebina prvega stavka za tiskanje (Content-Type: text/html) ne prikaže v vašem spletnem brskalniku. Brskalniku lahko pošljete poljubne informacije (stran HTML, grafiko ali zvok), vendar morate brskalniku najprej povedati, kakšne podatke pošiljate. Ta vrstica pove brskalniku, kakšne informacije lahko pričakuje - v tem primeru stran HTML.

Tretjič, program se imenuje hello.cgi. Ni vam treba vedno uporabljati pripone .cgi z imenom vašega programa CGI. Čeprav izvorna koda za številne jezike uporablja tudi pripono .cgi, se ne uporablja za označevanje vrste jezika, ampak je način, da strežnik identificira datoteko kot izvršljivo datoteko in ne kot grafično datoteko, datoteko HTML ali besedilna datoteka. Strežniki so pogosto konfigurirani tako, da poskušajo izvesti samo tiste datoteke, ki imajo to končnico, in prikažejo vsebino vseh drugih. Čeprav uporaba končnice .cgi ni obvezna, še vedno velja za dobro prakso.

Na splošno je hello.cgi sestavljen iz dveh glavnih delov:

  • pove brskalniku, katere informacije naj pričakuje (Content-Type: text/html)
  • pove brskalniku, kaj naj prikaže (Hello, World!)

Pozdravljen, svet! v C

Za prikaz jezikovne neodvisnosti programov CGI je v seznamu 2.2 prikazan ekvivalent programa hello.cgi, napisanega v C.

Seznam 2.2. Pozdravljen, svet! v C. /* hello.cgi.c - Pozdravljen, svet CGI */ #include int main() ( printf("Vrsta vsebine: besedilo/html\r\n\r\n"); printf(" \n"); printf(" Pozdravljen, svet!\n"); printf("\n"); printf(" \n"); printf("

Pozdravljen, svet!

\n"); printf(" \n"); )

Opomba

Upoštevajte, da Perl različica hello.cgi uporablja Content-Type print ": text/html\n\n"; Medtem ko različica C uporablja Printf("Content-Type: text/html\r\n\r\n");

Zakaj Perl natisne operator na koncu z dvema novima vrsticama (\n), medtem ko se C printf konča z dvema vrnitvama v prvi vrstici in novimi vrsticami (\r\n)?

Tehnično se pričakuje, da bodo glave (vsi izhodi pred prazno vrstico) ločene z vrnitvijo v prvi vrstico in novo vrstico. Na žalost Perl na strojih DOS in Windows prevede \r kot novo vrstico in ne kot vrnitev v prvi vrstico.

Čeprav je Perlova izjema \rs tehnično nepravilna, bo delovala na skoraj vseh protokolih in je enako prenosljiva na vseh platformah. Zato v vseh Perlovih primerih v tej knjigi uporabljam glave, ki ločujejo nove vrstice, namesto prenosov v prvi vrstico in novih vrstic.

Ustrezna rešitev tega problema je predstavljena v 4. poglavju, Zaključek.

Niti spletnemu strežniku niti brskalniku ni mar, kateri jezik je uporabljen za pisanje programa. Čeprav ima vsak jezik kot programski jezik CGI prednosti in slabosti, je najbolje uporabiti jezik, s katerim vam je najbolj udobno delati. (Izbira programskega jezika je podrobneje obravnavana v 1. poglavju, “Skupni vmesnik prehoda (CGI)”).

CGI upodabljanje

Zdaj si lahko podrobneje ogledate vprašanje pošiljanja informacij v spletni brskalnik. Iz primera »Hello, World!« lahko vidite, da spletni brskalniki pričakujejo dva niza podatkov: glavo, ki vsebuje informacije, kot so informacije, ki naj se prikažejo (npr. vrstica Content-Type:), in dejanske informacije (kaj spletni brskalnik zasloni). Ta dva podatka sta ločena s prazno vrstico.

Glava se imenuje glava HTTP. Daje pomembne informacije o informacijah, ki jih bo brskalnik prejel. Obstaja več različnih vrst glav HTTP, najpogostejša pa je tista, ki ste jo že uporabljali: Content-Type: glava. Uporabite lahko različne kombinacije glav HTTP, ločene z vrnitvijo v prvi vrstico in novo vrstico (\r\n). Prazna vrstica, ki ločuje glavo od podatkov, je sestavljena tudi iz vrnitve v prvi vrstico in nove vrstice (zakaj sta potrebni obe, je na kratko obravnavano v prejšnji opombi in podrobno opisano v 4. poglavju). O drugih glavah HTTP boste izvedeli v 4. poglavju; Trenutno imate opravka z glavo Content-Type:.

Content-Type: Glava opisuje vrsto podatkov, ki jih vrne CGI. Primerna oblika za to glavo je:

Content-Type: podvrsta/vrsta

Pri čemer je podvrsta/vrsta pravilna vrsta razširitev večnamenske internetne pošte (MIME). Najpogostejši tip MIME je tip HTML: text/html. Tabela 2.1 navaja nekaj pogostejših tipov MIME, o katerih bomo razpravljali; Popolnejši seznam in analiza tipov MIME sta na voljo v 4. poglavju.

Opomba

MIME je bil prvotno izumljen za opis vsebine teles poštnih sporočil. Postal je dokaj pogost način za predstavitev informacij o vrsti vsebine. Več o MIME lahko preberete v RFC1521. RFC-ji na internetu pomenijo zahteve za komentarje, ki so povzetki odločitev skupin na internetu, ki poskušajo postaviti standarde. Rezultate RFC1521 si lahko ogledate na naslednjem naslovu: http://andrew2.andrew.cmu.edu/rfc/rfc1521.html

Tabela 2.1. Nekatere pogoste vrste MIME. Vrsta MIME Opis Besedilo/html Hypertext Markup Language (HTML) Besedilo/navadno besedilo Datoteke Slika/gif Grafične datoteke GIF Slika/jpeg Stisnjene grafične datoteke JPEG Zvočne/osnovne zvočne datoteke Sun *.au Zvočne/x-wav Datoteke Windows wav

Po glavi in ​​prazni vrstici preprosto natisnete podatke v obliki, ki jo potrebujete. Če pošiljate HTML, natisnite oznake HTML in podatke v stdout za glavo. Pošiljate lahko tudi grafične, zvočne in druge binarne datoteke tako, da preprosto natisnete vsebino datoteke v stdout. V 4. poglavju je podanih več primerov tega.

Namestitev in zagon programa CGI

Ta razdelek nekoliko odstopa od programiranja CGI in govori o konfiguriranju vašega spletnega strežnika za uporabo CGI, nameščanju in izvajanju programov. Bolj ali manj podrobno se boste seznanili z različnimi strežniki za različne platforme, vendar se boste morali poglobiti v dokumentacijo strežnika, da boste našli najboljšo možnost.

Vsi strežniki potrebujejo prostor za datoteke strežnika in prostor za dokumente HTML. V tej knjigi se območje strežnika imenuje ServerRoot, področje dokumenta pa DocumentRoot. Na strojih UNIX je ServerRoot običajno v /usr/local/etc/httpd/, DocumentRoot pa je običajno v /usr/local/etc/httpd/htdocs/. Vendar to ne bo vplivalo na vaš sistem, zato zamenjajte vse sklice na ServerRoot in DocumentRoot s svojima ServerRoot in DocumentRoot.

Ko dostopate do datotek s spletnim brskalnikom, podate datoteko v URL-ju glede na DocumentRoot. Na primer, če je naslov vašega strežnika mymachine.org, potem do te datoteke dostopate z naslednjim URL-jem: http://mymachine.org/index.html

Konfiguriranje strežnika za CGI

Večina spletnih strežnikov je vnaprej konfiguriranih za uporabo programov CGI. Običajno dva parametra strežniku nakazujeta, ali je datoteka aplikacija CGI ali ne:

  • Določen imenik. Nekateri strežniki vam omogočajo, da ugotovite, da so vse datoteke v določenem imeniku (običajno privzeto imenovanem cgi-bin) CGI.
  • Končnice imen datotek. Veliko strežnikov ima to predkonfiguracijo, ki omogoča, da se vse datoteke, ki se končajo z .cgi, definirajo kot CGI.

Metoda imenovanega imenika je nekakšen ostanek preteklosti (prvi strežniki so jo uporabljali kot edino metodo za določanje, katere datoteke so programi CGI), vendar ima več prednosti.

  • Ohranja programe CGI centralizirane in preprečuje, da bi drugi imeniki postali nered.
  • Niste omejeni na nobeno določeno pripono imena datoteke, tako da lahko datoteke poimenujete, kakor želite. Nekateri strežniki vam omogočajo, da določite več različnih imenikov kot imenike CGI.
  • Omogoča tudi večji nadzor nad tem, kdo lahko snema CGI. Na primer, če imate strežnik in podpirate sistem z več uporabniki in ne želite, da uporabljajo lastne skripte CGI brez predhodne revizije programa iz varnostnih razlogov, lahko kot CGI označite samo tiste datoteke v omejenem centraliziranem imeniku . Uporabniki vam bodo nato morali zagotoviti programe CGI za namestitev, vi pa lahko najprej pregledate kodo in se prepričate, da program nima večjih varnostnih težav.

Zapis CGI prek končnice imena datoteke je lahko uporaben zaradi svoje prilagodljivosti. Za programe CGI niste omejeni na en sam imenik. Večino strežnikov je mogoče konfigurirati za prepoznavanje CGI prek pripone imena datoteke, čeprav niso vsi privzeto konfigurirani na ta način.

Opozorilo

Ne pozabite na pomen varnostnih vprašanj, ko konfigurirate svoj strežnik za CGI. Nekaj ​​nasvetov bo obravnavanih tukaj, poglavje 9, Zaščita CGI, pa podrobneje obravnava te vidike.

Namestitev CGI na strežnike UNIX

Ne glede na to, kako je konfiguriran vaš strežnik UNIX, morate narediti več korakov, da zagotovite, da vaše aplikacije CGI delujejo po pričakovanjih. Vaš spletni strežnik se običajno izvaja kot neobstoječi uporabnik (to je uporabnik UNIX nobody – račun, ki nima dovoljenj za datoteke in se ne more prijaviti). Skripte CGI (napisane v Perlu, lupini Bourne ali drugem skriptnem jeziku) morajo biti izvedljive in berljive po vsem svetu.

Namig

Če želite, da bodo vaše datoteke berljive in izvedljive, uporabite naslednji ukaz za dovoljenja UNIX: chmod 755 ime datoteke.

Če uporabljate skriptni jezik, kot je Perl ali Tcl, navedite celotno pot vašega tolmača v prvi vrstici vašega skripta. Na primer, skript Perl, ki uporablja perl v imeniku /usr/local/bin, bi se začel z naslednjo vrstico:

#!/usr/local/bin/perl

Opozorilo

Nikoli ne postavljajte tolmača (perl ali Tcl Wish binary) v imenik /cgi-bin. To ustvarja varnostno tveganje za vaš sistem. To je podrobneje obravnavano v 9. poglavju.

Nekateri generični strežniki UNIX

Strežnika NCSA in Apache imata podobne konfiguracijske datoteke, ker je strežnik Apache prvotno temeljil na kodi NCSA. Privzeto so konfigurirani tako, da je katera koli datoteka v imeniku cgi-bin (ki se privzeto nahaja v ServerRoot) program CGI. Če želite spremeniti lokacijo imenika cgi-bin, lahko uredite konfiguracijsko datoteko conf/srm.conf. Format za konfiguracijo tega imenika je

ScriptAlias ​​​​fakedirectoryname realdirectoryname

kjer je fakedirectoryname psevdo ime imenika (/cgi-bin) in realdirectoryname je polna pot, kjer so programi CGI dejansko shranjeni. Konfigurirate lahko več kot en ScriptAlias ​​​​tako, da dodate več vrstic ScriptAlias ​​​​.

Privzeta konfiguracija zadostuje za potrebe večine uporabnikov. V obeh primerih morate urediti vrstico v datoteki srm.conf, da določite pravilno ime realnega imenika. Če se na primer vaši programi CGI nahajajo v /usr/local/etc/httpd/cgi-bin, bi morala biti vrstica ScriptAlias ​​​​v vaši datoteki srm.conf nekaj takega:

ScriptAlias ​​​​/cgi-bin/ /usr/local/etc/httpd/cgi-bin/

Za dostop ali povezavo do programov CGI, ki se nahajajo v tem imeniku, uporabite naslednji URL:

Http://imegostitelja/cgi-bin/imeprograma

Pri čemer je ime gostitelja ime gostitelja vašega spletnega strežnika, ime programa pa je ime vašega CGI.

Recimo, da kopirate program hello.cgi v svoj imenik cgi-bin (npr. /usr/local/etc/httpd/cgi-bin) na vašem spletnem strežniku, imenovanem www.company.com. Za dostop do CGI uporabite naslednji URL: http://www.company.com/cgi-bin/hello.cgi

Če želite konfigurirati svoj strežnik NCSA ali Apache, da prepozna katero koli datoteko s pripono .cgi kot CGI, morate urediti dve konfiguracijski datoteki. Najprej v datoteki srm.conf odkomentirajte naslednjo vrstico:

AddType application/x-httpd-cgi .cgi

To bo CGI vrste MIME povezalo s pripono .cgi. Zdaj moramo spremeniti datoteko access.conf, tako da lahko izvajamo CGI v katerem koli imeniku. Če želite to narediti, dodajte možnost ExecCGI v vrstico Option. Videti bo nekako takole:

Indeksi možnosti FollowSymLinks ExecCGI

Zdaj se vsaka datoteka s pripono .cgi šteje za CGI; dostopajte do nje kot do katere koli datoteke na svojem strežniku.

Strežnik CERN je konfiguriran na enak način kot strežnika Apache in NCSA. Namesto ScriptAlias ​​strežnik CERN uporablja ukaz Exec. Na primer, v datoteki httpd.conf boste videli naslednjo vrstico:

Exec /cgi-bin/* /usr/local/etc/httpd/cgi-bin/*

Druge strežnike UNIX je mogoče konfigurirati na enak način; To je podrobneje opisano v dokumentaciji strežnika.

Namestitev CGI v Windows

Večina strežnikov, ki so na voljo za Windows 3.1, Windows 95 in Windows NT, je konfigurirana z metodo "pripone imena datoteke" za prepoznavanje CGI. Na splošno spreminjanje konfiguracije strežnika, ki temelji na sistemu Windows, preprosto zahteva zagon programa za konfiguracijo strežnika in izvedbo ustreznih sprememb.

Včasih je konfiguriranje strežnika za pravilno izvajanje skripta (kot je Perl) lahko težavno. V DOS ali Windows ne boste mogli določiti tolmača v prvi vrstici skripta, kot je to v primeru UNIX. Nekateri strežniki imajo vnaprej določeno konfiguracijo za povezovanje določenih pripon imen datotek s tolmačem. Številni spletni strežniki Windows na primer predvidevajo, da so datoteke, ki se končajo z .pl, skripti Perl.

Če strežnik ne izvede te vrste povezovanja datotek, lahko definirate paketno datoteko pakirnika, ki pokliče tolmača in skript. Tako kot pri strežniku UNIX tolmača ne nameščajte niti v imenik cgi-bin niti v kateri koli imenik, ki je dostopen spletu.

Namestitev CGI na Macintosh

Dve najbolj znani možnosti strežnika za Macintosh sta WebStar StarNine in njegov predhodnik MacHTTP. Oba prepoznata CGI po končnici imena datoteke.

MacHTTP razume dve različni razširitvi: .cgi in .acgi, kar pomeni asinhroni CGI. Običajni programi CGI, nameščeni v računalniku Macintosh (s pripono .cgi), bodo ohranili spletni strežnik v zasedenem stanju, dokler se CGI ne konča z izvajanjem, zaradi česar strežnik začasno prekine vse druge zahteve. Po drugi strani pa asinhroni CGI omogoča, da strežnik sprejema zahteve, tudi ko deluje.

Razvijalec CGI Macintosh, ki uporablja katerega koli od teh spletnih strežnikov, bi moral, če je mogoče, uporabljati samo končnico .acgi namesto končnice .cgi. Delovati mora z večino programov CGI; če ne deluje, preimenujte program v .cgi.

Izvajanje CGI

Ko namestite CGI, ga lahko izvedete na več načinov. Če je vaš program CGI samo izhodni program, kot je program Hello,World!, ga lahko preprosto izvedete z dostopom do njegovega URL-ja.

Večina programov se izvaja kot strežniška aplikacija na obrazcu HTML. Preden se naučite prejemati informacije iz teh obrazcev, najprej preberite kratek uvod o ustvarjanju takih obrazcev.

Hitra vadnica o obrazcih HTML

Dve najpomembnejši oznaki v obliki HTML sta in . Večino obrazcev HTML lahko ustvarite samo s tema dvema oznakama. V tem poglavju boste raziskali te oznake in majhno podmnožico možnih tipov ali atributov. . Popoln vodnik in povezava do obrazcev HTML je v 3. poglavju, HTML in obrazci.

Oznaka

Oznaka uporablja za določitev, kateri del datoteke HTML naj se uporabi za podatke, ki jih vnese uporabnik. To se nanaša na način, kako večina strani HTML imenuje program CGI. Atributi oznake določajo ime in lokacijo programa – lokalno ali kot polni URL, vrsto uporabljenega kodiranja in metodo premikanja podatkov, ki jo uporablja program.

Naslednja vrstica prikazuje specifikacije za oznako :

< ACTION FORM = "url" METHOD = ENCTYPE = "..." >

Atribut ENCTYPE nima posebne vloge in običajno ni vključen v oznako . Podrobne informacije o oznaki ENCTYPE so podane v 3. poglavju. Eden od načinov uporabe ENCTYPE je prikazan v 14. poglavju, "Razširitve z blagovno znamko".

Atribut ACTION se nanaša na URL programa CGI. Ko uporabnik izpolni obrazec in vnese podatke, se vsi podatki kodirajo in prenesejo v program CGI. Program CGI sam rešuje problem dekodiranja in obdelave informacij; Ta vidik je obravnavan v "Sprejemanje vnosa iz brskalnika," kasneje v tem poglavju.

Končno, atribut METHOD opisuje, kako naj program CGI sprejema vhodne podatke. Obe metodi, GET in POST, se razlikujeta v tem, kako posredujeta informacije programu CGI. Oboje je obravnavano v "Sprejemanje vnosa iz brskalnika."

Da brskalnik omogoča uporabniški vnos, morajo biti vse oznake obrazcev in informacije obdane z oznako . Ne pozabite na zaključno oznako

za označevanje konca obrazca. Ne morete imeti obrazca znotraj obrazca, čeprav lahko nastavite obrazec, ki vam omogoča, da predstavite informacije na različnih mestih; ta vidik je obširno obravnavan v 3. poglavju.

Oznaka

Ustvarite lahko vrstice za vnos besedila, izbirne gumbe, potrditvena polja in druge načine sprejemanja vnosa z uporabo oznake . Ta razdelek pokriva samo polja za vnos besedila. Za implementacijo tega polja uporabite oznako z naslednjimi atributi:

< INPUT TYPE=text NAME = "... " VALUE = "... " SIZE = MAXLENGTH = >

NAME je simbolično ime spremenljivke, ki vsebuje vrednost, ki jo vnese uporabnik. Če v atribut VALUE vključite besedilo, bo to besedilo privzeto umeščeno v polje za vnos besedila. Atribut SIZE vam omogoča, da določite vodoravno dolžino vnosnega polja, kot bo prikazano v oknu brskalnika. Končno MAXLENGTH določa največje število znakov, ki jih lahko uporabnik vnese v polje. Upoštevajte, da atributi VALUE, SIZE, MAXLENGTH niso obvezni.

Oddaja obrazca

Če imate v obrazcu samo eno besedilno polje, lahko uporabnik odda obrazec tako, da na tipkovnici preprosto vnese podatke in pritisne Enter. V nasprotnem primeru mora obstajati drug način, da uporabnik predstavi informacije. Uporabnik odda podatke z uporabo gumba za oddajo z naslednjo oznako:

< Input type=submit >

Ta oznaka ustvari gumb Pošlji znotraj obrazca. Ko uporabnik konča z izpolnjevanjem obrazca, lahko pošlje njegovo vsebino na URL, ki ga določa atribut ACTION obrazca, s klikom na gumb Pošlji.

Sprejemanje vnosa iz brskalnika

Zgoraj so bili primeri snemanja programa CGI, ki pošilja informacije s strežnika v brskalnik. V resnici program CGI, ki izpisuje samo podatke, nima veliko aplikacij (nekaj primerov je navedenih v 4. poglavju). Pomembnejša sposobnost CGI je prejemanje informacij iz brskalnika - funkcija, ki daje spletu interaktivni značaj.

Program CGI od brskalnika prejema dve vrsti informacij.

  • Najprej pridobi različne informacije o brskalniku (njegovem tipu, kaj si lahko ogleda, gostiteljskem gostitelju itd.), strežniku (njegovo ime in različica, izvedbena vrata itd.) in programu CGI sama (ime programa in kje se nahaja). Strežnik posreduje vse te informacije programu CGI prek spremenljivk okolja.
  • Drugič, program CGI lahko sprejema uporabniške vnose. Te informacije, potem ko jih brskalnik kodira, se pošljejo prek spremenljivke okolja (metoda GET) ali prek standardnega vnosa (metoda stdin - POST).

Spremenljivke okolja

Koristno je vedeti, katere spremenljivke okolja so na voljo programu CGI, tako med usposabljanjem kot za odpravljanje napak. Tabela 2.2 navaja nekatere razpoložljive spremenljivke okolja CGI. Napišete lahko tudi program CGI, ki izpiše spremenljivke okolja in njihove vrednosti v spletni brskalnik.

Tabela 2.2. Nekaj ​​pomembnih spremenljivk okolja CGI Spremenljivka okolja Namen REMOTE_ADDR Naslov IP odjemalskega računalnika. REMOTE_HOST Gostitelj odjemalskega računalnika. HTTP _ACCEPT Navede tipe podatkov MIME, ki jih brskalnik lahko interpretira. HTTP _USER_AGENT Informacije o brskalniku (vrsta brskalnika, številka različice, operacijski sistem itd.). REQUEST_METHOD GET ali POST. CONTENT_LENGTH Velikost vnosa, če je poslan prek POST. Če ni vnosa ali če je uporabljena metoda GET, je ta parameter nedefiniran. QUERY_STRING Vsebuje vhodne informacije, ko so posredovane z uporabo metode GET. PATH_INFO Omogoča uporabniku, da določi pot iz ukazne vrstice CGI (na primer http://imegostitelja/cgi-bin/imeprograma/pot). PATH_TRANSLATED Prevede relativno pot v PATH_INFO v dejansko pot v sistemu.

Če želite napisati aplikacijo CGI, ki prikazuje spremenljivke okolja, morate vedeti, kako narediti dve stvari:

  • Določite vse spremenljivke okolja in njihove ustrezne vrednosti.
  • Natisnite rezultate v brskalnik.

Zadnjo operacijo že veste. V Perlu so spremenljivke okolja shranjene v asociativnem polju %ENV, ki ga uvede ime spremenljivke okolja. Izpis 2.3 vsebuje env.cgi, program Perl, ki doseže naš cilj.

Seznam 2.3. Program Perl, env.cgi, ki natisne vse spremenljivke okolja CGI.

#!/usr/local/bin/perl print "Content-type: text/html\n\n"; natisni" \n"; natisni " CGI okolje\n"; natisni "\n"; natisni " \n"; natisni "

CGI okolje

\n"; foreach $env_var (ključi %ENV) ( print " $env_var= $ENV($env_var)
\n"; ) natisni " \n";

Podoben program bi lahko napisali v C; celotna koda je v seznamu 2.4.

Seznam 2.4. Env.cgi.c v C. /* env.cgi.c */ #include extern char **okolje; int main() ( char **p = environ; printf("Vrsta vsebine: besedilo/html\r\n\r\n"); printf(" \n"); printf(" CGI okolje\n"); printf("\n"); printf(" \n"); printf("

CGI okolje

\n"); while(*p != NULL) printf("%s
\n",*p++); printf(" \n"); )

PRIDOBI ali OBJAVI?

Kakšna je razlika med metodama GET in POST? GET posreduje kodirani vhodni niz skozi spremenljivko okolja QUERY_STRING, medtem ko ga POST posreduje skozi stdin. POST je prednostna metoda, zlasti pri obrazcih z veliko podatkov, ker ni omejitev glede količine poslanih informacij, medtem ko je pri GET metodi količina medijske površine omejena. GET pa ima določeno uporabno lastnost; to je podrobno obravnavano v 5. poglavju, Vnos.

Da ugotovi, katera metoda je uporabljena, program CGI preveri spremenljivko okolja REQUEST_METHOD, ki bo nastavljena na GET ali POST. Če je nastavljen na POST, je dolžina kodiranih informacij shranjena v spremenljivki okolja CONTENT_LENGTH.

Kodiran vnos

Ko uporabnik odda obrazec, brskalnik najprej zakodira podatke, preden jih pošlje strežniku in nato aplikaciji CGI. Ko uporabljate oznako , vsako polje dobi simbolično ime. Vrednost, ki jo vnese uporabnik, je predstavljena kot vrednost spremenljivke.

Da bi to ugotovil, brskalnik uporablja specifikacijo kodiranja URL-ja, ki jo lahko opišemo na naslednji način:

  • Ločuje različna polja z znakom & (&).
  • Ločuje ime in vrednosti z enakimi znaki (=), z imenom na levi in ​​vrednostjo na desni.
  • Zamenja presledke z znaki plus (+).
  • Zamenja vse "nenormalne" znake z znakom za odstotek (%), ki mu sledi dvomestna šestnajstiška koda za znak.

Vaš končni kodirani niz bo podoben naslednjemu:

Ime1=vrednost1&ime2=vrednost2&ime3=vrednost3 ...

Opomba: specifikacije za kodiranje URL-jev najdete v RFC1738.

Na primer, recimo, da ste imeli obrazec, ki je zahteval ime in starost. Koda HTML, ki je bila uporabljena za prikaz tega obrazca, je prikazana v seznamu 2.5.

Seznam 2.5. HTML koda za prikaz obrazca z imenom in starostjo.

Ime in starost

Vnesite svoje ime:

Vnesite svojo starost:

Recimo, da uporabnik vnese Joe Schmoe v polje za ime in 20 v polje za starost. Vnos bo kodiran v vhodni niz.

Ime=Joe+Schmoe&starost=20

Razčlenjevanje vnosa

Da bi bile te informacije uporabne, morate uporabiti informacije o nečem, kar lahko uporabljajo vaši programi CGI. Strategije za razčlenjevanje vnosa so obravnavane v 5. poglavju. V praksi vam nikoli ne bo treba razmišljati o tem, kako razčleniti vnos, ker je več strokovnjakov že napisalo knjižnice, ki izvajajo razčlenjevanje in so dostopne vsem. V tem poglavju sta v naslednjih razdelkih predstavljeni dve takšni knjižnici: cgi -lib.pl za Perl (napisal Steve Brenner) in cgihtml za C (napisal jaz).

Splošni cilj večine knjižnic, napisanih v različnih jezikih, je razčleniti kodiran niz in postaviti pare imena in vrednosti v podatkovno strukturo. Obstaja očitna prednost uporabe jezika, ki ima vgrajene podatkovne strukture, kot je Perl; vendar večina knjižnic za nizkonivojske jezike, kot sta C in C++, vključuje strukturo podatkov in izvajanje podprogramov.

Ni potrebno doseči popolnega razumevanja knjižnic; bolj pomembno je, da se naučite, kako jih uporabljati kot orodja za olajšanje dela programerja CGI.

Cgi-lib.pl

Cgi-lib.pl uporablja asociativne nize Perl. Funkcija &ReadParse razčleni vhodni niz in vnese vsak par ime/vrednost po imenu. Na primer, ustrezni nizi Perl, potrebni za dekodiranje pravkar predstavljenega vhodnega niza "ime/starost", bi bili

&ReadParse(*input);

Zdaj, če si želite ogledati vrednost, vneseno za "name", lahko dostopate do asociativne matrike $input("name"). Podobno morate za dostop do vrednosti "age" pogledati spremenljivko $input ("age").

Cgihtml

C nima vgrajenih podatkovnih struktur, zato cgihtml implementira lasten seznam povezav za uporabo s svojimi rutinami za razčlenjevanje CGI. To definira strukturo entertype na naslednji način:

Typedef struct ( Char *name; Char *value; ) Entrytype;

Za razčlenitev vhodnega niza "ime/starost" v C z uporabo cgihtml se uporabi naslednje:

/* deklariramo povezan seznam, imenovan input */ Llist input; /* razčleni vnos in lokacijo na povezanem seznamu */ read_cgi_input(&input);

Za dostop do informacij o starosti lahko seznam razčlenite ročno ali uporabite razpoložljivo funkcijo cgi _val().

#vključi #vključi Char *age = malloc(sizeof(char)*strlen(cgi_val(input, "age")) + 1); Strcpy(starost, cgi_val(vnos, "starost"));

Vrednost "starost" je zdaj shranjena v nizu starosti.

Opomba: Namesto uporabe preproste matrike (kot je char age ;), dinamično dodeljujem pomnilniški prostor za niz age. Čeprav to oteži programiranje, je vseeno pomembno z varnostnega vidika. To je podrobneje obravnavano v 9. poglavju.

Preprost CGI program

Napisali boste program CGI z imenom nameage.cgi, ki obravnava obrazec ime/starost. Obdelava podatkov (kar običajno imenujem "vmesne stvari") je minimalna. Nameage.cgi preprosto dekodira vnos in prikaže uporabnikovo ime in starost. Čeprav takšno orodje ni veliko uporabno, prikazuje najbolj kritičen vidik programiranja CGI: vnos in izhod.

Uporabite isti obrazec kot zgoraj in prikličete polja "ime in starost". Ne skrbite še glede robustnosti in učinkovitosti; rešiti obstoječo težavo na najpreprostejši način. Rešitvi Perl in C sta prikazani v seznamih 2.6 oziroma 2.7.

Seznam 2.6. Nameage.cgi v Perlu

#!/usr/local/bin/perl # nameage.cgi zahteva "cgi-lib.pl" &ReadParse(*input); print "Content-Type: text/html\r\n\r\n"; natisni" \n"; natisni " Ime in starost\n"; natisni "\n"; natisni " \n"; print "Pozdravljeni, " . $input("name") . ". Stari ste\n"; print $input("age") . " let.

\n"; natisni " \n";

Seznam 2.7. nameage.cgi v C

/* nameage.cgi.c */ #include #include "cgi-lib.h" int main() ( llist input; read_cgi_input(&input); printf("Content-Type: text/html\r\n\r\n"); printf(" \n"); printf(" Ime in starost\n"); printf("\n"); printf(" \n"); printf("Pozdravljeni, %s. Ste\n",cgi_val(input,"name")); printf("Star %s let.

\n",cgi_val(vnos,"starost")); printf(" \n"); )

Upoštevajte, da sta ta dva programa skoraj enakovredna. Oba vsebujeta rutine za razčlenjevanje, ki zavzamejo samo eno vrstico in obdelajo celoten vnos (zahvaljujoč ustreznim rutinam knjižnice). Rezultat je v bistvu spremenjena različica vašega glavnega programa Hello, World!

Poskusite zagnati program tako, da izpolnite obrazec in kliknete gumb Pošlji.

Splošna strategija programiranja

Zdaj poznate vsa osnovna načela, potrebna za programiranje CGI. Ko enkrat razumete, kako CGI sprejema informacije in kako jih pošilja nazaj v brskalnik, je dejanska kakovost vašega končnega izdelka odvisna od vaših splošnih sposobnosti programiranja. Namreč, ko programirate CGI (ali karkoli sploh), imejte v mislih naslednje lastnosti:

  • Preprostost
  • Učinkovitost
  • Vsestranskost

Prvi dve lastnosti sta precej pogosti: poskušajte narediti kodo čim bolj berljivo in učinkovito. Vsestranskost velja bolj za programe CGI kot za druge aplikacije. Ko začnete razvijati lastne programe CGI, se boste naučili, da obstaja več osnovnih aplikacij, ki si jih vsakdo želi narediti. Na primer, ena najpogostejših in očitnih nalog programa CGI je obdelava obrazca in pošiljanje rezultatov po e-pošti določenemu prejemniku. Obdelujete lahko več ločenih obrazcev, od katerih ima vsak drug prejemnika. Namesto pisanja programa CGI za vsak obrazec lahko prihranite čas tako, da napišete bolj splošen program CGI, ki velja za vse obrazce.

S pokrivanjem vseh osnovnih vidikov CGI sem vam zagotovil dovolj informacij, da lahko začnete s programiranjem CGI. Če pa želite postati učinkovit razvijalec CGI, morate globlje razumeti, kako CGI komunicira s strežnikom in brskalnikom. Preostanek te knjige podrobno pokriva vprašanja, ki so bila na kratko omenjena v tem poglavju, pa tudi strategijo razvoja aplikacij ter prednosti in omejitve protokola.

Povzetek

V tem poglavju so bile na kratko predstavljene osnove programiranja CGI. Izhod ustvarite s pravilnim formatiranjem podatkov in tiskanjem v stdout. Prejemanje vnosa CGI je nekoliko bolj zapleteno, ker ga je treba pred uporabo razčleniti. Na srečo že obstaja več knjižnic, ki izvajajo razčlenjevanje.

Do zdaj bi morali biti sposobni dokaj preprosto programirati aplikacije CGI. Preostanek te knjige podrobneje opisuje specifikacije, nasvete in strategije programiranja za naprednejše in kompleksnejše aplikacije.