У дома / Покрив / Програмиране с CGI. Електронна търговия - какво е това. E-Commerce Partners Network - партньорска програма на най-големите онлайн магазини Judgment c board cgi

Програмиране с CGI. Електронна търговия - какво е това. E-Commerce Partners Network - партньорска програма на най-големите онлайн магазини Judgment c board cgi

Собствениците на онлайн магазини са запознати с понятието "електронна търговия" от първа ръка, те със сигурност знаят отговора на въпроса "електронна търговия - какво е това". Но ако разберете същността, тогава се появяват много нюанси и този термин придобива по-широк смисъл.

Електронна търговия: какво е това?

Общата концепция е следната: електронната търговия се разбира като определен подход за правене на бизнес, който включва включване на редица операции, които използват цифрово предаване на данни при предоставянето на стоки или предоставянето на услуги/работи, включително чрез Интернет.

По този начин това е всяка търговска сделка, която се извършва с помощта на електронно средство за комуникация.

Схемата на работа е подредена, както следва:

  • всеки може да бъде блогър или всеки друг собственик на собствена интернет страница) се регистрира в тази система;
  • получава своя собствена връзка;
  • поставя специален код на своята уеб страница - появява се реклама на избрания официален партньор на мрежата e-Commerce Partners;
  • следи конверсията на уебсайта;
  • печели определен процент за всяка покупка на посетител на неговия сайт, кликнал върху партньорска връзка.

WP електронна търговия

Голям брой хора вече са запалени по електронната търговия, преди всичко заради желанието да създадат собствен уебсайт, уникален онлайн магазин за продажба на собствени продукти. За да отговорят на това нарастващо търсене, разработчиците са се фокусирали върху създаването на шаблони за електронна търговия (шаблони за електронна търговия). Какво е това ще разгледаме по-нататък.

Един такъв пример за шаблони е електронната търговия на WordPress. Това е плъгин за пазарска количка за WordPress (една от най-известните системи за управление на уеб ресурси, предназначена предимно за създаване и организиране на блогове). Предоставя се напълно безплатно и позволява на посетителите на сайта да правят покупки от интернет страницата.

С други думи, този плъгин ви позволява да създадете онлайн магазин (базиран на WordPress). Този плъгин за електронна търговия има всичко необходими инструменти, настройки и опции, които отговарят на съвременните нужди.

Електронна търговия на разбираем руски език. Как работи бизнесът в Интернет?

Напоследък всичко се натъква повече проектисвързани с онлайн търговията. Изучавайки тази посока, не можах да намеря общо и разбираемо описание на процеса. Затова реших да направя нещо като cheat sheet, на което винаги можете да се обърнете, за да разберете процедурата в такава област като електронната търговия.

Веднага ще направя резервация, че се фокусирах върху процесите и каналите, които помагат да привличат клиенти.

Електронна търговия: за какво става дума?

Определения на различни източницикажете нещо за продажбата на стоки или услуги през Интернет. С прости думиЕлектронната търговия е всяка онлайн дейност, при която се появяват пари.

Пазаруване, продажба, застраховка, банкиране, електронни пари, всичко е тук. Вземете го, подпишете го.

От целта

За да разберем въпроса, предлагам да започнем пътуването от самия край. Каква е целта на всеки бизнес? Точно така, правете пари. Така че, представете си всеки продукт, например силиконови чорапи. Защо не!

Взех първото нещо, което ми дойде на ум, оказа се, че има това ...

Нашата задача е да правим пари от тези чорапи. Ние мислим за интернет. Хмм… защо не „отрежете“ сайта и така ще вървят продажбите, просто ме задръжте на Малдивите! Но не всичко е толкова просто.

Много обичам да рисувам. Помага да се разбере различни процеси. Да рисуваме?!

Досега нашият модел изглежда така. Взимаме чорапи, пускаме ги в интернет и получаваме пари. Просто е страхотно! Очите горят, дланите се потят и вече искам да се заема с този бизнес. Но трябва да направите уебсайт или платформа за продажба?

Уебсайт или платформа за продажба

Има различни решения за поставяне на вашия продукт в World Wide Web. Можете да създадете свой собствен уебсайт или да използвате сайтове на трети страни (групи, страници в социални мрежи, табла за бюлетини и др.). Да спрем на сайта.

Те поръчаха уебсайт, взеха готов шаблон или го създадоха сами с помощта на конструктора (CMS може да се търси в Google), няма значение. След това поставени куп силиконови чорапи различни видовеи щастлив.

Извинете, че прекъснах четенето си. Присъединете се към моя телеграм канал. Свежи съобщения за статии, разработка на дигитални продукти и хак за растеж, всичко е там. Чакам те! Продължаваме ...

Платежни системи

Но за да може човек да купува от вас тук и сега, ще трябва да се стегне платежни системи. Това е вид услуга, която ви позволява да правите покупки онлайн чрез: банкови карти, интернет пари, мобилни телефони и много други. За това ще трябва да споделяте процент от транзакциите, но по този начин значително ще опростите живота си.

Изберете услугата, която ви подхожда. Някъде ще има по-висок процент, а някъде абонат или нещо друго. Просто проучете малко въпроса. Поставете си необходимия код на сайта, свържете всички транзакции с вашата картова сметка и воаля!

Изглежда, че това е всичко. Има уебсайт, продуктови карти и дори бутонът „купува“ работи, но нещо липсва... Няма поток от клиенти, които ще купуват.

Клиентски потоци

Къде: CAC = цена за придобиване на нов клиент. MCC (marketingcampaigncosts) = Общите разходи за маркетингови разходи за придобиване (но не и задържане) на клиенти. W (заплата) = Заплата за търговци и мениджъри по продажбите. S (софтуер) = Разходите за софтуер, използван в рекламата и продажбите (напр. платформа за продажби, маркетингова автоматизация, A/B тестване, услуги за анализ и т.н.). PS (professionalservices) = Разходите за професионални услуги, предоставяни на отделите за маркетинг и продажби (дизайн, консултации и т.н.). O (друго) = Други режийни разходи, свързани с отделите за маркетинг и продажби. CA (придобити клиенти) = Общият брой придобити клиенти.

Но не трябва да забравяме за качеството на клиента, LTV ще помогне тук.

Важни показатели: LTV

Стойност на времето на живо, жизнен цикълклиент, друг показател в електронната търговия, който трябва да се вземе предвид. Показва колко доходи носи средно един клиент. Има различни подходи към изчисляването, като един от най-точните избрах реалната печалба.

Това е просто сумата от общите приходи от историята на покупките за всеки отделен клиент. Добавете сумата от всички клиентски покупки (транзакции) към транзакция N, където транзакция N е последната покупка, която клиентът е направил във вашата компания. Ако имате достъп до всички данни за транзакциите на клиентите, можете лесно да ги изчислите с помощта на Excel.

LTV = (транзакция 1 + транзакция 2 + транзакция 3... + транзакция N) x дял от печалбата в приходите.

Изчисляването на LTV въз основа на нетния доход в крайна сметка показва действителната печалба, която клиентът носи на вашата компания. Тук се вземат предвид разходите за обслужване на клиенти, разходите за задържане, разходите за придобиване и т.н. Резултатът е цял комплекс от изчисления, базирани на индивидуални данни. Кумулативната печалба, генерирана от един клиент във времето, ще ви даде точна представа за рентабилността на клиентите ви до момента.

Други подходи могат да бъдат намерени на.

Важни показатели: съотношение CAC към LTV

За да разберете жизнеспособността на даден бизнес, е много важно да разгледате съотношението на двата споменати CAC:LTV показателя.

  • По-малко от 1:1 - Вие вървите към фалит.
  • 1:1 - Губите пари на всеки привлечен клиент.
  • 1:2 - Звучи добре, но изглежда, че не инвестирате достатъчно и може да се разраствате по-бързо. Стартирайте по-агресивни кампании за привличане на клиенти и постигнете съотношения близо 1:3.
  • 1:3 - Идеално съотношение. Имате процъфтяващ бизнес и силен бизнес модел.

Важни показатели: ROI не се забравя

Както обсъдихме по-горе, в електронната търговия е необходимо ясно да се разбере дали е изгодно да се използва каналът за придобиване или не. В допълнение към LTV и CAC има още един важен показател, това е ROI. Показва дали вашата инвестиция се е изплатила, в нашия случай в рекламата. т.е. колко ни донесе 1 инвестирана рубла в крайна сметка.

За изчислението се използва много проста формула:

Където „Приходи от кампанията“ е разликата между приходите от канала и цената на вашия продукт. И за да изчислите печалбата, извадете повече рекламни разходи.

Така по-подробна формула ще изглежда така:

ROI = (Приходи от канала - Разходи) - Разходи за реклама / Разходи за реклама x 100%

| Повече ▼ подробен примерчетете с отчитане. Всъщност тази проста формула е поставена в една и съща таблица на Excel, където всичко се изчислява автоматично.

И трите индикатора, които анализирахме, са важни в електронната търговия. Всеки от тях ви позволява да намирате тесни места във вашите потоци и да работите с тях. Именно в тях се крие потенциалът за растеж на бизнеса. Добавих още малко към нашия модел с чорапи.

Не е възможно всичко да се събере в един материал и кой ще го чете толкова дълго? По-късно ще направя отделно ръководство за нюансите на електронната търговия, които могат да попречат на продажбите.

Обща сума

Като цяло вече имате общо разбиране за онлайн търговията или електронната търговия. Освен това, както се казва: "Дяволът е в детайлите." Проучете всеки от каналите поотделно, изчислете показателите за ефективност и потърсете нови прозрения в детайлите. Интернет продажби за вас, да повече! И още нещо от мен.

Да, почти забравих, Честита Нова година на вас, скъпи читатели! Пожелавам ви страхотни победи и постижения през следващата година!

Общият интерфейс на шлюза (CGI, Russian Common Gateway Interface) е стандартен метод за динамично управление на съдържанието на уеб страници с помощта на специални програми, които се изпълняват от страна на уеб сървъра. Тези програми се наричат ​​CGI манипулатори или шлюзове, но по-често се наричат ​​CGI скриптове. те обикновено са написани на скриптови езици, предимно Perl.

Тъй като хипертекстът е статичен по природа, уеб страницата не може да взаимодейства директно с потребителя. Преди настъпването JavaScript, нямаше друг начин да се отговори на действията на потребителя, освен да се прехвърлят въведените от него данни към уеб сървъра за по-нататъшна обработка. В случай на CGI, тази обработка се извършва от външни програми и скриптове, достъпни чрез стандартизиран (виж RFC 3875: CGI версия 1.1) интерфейс - общ шлюз. Опростен модел, илюстриращ как работи CGI, е показан на фиг. един.

Как работи CGI?

Обобщен алгоритъм за работа чрез CGI може да бъде представен по следния начин:

  1. Клиентът иска CGI приложение от своя URI.
  2. Уеб сървърът получава заявката и се инсталира променливи на средата, чрез който данните и служебната информация се предават към приложението.
  3. Уеб сървърът пренасочва заявките през стандартния входен поток (stdin) към входа на извиканата програма.
  4. CGI приложението изпълнява всички необходими операции и генерира резултатите като HTML.
  5. Генерираният хипертекст се връща на уеб сървъра чрез стандартен изход (stdout). Съобщенията за грешки се предават през stderr.
  6. Уеб сървърът изпраща резултатите от заявката до клиента.

Приложения на CGI

Най-честата задача, за която се използва CGI, е създаването на интерактивни страници, чието съдържание зависи от действията на потребителя. Типични примери за такива уеб страници са формуляр за регистрация на уебсайт или формуляр за коментар. Друга област на приложение на CGI, оставаща зад кулисите на потребителското взаимодействие, е свързана със събирането и обработката на информация за клиента: настройка и четене на "бисквитки" - бисквитки; получаване на данни за браузъра и операционната система; отчитане на броя на посещенията на уеб страница; мониторинг на уеб трафика и др.

Тези възможности се осигуряват от факта, че CGI скриптът може да се свърже с база данни или да получи достъп до файловата система на сървъра. По този начин CGI скриптът може да съхранява информация в таблици или файлове на база данни и да я извлича от там при поискване, което не може да се направи с HTML.

МОЛЯ, ЗАБЕЛЕЖКА: CGI не е език за програмиране! Това е прост протокол, който позволява на уеб сървър да предава данни през stdin и да ги чете от stdout. Следователно всяка сървърна програма, която може да работи със стандартни I/O потоци, може да се използва като CGI манипулатор.

Здравей свят!

Пример за прост Perl CGI скрипт е показан в листинг 1. Ако този код е записан във файл, наречен hello (всяко име може да бъде, разширението е същото), поставете файла в директорията cgi-bin на сървъра (по-точно , в тази директория на уеб сървъра, която е предназначена за CGI приложения и е посочена в настройките на уеб сървъра) и задайте разрешенията за изпълнение на този файл (chmod uo+x hello), след което той ще стане достъпен на адреса http: //име на сървъра/cgi-bin/hello.

Листинг 1. Пример за CGI скрипт (Perl)

#!/usr/bin/perl print "Тип на съдържанието: текст/html\n\n"; печат< CGI Кажи здравей

Здравей свят!

HTML изход;

В този код редът #!/usr/bin/perl посочва пълния път до интерпретатора на Perl. Низ Content-type: text/html\n\n - http заглавка, указваща типа съдържание ( тип мим). Знакът за двоен прекъснат ред (\n\n) е задължителен и разделя заглавките от тялото на съобщението.

Променливи на околната среда

Всички CGI приложения имат достъп до променливи на средата, зададени от уеб сървъра. Тези променливи играят важна роля при писането на CGI програми. Таблицата изброява някои от променливите, достъпни за CGI.

променлива на средатаОписание
ТИП СЪДЪРЖАНИЕ Типът на данните, изпратени до сървъра. Използва се, когато клиентът изпраща данни, като например качване на файл.
CONTENT_LENGTHЗаявете размер на съдържанието. Тази променлива е дефинирана за POST заявки.
HTTP_COOKIEВръща набор от бисквитки като двойки ключ-стойност.
HTTP_USER_AGENTИнформация за потребителския агент (браузър)
PATH_INFOПът на CGI директория
QUERY_STRINGНиз на заявка (кодиран с URL адрес), предаден от метода GET.
REMOTE_ADDRIP адресът на клиента, отправил заявката.
REMOTE_HOSTПълно име (FQDN) на клиента. (Ако е налична)
REQUEST_METHODМетодът, по който се прави заявката. Най-често GET или POST.
SCRIPT_FILENAMEПълен път до искания скрипт (във файловата система на сървъра).
SCRIPT_NAMEИме на скрипта
ИМЕ НА СЪРВЪРАИме на сървъра
SERVER_ADDRIP сървър
SERVER_SOFTWAREИнформация за сървърния софтуер

Списък 2 показва малка програма на Perl, която изброява променливи на средата. Резултатът от нейната работа е показан на фиг. 2.

Листинг 2. Променливи на средата

#!/usr/bin/perl print "Тип на съдържанието: текст/html\n\n"; печат" \н \н

Заобикаляща среда

\n"; foreach (клавиши за сортиране %ENV) ( печат " $_: $ENV($_)
\n"; ) отпечатай "\н"; изход;

Прехвърляне на данни: метод GET

Методът GET се използва за предаване на урленкодирани данни през низа на заявката. Адресът на заявения ресурс (CGI скрипт) и данните, предавани към него, са разделени със знак "?". Пример за такъв адрес:

http://example.com/cgi-bin/script.cgi?key1=value1&key2=value2

Методът GET се използва по подразбиране за данни, въведени в адресната лента на браузъра. Същият низ може да бъде генериран при подаване на данни от уеб формуляр (tag

), ако методът за подаване на формуляра не е посочен. Цялата информация, изпратена чрез метода GET, се изпраща в ясна форма, така че никога не трябва да я използвате за изпращане на пароли или друга подобна информация до сървъра. Методът GET има ограничение за размера: низът на заявката не трябва да бъде по-дълъг от 1024 знака.

Информацията, изпратена от метода GET, се предава в заглавката QUERY_STRING като низ, състоящ се от двойки от формата ключ=стойност, CGI скриптът може да го получи чрез променливата на средата със същото име.

Листинг 3. Изпращане на данни от уеб формуляр с помощта на метода GET

Прост CGI скрипт: Изпращане на данни чрез GET метод Името ви: име = "потребител">
От къде си?: име = "от">

След въвеждане на данни във формуляра от листинг 3 и щракване върху бутона „Изпращане“, ще бъде генериран низ за заявка на формуляра:

http://example.com/cgi-bin/ кажи здравей?потребител=някакъв текст&от=друг текст

където: sayhello е името на CGI скрипта; потребител и от - имена на параметри; sometext и anothertext са стойностите, въведени от потребителя за съответните параметри.

Списък 4 е примерен скрипт, който може да обработва данните от формуляра от листинг 3.

Листинг 4. Изпращане на данни от уеб формуляр с помощта на метода GET

#!/usr/bin/perl local ($buffer, @pairs, $pair, $name, $value, %FORM); # Анализирайте средата $ENV("REQUEST_METHOD") =~ tr/a-z/A-Z/; ако ($ENV(" REQUEST_METHOD")eq" ВЗЕМЕТЕ") ( $buffer = $ENV(" QUERY_STRING"); ) # Разделете низа на заявката на двойки ключ/стойност @pairs = split(/&/, $buffer); foreach $pair (@pairs) (($name, $value) = split(/=/, $ двойка); $value =~ tr/+/ /; $value =~ s/%(..)/pack("C", шестнадесетичен($1))/например; $FORM($name) = $value; # Запазване на данни в масив ) # Изпращане на печат на заглавка "Content-type: text/html\n\n"; # Изпращане на печат на хипертекст< CGI Кажи здравей

Здравейте, $FORM(user) от $FORM(from)!

HTML изход;

Трансфер на данни: метод POST

Като цяло методът POST е по-подходящ за предаване на информация към CGI скрипт. Преданият блок от данни се формира по същия начин, както при метода GET, но самото прехвърляне се извършва в тялото на заявката. Данните се въвеждат в CGI приложението чрез стандартен вход (stdin).

За да изпратите данни с този метод, те трябва да бъдат изрично зададени в описанието на формуляра (action="POST").

За да обработи входа, CGI скриптът трябва да чете stdin и за да направи това правилно, той трябва да знае размера на съобщението от променливата CONTENT_LENGTH. За да илюстрираме това, нека модифицираме блока за анализ на средата в листинг 4, като го заменим със следния код:

... # Анализирайте средата $ENV("REQUEST_METHOD") =~ tr/a-z/A-Z/; ако ($ENV(" REQUEST_METHOD")eq" ПУБЛИКАЦИЯ")(Прочети( STDIN, $буфер, $ENV(" CONTENT_LENGTH"}); } ...

По-нататъшната обработка на параметрите и техните стойности, съхранени в променливата $buffer, се извършва по същия начин, както в случая на използване на метода GET.

Предимства на CGI

Много CGI функции сега се дублират от технологии като DHTML, ActiveX или Java аплети. Основното предимство на използването на сървърни скриптове е, че можете да сте сигурни, че всички клиенти (с редки изключения, обикновено свързани с блокиране на достъп до определени ресурси на ниво защитна стена) ще могат да работят със сървърното приложение. Клиентските програми могат просто да бъдат деактивирани в браузъра или изобщо да не се поддържат.

Недостатъци на CGI

Най-големият недостатък на тази технология са повишените изисквания за производителност на уеб сървъра. Факт е, че всяко извикване на CGI приложението предизвиква генериране на ново процес, с всички свързани режийни разходи. Ако приложението е написано с грешки, тогава е възможна ситуация, когато например се зацикли. Браузърът ще прекрати връзката, когато изтече времето за изчакване, но от страна на сървъра процесът ще продължи, докато администраторът не го прекрати принудително. В това отношение скриптовете от страна на клиента имат значително предимство, тъй като те те работят локално.

Друг недостатък на CGI е, че уеб сървърът е по-малко сигурен от другите решения. Неправилната конфигурация на правата за достъп до сървърни ресурси от CGI приложение може да застраши не само производителността на уеб сървъра, но и информационната сигурност. Въпреки това, всяка мрежова технология може да се счита за потенциално несигурнавече по дефиниция.

Постоянен адрес на тази страница:

Глава 9.

Програмиране с CGI

Включването на раздел за CGI в книга с база данни може да изглежда толкова странно, колкото да имаш глава за ремонт на автомобили в готварска книга. Разбира се, за да отидете до хранителния магазин, имате нужда от изправна кола, но подходящо ли е да се говори за това? Пълното въведение в CGI и уеб програмирането като цяло е извън обхвата на тази книга, но краткото въведение в тези теми е достатъчно, за да разшири способността на MySQL и mSQL да представят данни в сферата на мрежата.

Тази глава е предназначена главно за тези, които изучават бази данни, но биха искали да придобият и познания за уеб програмирането. Ако фамилното ви име е Бернърс-Лий или Андресен, едва ли ще намерите тук нещо, което вече не знаете. Но дори и да не сте нов в CGI, да разполагате с бърза справка, докато се гмуркате в мистериите на MySQL и mSQL, може да бъде от голяма полза.

Какво е CGI?

Както повечето акроними, Common Gateway Interface (CGI означава Common Gateway Interface) всъщност не казва много. Интерфейс с какво? Къде е този шлюз? За каква общност говорим? За да отговорим на тези въпроси, нека се върнем малко назад и да разгледаме WWW като цяло.

Тим Бърнърс-Лий, физик, работещ в CERN, излезе с мрежата през 1990 г., въпреки че планът датира от 1988 г. Идеята беше да се даде възможност на изследователите по физика на частиците лесно и бързо да обменят мултимедийни данни - текст, изображения и звук - чрез интернет. WWW се състои от три основни части: HTML, URL и HTTP. HTML-езикът за форматиране, използван за представяне на съдържание в мрежата. url-това е адресът, използван за получаване на съдържание в HTML формат (или по друг начин) от уеб сървъра. И накрая http-това е език, който уеб сървърът разбира и позволява на клиентите да изискват документи от сървъра.

Възможността за изпращане на всякакъв вид информация през Интернет беше революция, но скоро беше открита друга възможност. Ако можете да изпращате всеки текст през мрежата, тогава защо не можете да изпратите текст, създаден от програма, а не взет от готов файл? Това отваря море от възможности. Един прост пример е да използвате програма, която отпечатва текущото време, така че читателят да вижда правилното време всеки път, когато преглежда страницата. Няколко умни глави в Националния център за суперкомпютърни приложения (NCSA), които изграждаха уеб сървър, видяха тази възможност и скоро се роди CGI.

CGI е набор от правила, чрез които програмите на сървър могат да изпращат данни до клиенти чрез уеб сървър. CGI спецификацията беше придружена от промени в HTML и HTTP, които въведоха нова функция, известна като формуляри.

Докато CGI позволява на програмите да изпращат данни до клиент, формите разширяват тази възможност, като позволяват на клиента да изпраща данни към тази CGI програма. Сега потребителят може не само да види текущото време, но и да настрои часовника! CGI формите отвориха вратата към истинската интерактивност в света на мрежата. Често срещаните CGI приложения включват:

  • Динамичен HTML. Цели сайтове могат да бъдат генерирани от една CGI програма.
  • Търсачки, които намират документи с думи, зададени от потребителя.
  • Книги за гости и табла за обяви, където потребителите могат да добавят своите съобщения.
  • Формуляри за поръчка.
  • Въпросници.
  • Извличане на информация от база данни, хоствана на сървъра.

В следващите глави ще обсъдим всички тези CGI приложения, както и няколко други. Всички те предоставят отлична възможност за свързване на CGI към база данни, което ни интересува в този раздел.

HTML формуляри

Преди да проучите спецификата на CGI, е полезно да разгледаме най-често срещания начин, по който крайните потребители получават интерфейс към CGI програми: HTML форми. Формулярите са част от HTML езика, който предоставя на крайния потребител различни видове полета. Данните, въведени в полетата, могат да бъдат изпратени на уеб сървъра. Полетата могат да се използват за въвеждане на текст или да бъдат бутони, върху които потребителят може да щракне или да постави отметка. Ето пример за HTML страница, съдържаща формуляр:

<НТМL><НЕАD><ТITLЕ>Моята страница с формуляр


<р>Това е страница с формуляр.


Въведете вашето име:



Този формуляр създава низ от 40 знака, където потребителят може да въведе името си. Под реда за въвеждане има бутон, при натискане на данните от формуляра се прехвърлят към сървъра. Следват маркерите, свързани с формуляра, поддържани от HTML 3.2, най-широко използвания стандарт днес. Имената на маркери и атрибути могат да бъдат въведени във всеки случай, но ние се придържаме към незадължителната конвенция, че отварящите тагове се изписват с главни букви, а затварящите – с малки.


Този таг сочи към началото на формуляра. В края на формуляра се изисква затварящ етикет

. Между таговете
Разрешени са три атрибута: ACTION определя URL или относителен път към CGI програмата, към която ще бъдат изпратени данните; METHOD определя HTTP метода, чрез който ще бъде изпратен формулярът (това може да бъде GET или POST, но почти винаги ще използваме POST); ENCTYPE указва метода за кодиране на данни (трябва да се използва само ако имате ясно разбиране за това, което правите).


Осигурява най-гъвкавия начин за въвеждане на потребителя. Всъщност има девет различни типа етикети . Типът се посочва от атрибута TYPE. Предишният пример използва два маркера : единият от тип SUBMIT, а другият от тип TEXT по подразбиране. Деветте вида са както следва:

ТЕКСТ

Поле, в което потребителят може да въведе един ред текст.

ПАРОЛА

Същото като ТЕКСТ, но въведения текст не се показва на екрана.

КУТЕ ЗА ОТМЕТКА

Флаг, който потребителят може да зададе и изчисти.

РАДИО

Бутон за избор, който трябва да бъде комбиниран с поне един друг радио бутон. Потребителят може да избере само един от тях.

ИЗПРАЩАНЕ

Бутонът, който при натискане изпраща формуляра на уеб сървъра.

НУЛИРАНЕ

Бутон, който при щракване възстановява формата до стойностите по подразбиране.

ФАЙЛ

Подобно на текстово поле, но изисква въвеждане на името на файл, който ще бъде изпратен на сървъра.

СКРИТО

Невидимо поле, което може да съхранява данни.

ИЗОБРАЖЕНИЕ

Подобно на бутона SUBMIT, но можете да зададете изображение за изображението върху бутона.

С изключение на етикети TYPE на атрибут обикновено имат атрибут NAME, който свързва данните, въведени в полето, с някакво име. Името и данните се предават на сървъра в стил value=value. В предишния пример текстовото поле беше именувано първо име. Можете да използвате атрибута VALUE, за да зададете полета от тип TEXT, PASSWORD, FILE и HIDDEN на предварително дефинирани стойности. Същият атрибут, използван с бутони като SUBMIT или RESET, показва посочения текст върху тях. Полетата от тип RADIO и CHECKBOX могат да се показват като зададени с помощта на атрибут CHECKED без стойност.

Атрибутът SIZE се използва за задаване на дължината на полетата TEXT, PASSWORD и FILE. Атрибутът MAXLENGTH може да се използва за ограничаване на дължината на въведения текст. Атрибутът SRC определя URL адреса на изображението, използвано в типа IMAGE. И накрая, атрибутът ALIGN определя подравняването на изображението за типа ИЗОБРАЖЕНИЕ и може да бъде НАГОРЕ, СРЕДНО, ДОЛНО (по подразбиране), НАЛЯВО или ДЯСНО (отгоре, в средата, отдолу, отляво, отдясно).

.

Харесайте етикета , на етикета , и всеки текст между етикетите ще бъде приет като текст по подразбиране , подобно на атрибута VALUE за маркер . За етикет

, давайки място за влизане в есето. Данните се наричат ​​"есе". Текстовият блок е с ширина 70 знака и дълбочина 10 реда. Разстояние между етикетите

може да се използва като примерно есе. -->

типове "SUBMIT" и "RESET" съответно. Бутонът „ИЗПРАЩАНЕ“ има отменен етикет „Въведете данни“, а бутонът „НУЛИРАНЕ“ има етикет по подразбиране (дефиниран от браузъра). Щракването върху бутона "ИЗПРАЩАНЕ" ще изпрати данните на уеб сървъра, бутонът "НУЛИРАНЕ" ще възстанови R данните в първоначалното им състояние, изтривайки всички въведени от потребителя данни. -->


Единственият входен тип, който не сме използвали тук, е типът IMAGE за етикета . Може да се използва като алтернативен метод за подаване на формуляр. Типът IMAGE обаче рядко е съвместим с базирани на текст и не толкова отзивчиви браузъри, така че е разумно да го избягвате, освен ако вашият сайт няма богат графичен стил.

След като вече сте запознати с основите на HTML формите, сте готови да проучите самия CGI.

CGI спецификация

И така, какъв точно е „наборът от правила“, който позволява на CGI програма в, да речем, Батавия, Илинойс, да комуникира с уеб браузър във Външна Монголия? Официалната CGI спецификация, заедно с множество друга информация за CGI, може да бъде намерена на сървъра на NCSA на адрес http://hoohoo . ncsa.uluc.edu/cgi/.Тази глава обаче съществува, за да не се налага да пътувате дълго и да я търсите сами.

Има четири начина, по които CGI предава данни между рамката CGI-npor и уеб сървъра, а оттам и уеб клиента:

  • променливи на средата.
  • Командна линия.
  • Стандартно входно устройство.
  • стандартно изходно устройство.

С тези четири метода сървърът изпраща всички данни, изпратени от клиента до CGI програмата. След това CGI програмата прави своята магия и изпраща изхода обратно на сървъра, който го препраща към клиента.

Тези данни са базирани на Apache HTTP сървър. Apache е най-широко използвания уеб сървър и работи на почти всяка платформа, включително Windows 9x и Windows NT. Те обаче могат да се прилагат към всички HTTP сървъри, които поддържат CGI. Някои собствени сървъри, като тези от Microsoft и Netscape, може да имат допълнителни функции или да работят по различен начин. Тъй като лицето на мрежата продължава да се променя с невероятна скорост, стандартите все още се развиват и бъдещето със сигурност ще се промени. Въпреки това, що се отнася до CGI, тази технология изглежда е добре установена - цената за това е, че други технологии, като аплети, я изместиха. Всички CGI програми, които пишете, използвайки тази информация, почти сигурно ще могат да работят на повечето уеб сървъри в продължение на много години напред.

Когато CGI програма се извиква чрез формуляр, най-често срещаният интерфейс, браузърът изпраща дълъг низ до сървъра, който започва с пътя към CGI програмата и нейното име. Това е последвано от различни други данни, наречени информация за пътя, които се предават на CGI програмата чрез променливата на средата PATH_INFO (Фигура 9-1). Информацията за пътя е последвана от "?", последвано от данните от формуляра, които се изпращат на сървъра с помощта на метода HTTP GET. Тези данни се предоставят на CGI програмата чрез променливата на средата QUERY_STRING. Всички данни, които страницата изпраща чрез метода HTTP POST, който е най-често използваният, ще бъдат предадени на CGI програмата чрез стандартно устройствовход. Типичен низ, който сървърът може да получи от браузър, е показан на фигура 1. 9-1. именувана програма formreadв каталога cgi-binизвикан от сървъра с допълнителна информация за пътя допълнителна информацияи данни за заявка за избор=помощ - вероятно като част от оригиналния URL адрес. И накрая, самите данни от формуляра (текстът „CGI програмиране“ в полето „ключови думи“) се изпращат чрез метода HTTP POST.

Променливи на околната среда

Когато сървърът изпълнява CGI програма, той преди всичко предава някои данни към нея, за да се изпълнява под формата на променливи на средата. Има седемнадесет променливи, официално дефинирани в спецификацията, но много повече се използват неофициално чрез механизъм, описан по-долу, наречен HTTP_/nec/zams/n. CGI програма

има достъп до тези променливи, точно както всички променливи на обкръжаващата обвивка, когато се изпълнява от командния ред. В шел скрипт, например, променливата на средата F00 може да бъде достъпна като $F00; в Perl това извикване изглежда като $ENV("F00") ; в C - getenv("F00") ; и т. н. Таблица 9-1 изброява променливите, които винаги се задават от сървъра, дори и да са нулеви. В допълнение към тези променливи, данните, върнати от клиента в заглавката на заявката, се присвояват на променливи от формата HTTP_F00 , където F00 е името на заглавката. Например повечето уеб браузъри включват информация за версията в заглавка с име USEfl_AGENT. Вашата CGI npor рамка може да получи тази информация от променливата HTTP_USER_AGENT.

Таблица 9-1.CGI променливи на средата

променлива на средата

Описание

CONTENT_LENGTH

Дължината на данните, предавани от методите POST или PUT, в байтове.

ТИП СЪДЪРЖАНИЕ

Типът MIME на прикачените данни с помощта на методите POST или PUT.

GATEWAY_INTERFACE

Номер на версията на CGI спецификацията, поддържана от сървъра.

PATH_INFO

Допълнителна информация за пътя, предоставена от клиента. Например за заявка http://www.myserver.eom/test.cgi/this/is/a/ път?поле=зеленостойността на променливата PATH_INFO ще бъде /това/е/а/път.

PATH_TRANSLATED

Същото като PATH_INFO, но сървърът произвежда всичко


Възможен превод, например разширение на име като "-account". »

QUERY_STRING

Всички данни след "?" в URL адреса. Това също са данните, предавани, когато REQ-UEST_METHOD на формуляра е GET.

REMOTE_ADDR

IP адресът на клиента, отправил заявката.

REMOTE_HOST

Името на хоста на клиентската машина, ако е налично.

REMOTE_IDENT

Ако уеб сървърът и клиентът поддържат идентификация на типа идентификатор,тогава това е потребителското име на акаунта, който прави заявката.

REQUEST_METHOD

Методът, използван от клиента, за да направи заявката. За CGI програмите, които предстои да създадем, това обикновено ще бъде POST или GET.

ИМЕ НА СЪРВЪРА Името на хоста - или IP адреса, ако името не е налично - на машината, на която работи уеб сървърът.
SERVER_PORT Номерът на порта, използван от уеб сървъра.
SERVER_PROTOCOL
Протоколът, използван от клиента за комуникация със сървъра. В нашия случай този протокол почти винаги е HTTP.
SERVER_SOFTWARE Информация за версията на уеб сървъра, изпълняващ CGI програмата.

SCRIPT_NAME

Пътят до скрипта, който трябва да се изпълни, както е посочено от клиента. Може да се използва, когато URL адресът се позовава на себе си и така, че скриптовете, посочени на различни места, могат да се изпълняват по различен начин в зависимост от мястото.

Ето примерен Perl CGI скрипт, който извежда всички променливи на средата, зададени от сървъра, както и всички наследени променливи, като PATH, зададени от обвивката, която стартира сървъра.

#!/usr/bin/perl -w

печат<< HTML;

Тип съдържание: текст/html\n\n

<р>Променливи на околната среда

HTML

foreach (клавиши %ENV) ( отпечатайте "$_: $ENV($_)
\н"; )

печат<

HTML

Всички тези променливи могат да бъдат използвани и дори модифицирани от вашата CGI програма. Тези промени обаче не засягат уеб сървъра, който стартира програмата.

Командна линия

CGI позволява да се предават аргументи на CGI програма като опции на командния ред, което рядко се използва. Използва се рядко, тъй като практическите му приложения са малко и няма да се спираме подробно на него. Изводът е, че ако променливата на средата QUERY_STRING не съдържа знака "=", тогава CGI програмата ще бъде изпълнена с параметри на командния ред, взети от QUERY_STRING. Например, http://www.myserver.com/cgi- bin/prst? rootще върви пръст root на www.myserver.com.

Има две основни библиотеки, които предоставят CGI интерфейса на Perl. Първият от тях - cgi-lib.plПолезност cgi-lib.plмного често, защото дълго време това беше единствената налична голяма библиотека. Тя е проектирана да работи в Perl 4, но също така работи и с Perl 5. Втората библиотека, CGI.pm,по-нов и в много отношения превъзходен cgi-lib.pl CGI.pmнаписан за Perl 5 и използва напълно обектно-ориентирана схема за работа с CGI данни. модул CGI.pmанализира стандартния вход и променливата QUERY_STRING и съхранява данните в CGI обект. Вашата програма трябва само да създаде нов CGI обект и да използва прости методи като paramQ, за да извлече данните, от които се нуждаете. Пример 9-2 служи като кратка демонстрация как CGI.pmинтерпретира данните. Всички Perl примери в тази глава ще бъдат използвани CGI.pm.

Пример 9-2. Разбор на CGI данни в Perl

#!/usr/bin/perl -w

използвайте CGI qw(:standard);

# Използва се модулът CGI.pm. qw(:standard) импортиране

# пространство от имена на стандартни CGI функции за получаване

# код за почистване. Това може да стане, ако скриптът

# използва се само един CGI обект.

$mycgi = нов CGI; #Създайте CGI обект, който ще бъде "шлюзът" към данните от формуляра

@fields = $mycgi->param; # Извлечете имената на всички попълнени полета на формуляра

print header, start_html("CGI.pm тест"); ft методи "header" и "start_html",

# предоставени

# CGI.pm улеснява получаването на HTML.

# "header" извежда необходимия HTTP хедър, a

#"start_html" извежда HTML заглавка с даденото име,

#a също таг .

печат"<р>Данни за формуляра:
";

foreach (@fields) (печат $_, ":",- $mycgi->param($_), "
"; }

# За всяко поле покажете името и стойността, получени чрез

# $mycgi->param("име на поле").

печат end_html; # Съкращение за извеждане на крайни тагове "".

Обработка на входа в C

Тъй като основните API за MySQL и mSQL са написани на C, ние няма да изоставим напълно C в полза на Perl, но ще предоставим някои примери за C, където е уместно. Има три широко използвани C библиотеки за CGI програмиране: cgicТом Бутел*; cgihtmlЮджийн Ким т и libcgiот EIT*. Ние вярваме в това cgicе най-пълният и лесен за използване. Липсва му обаче възможността да изброява всички променливи на формата, когато те не са ви известни предварително. Всъщност може да се добави с обикновена корекция, но това е извън обхвата на тази глава. Следователно в Пример 9-3 използваме библиотеката cgihtml,за да повторите горния Perl скрипт в C.

Пример 9-3.Разбор на CGI данни в C

/* cgihtmltest.c - Обща CGI програма за отпечатване на ключове и техните стойности

от данните, получени от формата */

#включи

#include "cgi-lib.h" /* Това съдържа всички дефиниции на CGI функции */

#include "html-lib.h" /* Това съдържа "всички дефиниции на помощни функции за HTML */

void print_all(lllist 1)

/* Тези функции извеждат подадени от формуляра данни в същия формат като горния Perl скрипт. Cgihtml също предоставя вградена функция

Print_entries(), който прави същото, използвайки HTML формата на списък. */ (

възел*прозорец;

/* Типът "възел" е дефиниран в библиотеката cgihtml и се отнася до свързан списък, който съдържа всички данни на формуляра. */

прозорец = i.head; /* Задава указател към началото на данните от формуляра */

while (window != NULL) ( /* Преминаване през свързания списък до последния (първи празен) елемент */

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

/* Изходни данни. Replace__ltgt() е функция, която разбира HTML кодирането на текста и гарантира, че то се показва правилно в клиентския браузър. */

прозорец = прозорец->следващ; /* Преминаване към следващия елемент в списъка. */

} }

int main() (

списък на записи; /* Указател към анализирани данни*/

int състояние; /* Цяло число, представляващо състоянието */

html_header(); /* HTML помощна функция, която извежда HTML заглавката */

html_begin("cgihtml тест");

/* HTML помощна функция, която извежда началото на HTML страницата с посоченото заглавие. */

състояние = read_cgi_input(&entries); /* Извършва въвеждане и анализ на данни от формуляра */

printf("<р>Данни за формуляра:
");

print_all(записи); /* Извиква функцията print_all(), дефинирана по-горе. */

html_end(); /* HTML помощна функция, която извежда края на HTML страницата. */

Изчистване на списъка (&записи); /* Освобождава паметта, заета от данните на формуляра. */

връщане на 0; )

Стандартно изходно устройство

Данните, изпратени от CGI програма към стандартен изход, се четат от уеб сървъра и се изпращат на клиента. Ако името на скрипта започва с nph-,данните се изпращат директно до клиента без намеса от уеб сървъра. В този случай CGI програмата трябва да генерира валидна HTTP заглавка, която клиентът ще разбере. AT в противен случайоставете уеб сървъра да генерира HTTP заглавката вместо вас.

Дори и да не използвате nph-script, трябва да дадете на сървъра една директива, която ще му каже информация за вашето издаване. Това обикновено е HTTP заглавка Content-Type, но може да бъде и заглавка Location. Заглавието трябва да бъде последвано от празен ред, т.е. нов ред или комбинация CR/LF.

Заглавката Content-Type казва на сървъра какъв тип данни обслужва вашата CGI програма. Ако това е HTML страница, тогава низът трябва да бъде Content-Type: текст/html.Заглавката Location казва на сървъра различен URL - или различен път на същия сървър - къде да насочи клиента. Заглавието трябва да изглежда така: Местоположение: http:// www. моя сървър. com/друго/място/.

След HTTP заглавките и празния низ можете да изпратите действителните данни, които вашата програма произвежда - HTML страница, изображение, текст или нещо друго. Сред CGI програмите, които идват със сървъра на Apache, са nph-test-cgiи тест cgi,които добре демонстрират разликата между nph и non-nph заглавия, съответно.

В този раздел ще използваме библиотеките CGI.pmи cgic,които имат функции за извеждане както на HTTP, така и на HTML заглавки. Това ще ви позволи да се съсредоточите върху изхода на действителното съдържание. Тези помощни функции се използват в примерите по-рано в тази глава.

Важни характеристики на CGI скриптовете

Вече знаете основно как работи CGI. Клиентът изпраща данни, обикновено чрез формуляр, до уеб сървъра. Сървърът изпълнява CGI програмата, като й предава данни. CGI програмата извършва своята обработка и връща изхода си на сървъра, който го изпраща на клиента. Сега, от разбирането как работят CGI-npor рамки, трябва да преминем към разбирането защо са толкова широко използвани.

Въпреки че вече знаете достатъчно от тази глава, за да съставите проста работеща CGI програма, има още няколко неща, които трябва да разберете. важни въпросипреди да създадете наистина работещи програми за MySQL или mSQL. Първо, трябва да се научите как да работите с множество форми. След това трябва да научите някои мерки за сигурност, които ще попречат на нападателите да получат незаконен достъп до вашите сървърни файлове или да ги унищожат.

Държавна памет

Отчитането на състоянието е жизненоважно средство за предоставяне на добра услуга на вашите потребители, а не само за борба с закоравелите престъпници, както може да изглежда. Проблемът е причинен от факта, че HTTP е така нареченият протокол "без памет". Това означава, че клиентът изпраща данни на сървъра, сървърът връща данни на клиента и след това всеки тръгва по своя път. Сървърът не съхранява данни за клиента, които може да са необходими при последващи операции. По същия начин няма гаранция, че клиентът ще запази данни за транзакцията, които могат да бъдат използвани по-късно. Това налага незабавно и значително ограничение на използването на World Wide Web.

Скриптирането на CGI по този протокол е аналогично на това да не можете да запомните разговор. Всеки път, когато говорите с някого, независимо колко често сте говорили с него преди, трябва да се представите и да намерите обща тема за разговор. Излишно е да казвам, че това не е благоприятно за производителността. Фигура 9-2 показва, че всеки път, когато заявка достигне до CGI програма, това е напълно нов екземпляр на програмата без връзка с предишната.

От страна на клиента, с появата на Netscape Navigator, имаше хакерско изглеждащо решение, наречено бисквитки. Състои се от създаване на нова HTTP заглавка, която може да се изпраща напред и назад между клиента и сървъра, подобно на заглавките Content-Type и Location. Клиентският браузър, след като получи заглавката на бисквитката, трябва да съхрани данните в бисквитката, както и името на домейна, в който работи бисквитката. След това, когато се посети URL в рамките на посочения домейн, заглавката на бисквитката трябва да бъде върната на сървъра за използване в CGI програми на този сървър.

Методът на бисквитките се използва главно за съхраняване на потребителския идентификатор. Информацията за посетителите може да се съхранява във файл на машината на сървъра. Уникалният идентификатор на този потребител може да бъде изпратен като бисквитка до браузъра на потребителя, след което всеки път, когато потребителят посети сайта, браузърът автоматично изпраща този идентификатор на сървъра. Сървърът предава ID на CGI програмата, която отваря съответния файл и получава достъп до всички данни за потребителя. Всичко това се случва по начин, който е невидим за потребителя.

Колкото и полезен да е този метод, повечето големи сайтове не го използват като единствено средство за запомняне на състоянието. Има редица причини за това. Първо, не всички браузъри поддържат бисквитки. Доскоро основният браузър за хора с увредено зрение (да не говорим за хора с ниска скорост на мрежата) - Lynx - не поддържаше бисквитки. Той все още не ги поддържа "официално", въпреки че някои от широко достъпните му "странични клонове" го поддържат. Второ, и по-важно, бисквитките свързват потребителя с определена машина. Едно от големите предимства на мрежата е, че е достъпна от всяка точка на света. Независимо къде е създадена или съхранявана вашата уеб страница, тя може да бъде показана от всяка машина, свързана с интернет. Въпреки това, ако се опитате да получите достъп до сайт с активирана бисквитка от чужда машина, всички ваши лични данни, които са били поддържани от бисквитката, ще бъдат загубени.

Много сайтове все още използват бисквитки за персонализиране на потребителски страници, но повечето ги допълват с традиционен интерфейс за вход/парола. Ако сайтът е достъпен от браузър, който не поддържа бисквитки, тогава страницата съдържа формуляр, в който потребителят въвежда потребителско име и парола, зададени му при първото посещение на сайта. Обикновено тази форма е малка и скромна, за да не изплаши повечето потребители, които не се интересуват от никаква персонализация, а просто искат да отидат по-далеч. Когато потребител въведе име за вход и парола във формуляра, CGI намира файла с данни на потребителя, сякаш името е изпратено с бисквитка. Използвайки този метод, потребителят може да се регистрира на персонализиран уебсайт от всяка точка на света.

В допълнение към задачите за отчитане на потребителските предпочитания и дългосрочно съхранение на информация за него, може да се даде по-фин пример за запомняне на състоянието, което се предоставя от популярните търсачки. Когато търсите с помощта на услуги като AltaVista или Yahoo, обикновено получавате много повече резултати, отколкото можете да покажете в лесен за четене формат. Този проблем се решава чрез показване на малък брой резултати - обикновено 10 или 20 - и предоставяне на някои средства за навигация за преглед на следващата група резултати. Въпреки че това поведение изглежда обичайно и очаквано за средния уеб сърфист, действителната реализация е нетривиална и изисква състоянието да бъде запомнено.

Когато потребителят за първи път направи заявка към търсачката, тя събира всички резултати, вероятно подчинени на някакво предварително определено ограничение. Номерът е да дадете тези резултати едновременно в малко количество, като същевременно запомните какъв вид потребител е поискал тези резултати и каква част очаква следващата. Като оставим настрана сложността на самата търсачка, ние сме изправени пред проблема последователно да предоставяме на потребителя информация на една страница. Помислете за пример 9-4, който показва CGI скрипт, който извежда десет реда от файл и му позволява да разгледа следващите или предходните десет реда.

Пример 9-4. Запазване на състоянието в CGI скрипт

#!/usr/bin/perl -w

използвайте CGI;

Open(F,"/usr/dict/words") or die("Не може да се отвори! $!");

#Това е файлът, който ще бъде изведен, може да бъде всичко.

$output = нов CGI;

sub print_range ( # Това е основната функция на програмата, моят $start = shift;

# Начален ред на файла, моят $count = 0;

# Показател, моята $line = "";

# Текущ ред на файла, отпечатайте $output->header,

$output->start_html("Моят речник");

# Генерира HTML със заглавие "Моят речник", отпечатайте " \н";

докато (($брой< $start) and ($line = )) ( $count++; )

# Пропуснете всички редове преди началото, докато (($count< $start+10) and ($line ? )) ( отпечатай $line; $count++; )

# Отпечатайте следващите 10 реда.

моят $newnext = $start+10; моят $newprev = $start-10;

# Задайте начални низове за „Следващ“ и „Предишен“ URL адрес,

печат"

";

освен ако ($start == 0) ( # Активирайте „Предишен“ URL, освен ако не

# вече не е в началото.

печат qq%Предишен%; )

освен ако (eof) ( # Включете "Следващ" URL, освен ако не # не в края на файла.

печат qq%Следващ%;

}

отпечатайте "HTML;HTML

изход (0); )

# Ако няма данни, започнете отначало,

if (не $output->param) (

&print_range(0); )

# В противен случай започнете от низа, посочен в данните.

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

В този пример запомнянето на състоянието се извършва по най-простия метод. Няма проблем със запазването на данните, тъй като ги съхраняваме във файл на сървъра. Трябва само да знаем откъде да започнем изхода, така че скриптът просто включва началната точка за следващата или предишната група от редове в URL адреса, което е всичко, което е необходимо за генериране на следващата страница.

Въпреки това, ако имате нужда от нещо повече от просто превъртане през "файл, тогава разчитането на URL може да бъде тромаво. Можете да облекчите тази трудност, като използвате HTML формуляр и включите данни за състоянието в таговете. Скрит тип. Тази техника е използвана с успех от много сайтове, което ви позволява да свързвате между свързани CGI програми или разширяване на използването на една CGI програма, както в предишния пример. Вместо да се отнасят към конкретен обект, като например начална страница, URL данните могат да сочат към автоматично генериран потребителски идентификатор.

Ето как работят AltaVista и други търсачки. Първото търсене генерира потребителски идентификатор, който имплицитно е включен в следващите URL адреси. Този идентификатор е свързан с един или повече файлове, съдържащи резултатите от заявката. Още две стойности са включени в URL адреса: текущата позиция във файла с резултати и посоката, в която искате да се движите по-нататък в него. Тези три стойности са всичко, което е необходимо за стартиране на мощните навигационни системи на големите търсачки.

Друго обаче липсва. Файлът, използван в нашия пример /usr/diet/wordsмного голям. Ами ако го оставим по средата на четене, но искаме да се върнем към него по-късно? Ако не помните URL адреса на следващата страница, няма начин да се върнете назад, дори AltaVista няма да ви позволи. Ако рестартирате компютъра си или започнете да работите от друг, е невъзможно да се върнете към предишните резултати от търсенето, без да въведете повторно заявката. Въпреки това, това дългосрочно запазване на състоянието е в основата на персонализирането на уебсайта, за което говорихме по-горе, и си струва да се види как може да бъде използвано. Пример 9-5 е модифицирана версия на Пример 9-4.

Пример 9-5. Постоянна памет на състоянието

#!/usr/bin/perl -w

използвайте CGI;

umask 0;

Open(F,"/usr/dict/words") or die("Не може да се отвори! $!");

Chdir("потребители") или die("Не мога да премина към директорията $!");

# Това е директорията, в която ще се съхраняват всички данни

# за потребителя.

Изход = нов CGI;

if (не $output->param) (

отпечатайте $output->header,

$output->start_html("Моят речник");

отпечатайте "HTML;


<р>Въведете потребителското си име:


HTML

изход (0); )

$user = $output->param("потребителско име");

## Ако потребителският файл не съществува, създайте го и го инсталирайте

## начална стойност в "0",

if (не -e "$user") (

open (U, ">$user") или die("Не мога да отворя! $!");

отпечатайте U "0\n";

затворете U;

&print_range("0");

## ако потребителят съществува и не е посочен в URL адреса

## начална стойност, прочетете последната стойност и започнете от там.

) elsif (не $output->param("start")) (

Open(U,"Suser") или die("Не мога да отворя потребител! $!");

$начало = ; затворете U;

chomp $starl;

диапазон на отпечатване ($ начало);

## Ако потребителят съществува и не е посочен в URL адреса

## начална стойност, напишете начална стойност

## към потребителски файл и стартирайте изхода.

) друго (

Open(U,">$user") или die("Не мога да отворя потребител за писане! $!");

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

затворете U;

&print_range($output->param("начало 1)); )

подпринт_диапазон(

моят $start = shift;

моят $count = 0;

моята $line = " "

отпечатайте $output->header,

$output->start_html(" Моят речник ");

печат"

\н"; 

докато (($брой< $start) and ($line = )) ( $count++; )

докато (($брой< $start+10) and ($line = ))

отпечатайте $line; $count++;

моят $newnext = $start+10;

моят $newprev = $start-10;

печат"

освен ако (Старт == 0)

{

печат

qq%

предишен%;

}

освен ако (eof) (отпечатайте qq%Next%;

# Забележете, че потребителското име "потребителско име" е добавено към URL адреса.

# В противен случай CGI ще забрави с кой потребител е работил.

}

отпечатайте $output->end_html;

изход (0") ;

}

Мерки за сигурност

Когато работите с интернет сървъри, независимо дали те са HTTP или други, сигурността е основна грижа. Обменът на данни между клиента и сървъра, извършван в рамките на

CGI повдига редица важни въпроси, свързани със защитата на данните. Самият CGI протокол е доста сигурен. CGI програмата получава вход от сървъра чрез стандартен вход или променливи на средата, като и двете са безопасни. Но след като CGI програма контролира данните, нейните действия са неограничени. Лошо написана CGI програма може да позволи на нападателя да получи достъп до системата на сървъра. Помислете за следната примерна CGI програма:

#!/usr/bin/perl -w

използвайте CGI;

моят $output = нов CGI;

моето $username = $output"param("username");

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

"

", "пръст $потребителско име", "
", $output->end_html;

Тази програма предоставя валиден CGI интерфейс на командата пръст на ръката.Ако стартирате програмата точно като finger.cgi,ще изброи всички текущи потребители на сървъра. Ако го пуснете като finger.cgi?username=fred,след това ще покаже информация за потребителя "fred" на сървъра. Можете дори да го стартирате като пръст на ръката. oo.comза показване на информация за отдалечения потребител. Въпреки това, ако го стартирате като finger.cgi?username=fred; могат да се случат нежелани неща. Операторът на обратно движение """ " в Perl създава шел процес и изпълнява команда, която връща резултата. В тази програма" пръст $username*използва се като лесен начин за изпълнение на команда с пръст и получаване на нейния изход. Въпреки това, повечето обвивки позволяват комбиниране на множество команди на един ред. Например всеки процесор като процесора Bourne прави това с "; ". Така"пръст Фред; поща първо изпълнете командата пръст ислед това командвайте поща който може да изпрати целия файл с парола на сървъра на нежелан потребител.

Едно решение е да анализирате данните от формуляра, за да потърсите злонамерено съдържание. Можете, да речем, да потърсите символа ";" и изтрийте всички знаци след него. Възможно е да се направи такава атака невъзможна, като се използват алтернативни методи. Горната CGI програма може да бъде пренаписана по следния начин:

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

използвайте CGI;

моят $output = нов CGI;

моето $username = $output->param("потребителско име");

$|++;

# Деактивирайте буферирането, за да изпратите всички данни на клиента,

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

\н"; 

$pid = open(C_OUT, "-|");# Този идиом на Perl създава дъщерен процес и се отваря

# канал между родителски и дъщерни процеси,

if ($pid) (# Това е родителският процес.

печат ; ft Отпечатайте изхода на дъщерния процес.

печат"

", $output->end_html;

изход (O); ft Прекратете програмата. )

elsif (дефиниран $pid) ( # Това е дъщерен процес.

$|++; # Деактивирайте буферирането.

exec("/usr/bin/finger",$username) или die("exec() извикването не бе успешно.");

# Изпълнете програмата за пръсти с потребителско име като единствено
# аргумент на командния ред. ) else ( die("fork() неуспешно"); )

# Проверка на грешка.

Както можете да видите, това не е много по-сложна програма. Но ако го пуснете като finger.cgi?username=fred; тогава програмата с пръст ще се изпълни с аргумента Фред; поща като едно потребителско име.

Като допълнителна мярка за сигурност, този скрипт изпълнява пръст изрично като /usr/bin/finger. В малко вероятния случай, че уеб сървър предаде необичаен PATH към вашата CGI програма, пускането с пръст може да доведе до стартиране на грешната програма. Друга мярка за сигурност може да се предприеме, като се изследва променливата на средата PATH и се уверите, че има приемлива стойност. Добра идея е да премахнете текущата работна директория от PATH, освен ако не сте сигурни, че това не е така, когато наистина трябва да изпълните програмата в нея.

Друго важно съображение за сигурността е свързано с правата на потребителите. По подразбиране уеб сървърът изпълнява CGI програмата с правата на потребителя, стартирал самия сървър. Обикновено това е псевдопотребител, като "никой", който има ограничени права, така че CGI програмата също има малко права. Това обикновено е добро нещо, защото ако нападателят има достъп до сървъра чрез CGI програма, той няма да може да причини много вреда. Примерът за кражба на парола показва какво може да се направи, но действителните щети на системата обикновено са ограничени.

Въпреки това, работата като ограничен потребител също ограничава възможностите на CGI. Ако CGI програма трябва да чете или записва файлове, тя може да го направи само когато има това разрешение. Например, във втория пример за състояние, файл се поддържа за всеки потребител. CGI програмата трябва да има разрешение за четене и запис в директорията, съдържаща тези файлове, да не говорим за самите файлове. Това може да стане чрез създаване на директорията като същия потребител като сървъра, с разрешения за четене/запис само за този потребител. Въпреки това, за потребител като "никой", само root има тази възможност. Ако не сте суперпотребител, тогава ще трябва да общувате със системния администратор за всяка промяна в CGI.

Друг начин е да направите директорията свободна за четене и запис, като ефективно премахвате всякаква защита от нея. Тъй като единственият начин за достъп до тези файлове от външния свят е чрез вашата програма, опасността не е толкова голяма, колкото може да изглежда. Въпреки това, ако се открие дупка в програмата, отдалеченият потребител ще има пълен достъп до всички файлове, включително възможността да ги унищожи. В допълнение, законните потребители, работещи на сървъра, също ще могат да променят тези файлове. Ако ще използвате този метод, тогава всички потребители на сървъра трябва да са надеждни. Също така, използвайте отворената директория само за файлове, които са необходими на програмата CGI; с други думи, не излагайте на риск ненужните файлове.

Ако това е първото ви излагане на CGI програмиране, по-нататъшното обучение може да бъде продължено по различни начини. По темата са написани десетки книги, много от които не предполагат никакви познания по програмиране. CGI програмиране в световната мрежаиздателство O "Reilly and Associates" обхваща материали от прости скриптове на различни езици до наистина невероятни трикове и трикове. Обществената информация също е в изобилие в WWW. Добра идея е да започнете с CGI стана наистина лесно(Наистина само за CGI) в http://www.jmarshall.com/easy/cgi/ .

CGI и бази данни

От началото на ерата на Интернет базите данни взаимодействат с развитието на World Wide Web. На практика много хора гледат на мрежата като на една гигантска база данни с мултимедийна информация.

Търсачките предоставят ежедневен пример за предимствата на базите данни. Търсачката не обикаля целия интернет, търсейки ключови думи в момента, в който ги поискате. Вместо това разработчиците на сайта използват други програми, за да създадат гигантски индекс, който служи като база данни, от която търсачката извлича записи. Базите данни съхраняват информация по начин, който позволява бързо извличане на произволен достъп.

Поради своята нестабилност базите данни дават на мрежата още повече мощност: превръщат я в потенциален интерфейс за всичко. Например, системното администриране може да се извършва дистанционно чрез уеб интерфейс, вместо да се изисква администратор да влезе в желаната система. Свързването на бази данни с мрежата е в основата на ново ниво на интерактивност в Интернет.

Една от причините, поради които базите данни са свързани с мрежата, се появява редовно: голяма част от световната информация вече е в бази данни. Базите данни, които са съществували преди появата на Мрежата, се наричат ​​наследени бази данни (за разлика от бази данни, които не са свързани с мрежата, създадени в последно време, което трябва да се нарече „лоша идея“). Много корпорации (и дори физически лица) сега са изправени пред предизвикателството да осигурят достъп до тези наследени бази данни през мрежата. Освен ако вашата наследена база данни не е MySQL или mSQL, тази тема е извън обхвата на тази книга.

Както казахме по-горе, само вашето въображение може да ограничи комуникацията между базите данни и мрежата. В момента в мрежата има хиляди уникални и полезни бази данни. Типовете бази данни, които работят извън тези приложения, са доста различни. Някои от тях използват CGI програми като интерфейс към сървър на база данни като MySQL или mSQL. Тези видове представляват най-голям интерес за нас. Други използват търговски приложения за взаимодействие с популярни настолни бази данни като Microsoft Access и Claris FileMaker Pro. А други просто работят с плоски текстови файлове, които са възможно най-простите бази данни.

Тези три типа бази данни могат да се използват за разработване на полезни уебсайтове от всякакъв размер и сложност. Една от нашите цели през следващите няколко глави ще бъде да пренесем силата на MySQL mSQL в мрежата с помощта на CGI програмиране.