- •1. Основні технології розробки web-додатків
- •1.1 Протокол http
- •Основні технології розробки web-додатків
- •1.3 Короткі підсумки
- •2 Структура html-документа
- •2.1. Елементи мови html
- •2.2 Структура html-документа
- •2.2.1.Початок
- •2.2.2 Тіло документа
- •Заголовки
- •Нижче на малюнку показаний результат використання наступних заголовків:
- •Списки в html
- •2.3 Використання графіки в html
- •2.4 Таблиці
- •Атрибут border. Значення цього атрибута визначає як будуть виглядати рамки таблиці. Якщо атрибут не заданий або його значення дорівнює нулю, то таблиця не матиме рамок.
- •2.5 Html-форми Форми використовуються в www для передачі інформації від клієнта до сервера.
- •3 Каскадні таблиці стилів css
- •3.1 Загальні відомості про css
- •3.2 Додавання стилю на веб-сторінку
- •3.2.1. Таблиця пов'язаних стилів
- •3.2.2 Таблиця глобальних стилів
- •3.2.3 Внутрішні стилі
- •3.3 Синтаксис css
- •3.3.1 Властивості css
- •3.3.2 Селектори тегів
- •3.3.3 Селектори класів
- •3.3.4 Селектори-ідентифікатори
- •3.3.5 Контекстні селектори
- •3.3.6 Сусідні селектори
- •3.3.7 Дочірні селектори
- •Селектор зі значенням атрибута – встановлює стиль елемента в тому випадку, якщо задано певне значення зазначеного атрибута. Синтаксис застосування наступний.
- •Наприклад:
- •3.3.9 Універсальний селектор
- •3.4 Псевдокласи
- •3.4.2 Короткі підсумки
- •4 Типи і структури даних в javascript
- •Скрипт в html документі
- •4.2 Змінні та літерали
- •4.2.1 Літерали
- •4.3 Оператори JavaSscript
- •4.3.2 Оператор обробки рядків
- •4.3.3 Оператор typeof Аргументом оператора є змінна або вираз. Оператор повертає рядок, що описує тип аргументу(див. Табл. 4.4).
- •4.3.4 Умовний оператор (Оператор If)
- •4.3.5 Оператор перемикання (switch)
- •4.3.6 Оператори циклу
- •4.4 Масиви
- •Метод reverse () – застосовується для зміни на протилежний порядок елементів масиву всередині масиву. Припустимо, масив натуральних чисел впорядкований по зростанню:
- •Впорядкуємо його по спаданню:
- •4.5.2 Інструкція return
- •4.5.3 Виклик функції
- •4.6.2 Константи
- •4.6.3 Математичні функції.
- •4.6.4 Приклад. Генератор випадкових чисел
- •4.7 Контрольні питання
- •Події та обробники подій
- •5.1.1 Спливання подій в dhtml
- •5.1.2 Стандартні події dhtml.
- •Способи зв'язування подій
- •5.2.1 Введення подій в якості атрибутів.
- •5.2.2 Обробники подій як функції.
- •5.2.3 Динамічне зв'язування подій у сценарії.
- •5.2.5 Атрибути for і event.
- •Об'єкти браузера
- •Об'єктна модель браузера
- •Об'єкт window (Операції з вікнами)
- •Об'єкт navigator (властивості браузера)
- •Об'єкт location (Інформація про документ і вікна браузера)
- •Об'єкт history (Переходи між Web-сторінками )
- •Робота з діалоговими вікнами
- •Управління документом
- •Об'єктна модель документа
- •7.1.1 Сімейства, властивості і методи
- •Дерево документа (Document Tree)
- •Переміщення по Дереву Документа.
- •Динамічний вміст
- •8.1.1 Найбільш популярні моделі даних
- •9.3.1 Поділ інструкцій.
- •9.3.2 Коментарі.
- •9.3.3 Змінні, константи й оператори
- •9.3.6 Типи даних
- •Висновок
- •Керуючі конструкції рнр
- •Умовні оператори
- •// Ця програма надрукує всі парні цифри
- •{// Друкуємо цифру, якщо вона парна
- •Оператори передачі управління
- •Оператори включення
- •10.5 Висновок
- •Функції і масиви в php
- •Функції, визначені користувачем
- •11.1.1 Повернення значень функцією.
- •Рекурсивні функції.
- •11.1.3 Функції-змінні.
- •11.1.4 Побудова бібліотек функцій.
- •11.2.1 Операції з масивами.
- •11.2.2 Сортування масивів.
- •Sort_regular – порівнювати елементи масиву звичайним чином; sort_numeric – порівнювати елементи масиву як числа; sort_string – порівнювати елементи масиву як рядки.
- •11.2.3 Сортування масиву за ключами.
- •11.2.4 Сортування за допомогою функції, заданої користувачем.
- •Ми застосували нашу власну функцію сортування до всіх елементів масиву.
- •11.2.5 Застосування функції до всіх елементів массиву.
- •11.2.6 Виділення підмасива
- •Висновок
- •12 Строкові функції php
- •12.1 Функції пошуку в тексті (substr(), strpos(), strrpos(), strstr(), strchr(), stristr(), strrchr(), substr_count(), strspn(), strcspn())
- •12.2 Функції strlen(), chr() і ord()
- •12.3 Trim-функції (функції видалення символів відступу) trim (), ltrim (), rtrim (), chop ()
- •12.4 Функції форматного виведення. Специфікатори перетворення printf (), sprintf (), sscanf ().
- •12.5 Функції перетворення кодування
- •12.6 Функції роботи з бінарними даними pack () unpack ()
- •12.7 Функції роботи з блоками тексту (wordwrap (), str_replace (), substr_replace (), strtr (), stripslashes (), stripcslashes (), addslashes (), addcslashes (), quotemeta (), strrev ())
- •12.8 Функції об'єднання / поділу рядків (str_repeat (), str_pad (), chunk_split (), strtok (), explode (), implode (), join ())
- •12.9 Функции сравнения строк (strcmp(), strncmp(), strcasecmp(), strncasecmp(), strnatcmp(), strnatcasecmp(), similar_text(), levenshtein())
- •12.10 Функції роботи з url (parse_url (), parse_str (), rawurlencode (), rawurldecode (), base64_encode (), base64_decode ())
- •12.11 Функції перетворення регістру (strtolower (), strtoupper (), ucfirst (), ucwords ())
- •12.13 Функція htmlspecialchars
- •13 Робота з файлами
- •13.1 Відкриття і закриття файлів
- •13.2 Читання з файлів і запис у файли
- •13.2.1 Читання з файлів.
- •13.2.2 Запис в файли
- •13.5 Переміщення по файлам
- •13.6 Робота з каталогами
- •13.7 Завантаження файлу на сервер
- •14.1 Авторизація доступу
- •14.2 Механізм сесій
- •14.3 Налаштування сесій
- •14.4.1 Відкриття сесії
- •14.4.2 Створення сесії
- •14.4.3 Реєстрація змінних сесії
- •14.4.4 Видалення змінних сесії
- •14.5 Безпека
- •14.6 Висновок
- •15.1 Проектування
- •15.2 Система адміністрування контенту
- •15.2.1 Вимоги до системи адміністрування контенту (cms).
- •15.2.2 Адміністрування списку користувачів.
- •15.2.3 Вхід на сторінку адміністрування
- •15.2.4 Відкриття списку користувачів.
- •15.2.5 Редагування запису користувача.
- •15.2.6 Видалення користувача
14.4.4 Видалення змінних сесії
Крім вміння реєструвати змінні сесії (тобто робити їх глобальними протягом всього сеансу роботи), корисно також вміти видаляти такі змінні і сесію в цілому.
Функція session_unregister(ім'я_змінної) видаляє глобальну змінну з поточної сесії (тобто видаляє її з списку зареєстрованих змінних). Де це може знадобитися? Наприклад, для знищення даних про відвідувача (зокрема, логіна і пароля) після його відходу з секретної сторінки. Якщо правильні логін і пароль збережуться і вікно браузера після відвідування сайту не закрили, то будь-який інший користувач комп'ютера зможе прочитати закриту інформацію.
Приклад знищення змінних сесії. В файл secret_info.php додамо рядок для виходу на головну сторінку:
<?php
session_start();
if (($_SESSION['login'] != "pit" || $_SESSION['passwd'] != "123"))
Header("Location: authorize.php");
?>
<html>
<head>
<title>Secret info</title>
</head>
Тут розташовується секретна інформація :)
<br><a href="index.php">На главную</a>
</html>
В Index.php знищемо логін\ пароль, введені раніше:
<?php
session_start();
session_unregister('passwd'); // знищуємо пароль
unset($_SESSION['login']); // знищуємо логин
// Для налагодження
// виводимо глобальні змінні сесії
print_r($_SESSION);
?>
<html>
<head>
<title>My home page</title>
</head>
Домашняя сторінка
</html>
Тепер, щоб потрапити на секретну сторінку, потрібно буде знову вводити логін і пароль. Для того щоб скинути значення всіх змінних сесії, можна використовувати_функцію_session_unset(); Знищити поточну сесію цілком можна командою session_destroy(); Вона не скидає значення глобальних змінних сесії і не видаляє cookies, а знищує всі дані, пов'язані з поточною сесією:
<?php
// ініціалізуємо сесію
session_start();
// реєструємо змінну $test.
// якщо register_globals = on,
// можна використовувати
// session_register('test');
$test = " Змінна сесії";
$_SESSION['test']= $test;
// виводимо всі глобальні
// змінні сесії
print_r($_SESSION);
// виводимо ідентифікатор сесії
echo session_id();
echo "<hr>";
// знищуємо всі глобальні
// змінні сесії
session_unset();
print_r($_SESSION);
echo session_id();
echo "<hr>";
// знищуємо сесію
session_destroy();
print_r($_SESSION);
echo session_id();
?>
У результаті роботи цього скрипта будуть виведені три рядки: у першому- масив з елементом test і його значенням, а також ідентифікатор сесії, під другий - порожній масив і ідентифікатор сесії, у третього - порожній масив. Таким чином, видно, що після знищення сесії знищується і її ідентифікатор, і ми більше не можемо ні реєструвати змінні, ані взагалі проводити які-небудь дії з сесією.
14.5 Безпека
Взагалі кажучи, слід розуміти, що використання механізму сесій не гарантує повної безпеки системи. Для цього потрібно вживати додаткові заходи. Звернемо увагу на проблеми з безпекою, які можуть виникнути при роботі з сесіями і, зокрема, з тими програмами, що ми написали.
По-перше, небезпечно передавати туди-сюди пароль, його можуть перехопити. Крім того, ми зареєстрували його як глобальну змінну сесії, значить, він зберігся в cookies на комп'ютері-клієнті. Це теж погано. І взагалі, паролі та логіни по-доброму повинні зберігатися в базі даних. Нехай інформація про користувачів зберігається в базі даних "test" (у таблиці "users"), а ми маємо до неї доступ під логіном my_user і паролем my_passwd.
По-друге, що робити, якщо хтось написав скрипт підбору пароля для секретної сторінки? У цьому випадку на сторінку авторизації багато разів повинен стукати якийсь сторонній скрипт. Тому потрібно просто перевіряти, з нашого чи сайту прийшов запит на авторизацію, і якщо ні, тоді не пускати його далі. Адреса сторінки, з якої надійшов запит, можна отримати за допомогою глобальної змінної $ _SERVER [ 'HTTP_REFERER']). Хоча, звичайно, якщо за злом сайту взялися всерйоз, то значення цієї змінної теж підмінять (наприклад, за допомогою того ж PHP). Проте перевірку її значення можна вважати одним з найважливіших кроків на шляху до забезпечення безпеки свого сайту:
<?php
session_start();// створюємо нову сесію або відновлюємо поточну
// встановлюємо з'єднання з БД
$conn = mysql_connect("localhost", "my_user","my_passwd");
mysql_select_db("test"); // вибираємо робочу базу даних
// де знаходяться наші скрипти
$SERVER_ROOT = "http://localhost/~nina/tasks/sessions/";
/* за допомогою регулярного виразу
^$SERVER_ROOT і функції eregi перевіряємо,
починається адреса посилаючого скрипта,
тобто рядка $_SERVER['HTTP_REFERER'])
з рядка $SERVER_ROOT (як у нас) */
if(eregi("^$SERVER_ROOT", $_SERVER['HTTP_REFERER']))
{ // якщо так, то робимо майже те ж, що і раніше,
// пароль реєструвати не будемо
if (!isset($_POST['go'])) echo <<<EOT
<form>
Login: <input type=text name=login><br>
Password: <input type=password name=passwd><br>
<input type=submit name=go value=Go>
</form>
EOT;
else
{ // запит до бази даних: вибираємо з таблиці
// users login, який збігається з переданим
// за запитом, причому пароль у нього теж повинен
// збігтися з введеним користувачем.
// Якщо цього немає, то вважаємо, що логін та
// пароль введено невірно
$sql = "SELECT login FROM users WHERE login='".
$_POST['login'].
"' AND passwd='".
$_POST['passwd']."';";
// відправляємо запит до БД
$q = mysql_query($sql,$conn);
// число рядків у відповіді на запит
$n = mysql_num_rows($q);
if (!$n == 0)
{ // реєструємо змінну login
$_SESSION['user_login'] = $_POST['login'];
// перенаправляємо на сторінку secret_info.php
Header("Location: secret_info.php");
}
else echo "Невірне введення, спробуйте ще раз <br>"; }
print_r($_SESSION); // Виводимо всі змінні сесії
}
?>
Начебто перші дві проблеми вирішено. Але є ще одна. Що робити, якщо хакер просто допише в рядок запиту значення якої-небудь глобальної змінної (наприклад, логіна)? Взагалі це можливо, тільки якщо register_globals=On. Просто інакше ми використовуємо для роботи з глобальними змінними масив $_SESSION і з ним такі фокуси не проходять. Все ж спробуємо вирішити і цю проблему. Для цього потрібно очистити рядок запиту перед тим, як порівнювати значення параметрів. Тобто спочатку скинемо значення $user_login. Потім дану змінну потрібно знову зареєструвати, але не як нову, а як вже існуючу. Для цього знак долара при реєстрації НЕ опускається. Ось що вийшло:
<?php
// знищуємо змінну
unset($user_login);
// створюємо нову сесію або відновлюємо поточну
session_start();
// реєструємо змінну
// як вже існуючу
session_register($user_login);
// перевіряємо логін
if (!($user_login == "pit"))
{ // якщо помилка, то перенаправляємо
// на сторінку авторизації
Header("Location: authorize.php");
}
?>
<html>
<head>
<title>Secret info</title>
</head>
Тут розташовується секретна інформація :)
</html>
