Некоммерческое акционерное общество
АЛМАТИНСКИЙ УНИВЕРСИТЕТ ЭНЕРГЕТИКИ И СВЯЗИ
Кафедра «Электроника»
СОВРЕМЕННЫЕ ИНФОРМАЦИОННЫЕ ТЕХНОЛОГИИ
Методические указания к выполнению лабораторных работ
для студентов всех форм обучения специальности
5В071900 – Радиотехника, электроника и телекоммуникации
Алматы 2012
СОСТАВИТЕЛИ: Оразалиева С.К., Нұрланұлы А. Современные информационные технологии. Методические указания к выполнению лабораторных работ для студентов всех форм обучения специальности 5В071900 – Радиотехника, электроника и телекоммуникации. – Алматы: АУЭС, 2012. – 20 стр.
В методической разработке рассмотрены методы изучения базовых элементов PHP, обмен информаций между WEB-сервером и клиентом, а также особенности разработки диалоговых систем с помощью WEB-технологий, работа с файлами в PHP на примере организации чата.
Методическая разработка составлена в целях закрепления лекционного материала и предназначена для всех форм обучения специальности 5В071900 – Радиотехника, электроника и телекоммуникации.
Ил. 2, табл.3 , библиогр. – 6 назв.
Рецензент: д-р техн. наук, проф. Ш.А. Бахтаев
Печатается по плану издания Некоммерческого акционерного общества «Алматинский университет энергетики и связи» на 2011 г.
© НАО «Алматинский университет энергетики и связи», 2012 г.
Св.план 2011 г., поз. 215
Лабораторная работа № 1. Базовые элементы PHP
1 Задание
1.1 Изучить следующие базовые элементы языка:
- Типы данных, идентификаторы, комментарии, объявление переменных.
- Управляющие конструкции языка.
- Функции форматированного/неформатированного вывода данных.
1.2 Динамически сгенерировать таблицу данных 50 строк на 15 столбцов с помощью генератора случайных чисел. Подсчитать статистические данные по строкам и столбцам – среднее значение, максимальное значение и сумма. Результат показать в браузере. Примерный вид таблицы:
|
1 |
2 |
… |
15 |
среднее |
максимальное |
сумма |
1 |
12 |
29 |
… |
45 |
34 |
67 |
345 |
2 |
43 |
23 |
… |
24 |
54 |
89 |
254 |
… |
… |
… |
… |
… |
… |
… |
… |
50 |
12 |
87 |
… |
27 |
23 |
95 |
259 |
среднее |
34 |
56 |
… |
45 |
|
|
|
максимальное |
98 |
89 |
… |
87 |
|
|
|
сумма |
345 |
674 |
… |
345 |
|
|
|
1.3 Сгенерировать строку из 100 символов с различным типом форматирования. Символы и форматирование получаются случайным образом. Для форматирования применяются тэги <b></b>, <u></u>, <i></i> и их комбинации. Результат показать в браузере. Примерный вид строки:
djklsgjklfmbdgcjdfgkqwxfdgzdfaglj
2 Теоретическая часть
Примеры объявления переменных:
$a = 1; - целочисленный тип
$b = 2.45; - вещественный тип
$c = “string”; - строковый тип
Комментарии:
// однострочный комментарий
# это тоже однострочный комментарий
/* многострочный
комментарий */
Основные команды и примеры:
if (<условие>) <команда> [ else <команда>]
if (<условие>) <команда> elseif (<условие>) <команда>
if (x > y) print “x>y”;
elseif (x<y) print “x<y”;
else print “x=y”;
for(<инициализация>;<условие>;<приращение>) <команда>
for ($i=0; $i < 10; $i++) $fact = $fact * $i;
continue; - продолжить цикл, пропустив нижележащие команды
break; - прекратить цикл
mt_rand (<минимум>, <максимум>); - сгенерировать случайное число
$num = mt_rand(10,50);
Основные функции вывода:
print <аргумент>; - вывести аргумент
Пример: print “Hello World!”;
echo <аргумент>; - вывести группу аргументов
Пример: echo “Hello World!”, “Hello Earth!”, “Hello Sky!”;
printf (<формат>[, <аргументы>,…] ); - С-подобная функция
Пример: printf (“my course is %d%s\n”, 4, “<br>”);
Пример PHP-скрипта:
<html>
<body>
<?php
print "Hello Programmer!<br>";
for ($i = 0; $i < 10; $i++ )
printf (“Serial number is %d<br>“, $i);
printf ("Random number is %d<br>", mt_rand(0,100));
?>
</body>
</html>
3 Контрольные вопросы
1 Типы данных, идентификаторы, комментарии, объявление переменных языка PHP
2 Управляющие конструкции языка.
3 Функции форматированного/неформатированного вывода данных.
Лабораторная работа № 2. Обмен информацией между WEB-сервером и клиентом
1 Задание
Изучить следующие приемы:
Изучить конструкции HTML для организации обмена между сервером и клиентом.
Разобраться с методами передачи данных GET и POST.
Изучить возможности PHP для получения информации от пользователя.
2 Теоретическая часть
Примеры создания полей ввода и кнопок можно посмотреть в лекции или спецификации языка HTML. Используемые тэги:
<FORM> - создание формы;
<INPUT> -создание полей редактирования, кнопок различных видов;
<SELECT> - создание списка выбора и комбинированного списка.
3 Практическая часть
Программа «Получение анкетных данных от пользователя».
Разработать HTML-файл для возможности получения от пользователя следующих данных:
- ФИО – поля редактирования;
- пол (мужской, женский) – радио-кнопки;
- семейное положение (холост, женат/замужем) – радио-кнопки;
- образование (среднее, высшее и т.п.) – комбинированный список;
- хобби (спорт, охота, рыбалка, компьютеры, пиво, ТВ и т.п.) – список с множественным выбором;
- есть ли компьютер – кнопка-переключатель.
Разработать PHP-скрипт, анализирующий введенные данные и генерирующий страничку вида:
Иванов Иван Иванович
Пол: мужской
Семейное положение: холост
Образование: высшее
Хобби: охота, рыбалка
Наличие ПК дома: есть
Использовать поочередно в п.1 методы GET и POST. Посмотреть в чем различия. Разобрать формат передачи параметров в методе GET.
4 Контрольные вопросы
1 Обмен между сервером и клиентом.
2 Методы передачи данных GET и POST.
3 Возможности PHP для получения информации от пользователя.
Лабораторная работа № 3. Разработка диалоговых систем с помощью Web-технологий.
1 Задание
Научиться переносить данные между страницами;
Научиться переадресовывать запросы;
Разработать систему, выполняющую следующие функции:
- Авторизация введенных данных о пользователе. После авторизации каждый каждая страничка должна содержать ФИО зарегистрировавшегося пользователя;
- Ввод данных от пользователя;
- Редактирование введенных данных;
- Просмотр введенных данных.
2 Теоретическая часть
Система состоит из 4-х модулей:
- Страница ввода идентификационных данных (логин/пароль).
- Главное меню.
- Страница ввода/редактирования данных.
- Просмотр введенных данных.
Рисунок 1 – Функциональная схема работы
3 Практическая реализация
Данная лабораторная работа опирается на предыдущую лабораторную работу №2 «Обмен информацией между WEB-сервером и клиентом». В качестве примера для реализации можно взять систему работы с анкетными данными. Работа системы начинается со страницы «ввод логина/пароля». В случае удачной аутентификации пользователь попадает на «основное меню», из которого он может ввести/поменять,просмотреть данные о себе или выйти из системы. Переадресация на другую страницу выполняется с помощью команды протокола HTTP, реализуемую через:
print header ("Location: login.php");
exit;
Данная команда должна идти первой из выводимого на поток вывода (до тега <html>), иначе переадресации не случится.
Требование к безопасности: «неавторизованные» пользователи не должны видеть ни одной странички, кроме «ввод логина/пароля». В случае, если «неавторизованный» пользователь пытается вызвать любую страницу, система должна адресовать его на страницу «ввод логина/пароля».
Простейший пример реализации механизма аутентификации.
Создаются две функции:
get_user_id($login, $password); - в случае успешной проверки возвращает идентификатор пользователя, в случае неудачи – возвращает –1.
get_correct_login($user_id); - проверяет корректность идентификации. В случае неудачи переадрессует на страницу «ввод логина/пароля».
Файл «authlib.inc»
<?php
$passwd[“Ivanov”][“id”] = 1289;
$passwd[“Ivanov”][“password”] = “pass1”;
$passwd[“Petrov”][“id”] = 1423;
$passwd[“Petrov”][“password”] = “table”;
$passwd[“Sidorov”][“id”] = 4598;
$passwd[“Sidorov”][“password”] = “nothing”;
function get_user_id($login, $password) {
GLOBAL $passwd;
if ($passwd[$login][“password”] == $password) {
return $passwd[$login][“id”];
} else {
return –1;
}
}
function get_correct_login($user_id) {
GLOBAL $passwd;
return in_array($user_id, $passwd);
}
?>
После чего можно использовать эту библиотеку в страницах командой
include(“authlib.inc”);
После чего нужно идентифицировать пользователь:
$id = get_user_id($login, $password);
if ($id == -1) {
print header ("Location: login.php");
exit;
}
Для передачи параметров между страницами в формах используется тэг
<INPUT type=”HIDDEN”>. Данный тег не отображается на форме визуально и предназначен для передачи скрытых параметров, принцип передачи – как у <INPUT type=”TEXT”>. Пример передачи идентификатора пользователя:
<INPUT type=”HIDDEN” name=”user_id” value=”<?php print $user_id; ?>”>
После чего для организации безопасности каждый файл можно начинать со строки:
$id = get_correct_login($user_id);
if ($id == -1) {
print header ("Location: login.php");
exit;
}
4 Контрольные вопросы
1 Механизмы аутентификации.
2 Авторизация введенных данных о пользователе.
3 Какие тэги используются для передачи параметров между страницами в формах.
Лабораторная работа № 4. Работа с файлами в PHP на примере организации чата
1 Задание
Реализовать свой чат на базе файлов. Чат – программа обмена сообщениями, мнениями и т.п., строящаяся по принципу доски объявлений: каждый посылает сообщение от своего имени, доступное для просмотра всем. Типичный чат обладает рядом следующих правил:
- чтобы войти в чат, необходимо пройти регистрацию: задать ваше сетевое имя и пароль (чтобы никто не мог писать сообщения от вашего имени);
- имя или сообщение каждого пользователя выделяется своим цветом, выбираемым пользователем на этапе регистрации;
- на экране показываются только последние 10-30 сообщений;
- через определенный период времени чат сам обновляет поле текста с сообщениями с сервера;
- когда пользователь входит в чат или выходит с чата, появляется сообщение об этом.
2 Теоретическая часть
Команды работы с файлами изложены (или будут изложены) на лекции. Также их можно найти в спецификации языка PHP или любой книге по PHP.
Для реализации периодического обновления страницы используются следующие приемы:
- обработка таймера на одном из скриптовых языков (JavaScript или VBScript) – выходит за рамки нашего курса;
- посылка соответствующей команды HTTP-протокола браузеру перед выводом HTML-страницы – самый правильный способ, поскольку скрипты на стороне клиента можно отключать в настройках браузера. Реализуется следующим образом - в начале php-файла выполняются две команды:
header("Refresh: 10"); // здесь 10 – время задержки, 10 секунд до обновления;
header("URL: chat.php"); // chat.php – url-адрес файла, на который перейти
// после задержки.
Переадресация (redirect) файла выполняется с помощью команды:
header ("Location: enter.php");
// enter.php – файл, на который выполняется переадресация.
Следует помнить, что при переадресации полученные с помощью html-форм данные теряются, поэтому, если их нужно сохранить, то нужно их дописать в конец url по принципу метода GET: file?var1=val1&var2=val2&var3=val3 и т.п., т.е.
header ("Location: enter.php?family=Ivanov&name=Ivan");
Невозможно передать при переадресации данные методом POST!
3 Практическая часть
Простейшая реализация чата состоит из трех файлов и выглядит следующим образом:
Рисунок 2 – Реализация чата
Основной файл (chat.php) формирует экран пользователя, состоящий из двух частей:
- область ввода нового сообщения (форма с полем ввода сообщения и кнопкой посылки сообщения) отвечает за формирование (дополнение) файла chat.txt;
- область показа существующих сообщений (интерпретация и отображение файла chat.txt).
Кроме того, файл chat.php сам же добавляет новые данные в файл chat.txt, для этого надо:
- в форме в свойстве action надо вписать “chat.php”;
- в начале файла chat.php надо проверять ввод новых данных: если ввели, то добавить их в файл chat.txt;
Чтобы постоянно пользователь видел самые новые сообщения, необходимо реализовать механизм, заставляющий браузер периодически обновлять данные (вызывать файл chat.php без помощи пользователя).
Простейшая схема файла chat.php выглядит следующим образом:
<?php
header("Refresh: 10"); // обновить чат через 10 секунд
header("URL: chat.php");
?>
<html> <body>
<form method="post" action="chat.php">
<input type="text" name="msg">
<input type="submit" value="Послать">
</form><br>
<?php
if ($msg) { // проверка ввода нового сообщения
$fptr = fopen("chat.txt", "a"); // открыть файл на добавление
fwrite($fptr, $msg."<br>");
fclose($fptr);
}
// вывести файл на стандартный поток вывода
if (file_exists("chat.txt")) readfile("chat.txt");
?>
</body> </html>
4 Контрольные вопросы
1 Какие приемы используются для реализации периодического обновления страницы?
2 Реализация чата.
3 Спецификации языка php.
Лабораторная работа № 5. Разработка WEB-приложения с регистрацией пользователя
1 Задание
Освоить технологии создания WEB-приложений с регистрацией пользователя. Разработать вариант WEB-приложения отличный от предлагаемого примера. Например, изменить длину пароля, осуществить запись регистрационных данных и т.д.
2 Теоретическая часть
В примере рассмотрены серверные сценарии, выполняющие генерацию паролей случайным образом. При этом пользователь может получить допуск к ресурсу ограниченного доступа только с помощью своего индивидуального пароля и логина. Пароли и логины сохраняются в отдельном файле на WEB-сервере и недоступны пользователям. В приводимом примере серверные сценарии выполнены на PERL.
Примечание: Для отладки проекта используется технология "петли"- (loop back).
Базовый пример состоит из двух РНР-файлов.
Пример WEB-проекта.
Начальная (индексная) страница.(Index.html)
<html>
<head>
<title>Script</title>
</head>
<body>
<br>
<a href="reg.html"><b>Регистрация</b></a><br>
<a href="pasw.html"><b>Санкционированный доступ</b></a
</body>
</html>
Регистрация.( reg.html )
<html>
<head>
<title>Регистрация</title>
<script language="javaScript">
<!--//hide
function hi()
{
alert('Отличный логин '+f1.login.value +'!!!')
}
//-->
</script>
<script language="VBScript">
sub rezet()
ic=msgbox("Вы действительно хотите стереть все данные?",4,"Осторожно!!!")
if ic=6 then
document.f1.reset
end if
end sub
sub email()
st1 = document.f1.mail.value
st2 = "@"
x = InStr(1,st1,st2,1)
if x = 0 then
alert "Введите правильный e-mail, например, student@student.edu"
document.f1.mail.value = empty
document.f1.mail.focus
end if
end sub
</script>
</head>
<body >
<script language="javaScript">
document.write("<CENTER>");
document.write("<FORM NAME=\"BGColorForm\">");
document.write("<select name=\"schemesel\" onChange=\"document.bgColor = this.options[selectedIndex].value\">");
document.write("<option value=\"\FFFFFF\" selected>White");
document.write("<option value=\"0000FF\">Navy");
document.write("<option value=\"A0A0A0\">Gray");
document.write("<option value=\"E9E900\">Yellow");
document.write("<option value=\"A0A0FF\">Purple");
document.write("<option value=\"C70000\">Maroon");
document.write("<option value=\"FFFFA0\">Brown");
document.write("<option value=\"F0F0FA\">Silver");
document.write("<option value=\"FF00FF\">Fuchsia");
document.write("<option value=\"00FFFF\">Blue");
document.write("</select>");
document.write("</FORM>");
document.write("</CENTER>");
</script>
<font size=6 color=blue><center>Регистрация</center></font>
<br><br>
<font size=4>
<form method=post action="cgi-bin/reg.pl" name="f1">
Логин  <input type=text name="login" onBlur="hi()"><br><br>
<hr>
Какой-то вопрос?<br>
Да<input type=radio name="est-net" value=yes checked >
Нет<input type=radio name="est-net" value=no onClick="nocar()">
50 на 50<input type=radio name="est-net" value=kuplu onClick="car()">
<br><br><br>
Ваши предпочтения?
<select name="country" size=1>
<option selected value="1">1
<option selected value="2">2
<option selected value="3">3
<option selected value="4">4
</select><br><br>
Дополнительные сведения
<textarea name="car" cols=40 rows=3>
</textarea><br><br>
Ваш e-mail<input type="text" size=20 name="mail" onBlur="email()"><br><br>
<input type="submit" value="Отправить!!!">
<input type="button" value="Сброс" onClick="rezet()"><br>
</form>
</body>
</html>
Ввод логина пароля.( pasw.html )
<html>
<head>
<title>Password</title>
<script language="javaScript">
</script>
<script language="VBScript">
sub submid()
if document.f1.log.value = empty then
alert "Вы не не ввели логин!!!"
ElseIf document.f1.key.value = empty then
alert "Вы не не ввели пароль!!!"
else
document.f1.submit
end if
end sub
</script>
</head>
<body>
<h1><center>Введите логин и пароль</center></h1><br>
<form method=post action="cgi-bin/pas.pl" name="f1">
<h3>Логин   <input type=text size=14 name="log"><br>
<h3>Пароль <input type=password size=14 name="key"><br><br>
<input type=button value="Подключится" onClick="submid()">
<input type=reset>
</form>
</body>
</html>
Серверный скрипт -генерация паролей.( reg.pl)
#!c:\phpdev\perl\bin\perl.exe
read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});
@pairs = split(/&/,$buffer);
foreach $pair(@pairs){
($name,$value)=split(/=/,$pair);
$value=~tr/+/ /;
$value=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
$value=~s/<!--(.|\n)*-->//g;
$input{$name}=$value;
}
$back="http://127.0.0.1/reg.html";
$klub="http://127.0.0.1/s/klub.html";
$fl="../paroli.txt";
open (A,"<$fl");
#Процедура проверки пароля
$buf = <A>;
@paras = split(/&/,$buf);
foreach $para(@paras){
($login,$code)=split(/=/,$para);
push @cod,$code;
}
if (!$input{'login'} || !$input{'mail'})
{
print "Content-Type:text/html\n\n";
print "<body background=$path vlink=blue>";
print "<h1><center>Вы не ввели все данные</center></h1>";
print "<h3><center>Попробуйте еще раз. <a href=$back>Вернутся на главную страницу.</a></center>";
print "<br><center><img src=$scel></center> ";
}
else
{
print "Content-Type:text/html\n\n";
$rezult = 0;
label: if (($pasw=int(rand 99999))<10000)
{
goto label;
}
else
{
foreach $par(@cod)
{
if ($pasw == $par)
{
goto label;
}
else
{
$rezult = 1;
}
}
}
}
if ($rezult == 1)
{
#print "@cod[4]";
print "<body background=$path vlink=blue>";
"<font size=6 color=green>Ваши идентификационные данные приняты и сохранены</h2></font><hr>";
print "Логин: $input{'login'}<br>";
print "Вы получили свой персональный пароль <font color=red size=5><i>$pasw</i></font>";
print " запомните его!!!<br>";
print "<a href=$klub>для зарегистрированных пользователей</a>";
open(A,">>../paroli.txt");
print A "$input{'login'}=$pasw&";
}
close(A);
Серверный скрипт - проверка пароля и логина.( pas.pl)
#!c:\phpdev\perl\bin\perl.exe
read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});
@pairs = split(/&/,$buffer);
foreach $pair(@pairs){
($name,$value)=split(/=/,$pair);
$value=~tr/+/ /;
$value=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
$input{$name}=$value;
}
$fl="../paroli.txt";
open (A,"<$fl");
#Процедура проверки пароля
$buf = <A>;
@paras = split(/&/,$buf);
foreach $para(@paras){
($login,$code)=split(/=/,$para);
push @cod,$code;
push @login,$login;
}
#Конец процедуры проверки
$klub="http://127.0.0.1/s/klub.html";
$kod=0;
$logi=0;
$max = $#cod;
for ($i=0; $i<=$max;$i++){
if (@cod[$i] == $input{'key'} && @login[$i] eq $input{'log'})
{
print "Status: 302\n";
print "Location: http://127.0.0.1/s/klub.html\n";
last;
}
else
{
if ($i == $max){
print "Status: 302\n";
print "Location: http://127.0.0.1/s/no.html\n";}
}
}
В папке s размещаются:
Файл klub.html.
<html>
<head>
<title>Клуб</title>
</head>
<font size=7>Страница зарегистрированных пользователей</font><br>
<br>
</body>
</html>
Файл no.html.
<html>
<head>
<title>Warring</title>
</head>
<body>
<H1>У вас нет доступа, пройдите регистрацию</h1>
</body>
</html>
В папке www размещается текстовый файл paroli.txt.
3 Контрольные вопросы
1 Какие функции у клиентских скриптов в данном WEB-проекте?
2 Какие функции у серверных скриптов в данном WEB-проекте?
3 Как осуществляется проверка пароля и логина в приведенном примере?
Лабораторная работа № 6. Разработка WEB-приложения с элементами защиты информации
1 Задание
Освоить технологии создания WEB-приложений с элементами защиты информации. Разработать вариант WEB-приложения отличный от предлагаемого примера.
2 Теоретическая часть
В примере рассмотрены серверные сценарии, использующие шифрование необходимых сообщений по алгоритму хеширования MD5, в РНР алгоритм реализован в виде специальной функции, ее синтаксис md5(строка). Алгоритм хеширования применяется и в механизме цифровой подписи, широко применяемой в интернет-приложениях.
Примечание: для отладки проекта используется технология "петли"- (loop back).
Пример WEB-проекта.
Шифрование пароля.(md5.php)
<?
$pass="admins_pass";
$res=md5($pass);
echo $res;
?>
Результат записывается в файл pas.txt
Проверка пароля и логина (1md5.php)
<?php
//Если нажата кнопка "Войти"
if (isset($GLOBALS['enter']))
{
//Читаем хеш из файла pas.txt
$s=file('pas.txt');
//Получаем хеш от пароля, введенного пользователем
$hash=md5($GLOBALS['passwd']);
//Сравниваем хеш пароля и логин с теми.
if (($s[0]==$hash) and ($GLOBALS['login']=='admin'))
{
require_once ("admin.php");
exit;
}
else {
echo "Логин или пароль неверные";
echo "<a href ='http://localhost/1md5.php'>Назад</а>";
exit;
}
}
?>
<! — Форма — >
<FORM action='http://localhost/1md5.php' method='POST'>
Логин :<input type='text' name='login'>
<BR><BR>
Пароль :<input type='password' name='passwd'>
<BR><BR>
<input type='submit' name='enter' value='Войти'>
</FORM>
Файл admin.php содержит информацию доступную владельцу логина admin
(например, admin.php может содержать код: <?php phpinfo(); ?>).
В папке www размещается текстовый файл pas.txt. Данный пример приводится для РНР 4 версии, при использовании РНР 5 версии следует изменить имена массивов $GLOBALS на $_POST.
3 Контрольные вопросы
1 Как преобразовываются данные в примере?
2 Каковы функции у серверных скриптов в данном WEB-проекте?
3 Каков механизм проверки пароля и логина в приведенном примере?
Список литературы
1. Петров В.Н.Информационные системы.Учебник.- СПб.:Издательство "Питер", 2002.
2. Прохоров А.Н. Интернет: как это работает.- СПб.:БХВ-Петербург, 2004.
3. Ганеев Р.М. Проектирование интерактивных WEB-приложений.–М., 2001.
4. Косентино К. РНР. Web - профессионалам: Пер. с англ. - К.: Издательская группа BHV, 2001.
5. Кузнецов С.Д. РНР 4.0.Руководство пользователя.- М.: Майор, 2001.
6. Дунаев В.В.Сам себе Web-дизайнер.–Спб.:Арлит. 2002.
Содержание
Лабораторная работа №1. Базовые элементы PHP Лабораторная
работа №2. Обмен информацией между Лабораторная работа №3. Разработка диалоговых систем с помощью WEB-технологий Лабораторная работа №4. Работа с файлами в PHP на примере организации чата Лабораторная работа №5. Разработка WEB-приложения с регистрацией пользователя Лабораторная работа №6. Разработка WEB-приложения с элементами защиты информации |
3 6
8
11
14
21 |