» » PHP - Безпека файлової системи додатків

PHP - Безпека файлової системи додатків

PHP - Безпека файлової системи додатків Налаштування PHP є мало найважливішим аспектом у питанні безпеки сервера, так як PHP-скрипти можуть маніпулювати файлами і каталогами на диску. У зв'язку з цим існують конфігураційні налаштування, що вказують, які файли можуть бути доступні з директорії і які операції з ними можна виконувати. Необхідно бути обережним, так як будь-який з файлів з ​​відповідними правами доступу може бути прочитаний кожним, хто має доступ до файлової системи.

Оскільки в PHP спочатку передбачався повноправний користувальницький доступ до файлової системи, можна написати невеликий скрипт, який дозволить читати системні файли, такі як / etc / passwd, керувати мережевими з'єднаннями, відправляти завдання принтеру, і так далі. Звідси випливає, що ви завжди повинні бути впевнені в тому, що файли, які ви читаєте або модифікуєте, відповідають вашим намірам.

Розглянемо невеликий приклад, в Коротя користувач створив скрипт, що видаляє файл з його домашньої директорії. Припустимо ситуацію, коли веб-інтерфейс, написаний на PHP, часто використовується для роботи з файлами, і налаштування безпеки дозволяють видаляти файли в домашньому каталозі.

Приклад 1: недостатня перевірка вхідних даних
/ / Видалення файлу з домашньої директорії користувача
$ Username = $ _POST ['user_submitted_name'];
$ Homedir = "/ home / $ username";
$ File_to_delete = "$ userfile";
unlink ("$ homedir / $ userfile");
echo "$ file_to_delete has been deleted!";


Так як змінні вводяться в користувальницької формі, є можливість видалити файли, що належать будь-кому іншому, ввівши певні значення. У цьому випадку може знадобитися авторизація. Подивимося, що станеться, якщо будуть відправлені значення ".. / Etc /" і "passwd". Скрипт виконає такі завдання:

Приклад 2: вчинення атаки на файлову систему
/ / Видалення будь-якого файлу, доступного з PHP-скрипта.
/ / У разі, якщо PHP працює з правами користувача root:
$ Username = ".. / Etc /";
$ Homedir = "/ home /.. / Etc /";
$ File_to_delete = "passwd";
unlink ("/ home /.. / etc / passwd");
echo "/ home /.. / etc / passwd has been deleted!";


Є два рішення описаної проблеми.
- Обмежити доступ користувача, з правами якого працює веб-сервер.
- Перевіряти всі дані, що вводяться користувачем.


Приклад 3: Найбільш безпечна перевірка імені файлу
/ / Видалення будь-якого файлу, доступного з PHP-скрипта.
$ Username = $ _SERVER ['REMOTE_USER']; / / використання авторизації

$ Homedir = "/ home / $ username";

$ File_to_delete = basename ("$ userfile"); / / усічення шляху
unlink ($ homedir / $ file_to_delete);

$ Fp = fopen ("/ home / logging / filedelete.log", "+ a"); / / логіруем видалення
$ Logstring = "$ username $ homedir $ file_to_delete";
fwrite ($ fp, $ logstring);
fclose ($ fp);

echo "$ file_to_delete has been deleted!";

Але й така перевірка не расматривает всі можливі ситуації. Якщо система авторизації дозволяє користувачам вибирати довільні логіни, зломщик може створити обліковий запис вигляду ".. / Etc /" і система знову опиниться вразливою. Виходячи з цього, вам може знадобитися більш сувора перевірка:

Приклад 4: Найбільш сувора перевірка імені файлу
$ Username = $ _SERVER ['REMOTE_USER']; / / використання авторизації
$ Homedir = "/ home / $ username";

if (! ereg ('^ [^. /] [^ /] * $', $ userfile))
     die ('bad filename'); / / завершення роботи

if (! ereg ('^ [^. /] [^ /] * $', $ username))
     die ('bad username'); / / завершення роботи
/ / Etc ...

Залежно від операційної системи необхідно передбачати можливість атаки на різноманітні файли, включаючи системні файли пристроїв (/ dev / або COM1), конфігураційні файли (наприклад / etc / або файли з розширенням. Ini), добре відомі області зберігання даних (/ home /, My Documents), і так далі. Виходячи з цього, як правило, легше реалізувати таку політику безпеки, в якій заборонено все, виключаючи те, що явно дозволено.


1294 24.11.13



Напівжирний Нахилений текст Підкреслений текст Перекреслений текст | Вирівнювання по лівому краю По центру Вирівнювання по правому краю | Вставка смайликів Вибір кольору | Прихований текст Вставка цитати Перетворити вибраний текст з транслітерації в кирилицю Вставка спойлеру