5. Основи безпеки CGI скриптів
Займаючись професійною розробкою веб-додатків, завжди потрібно замислюватися над питаннями інформаційної безпеки. Добре написані CGI та Perl скрипти окрім видачі коректних результатів і стабільної роботи, також повинні не створювати дір у системі безпеки.
CGI-скрипти виконуються від імені непривілейованого користувача nobody, однак є імовірність порушення вимог безпеки. Тому потрібно максимально унеможливити будь-які несанкціоновані дії ваших програм, які можуть виникнути у результаті хакерської атаки, і котрі можуть привести до взлому вашого сайту.
Основою безпеки веб-додатків та веб-систем є правильна обробка вхідних даних.
5.1. Обробка даних: нульовий байт
Взаємодія користувача і веб-додатку відбувається за допомогою передачі параметрів. І безпечний CGI-скрипт відрізняється тим, що він виконується коректно при будь-яких можливих значеннях вхідних параметрів.
В Perl є нюанс пов’язаний з використанням нульового байта (%00 - ‘\0′). Котрі можуть стати небезпечними для вашого веб сайта. В Перлі всі системні виклики запрограмовані на С, де нуль представляє собою закінчення рядка. А для самого Перла нульовий байт - це звичайний символ.
Наприклад такий код:
$db = "$input.txt";
open (FILE,"<$db");
Якщо ми передамо скрипту параметр іnput=file, то скрипт спробує відкрити файл file.txt. Якщо ми передамо скрипту іnput=file%00, Перл створить $db = "file\0.txt" і спробує відкрити файл file. Якщо вказаний файл існує (і якщо в нього заданий дозвіл на читання), то він буде відкритий. В такому випадку станеться несанкціонований витік даних.
Розширення файлу ".txt"" зникло в зв’язку з особливостями обробки нульового байту. У С нульовий байт - це ознака кінця рядка. Perl же допускає нульові байти в строкових змінних, як дані. У результаті Перл передає системним викликам параметр file\0.txt, однак усі бібліотеки і функції що викликаються перестають обробляти дані, як тільки доходять до нульового байта.
5.2. Обробка даних: символи рівня директорій
В операційних системах Unix/Linux символи рівня директорій "../" (в Windows це "..\") дозволяють вказувати шлях до програми чи файла з даними, які знаходяться в довільному місці диску, з поточної директорії.
Тому при обробці вхідних даних треба приділити увагу для даної категорії символів, щоб уникнути несанкціонованого доступу до даних сервера.
Наприклад такий код:
$page = $fullpath.$Input{'path'}.".html";
open (FILE,"<$page");
У випадку коли скрипт не перевіряє передані йому дані на символи ‘..’ і нульові байти, то використовуючи параметр ‘path=../../../../../etc/passwd%00′ ми можемо вказати $page на файл із паролями сервера. Який за алгоритмом роботи скрипта буде виведений у вікно браузера.