https://blog.superhosting.bg/secure-code.html

Натиснете ENTER, за да видите резултатите или ESC за изход.

Блог на SuperHosting.BG

По-сигурен код със защита при include на файлове

2016-07-20
Съвети от support-a
код, сигурен код, защита от include на файлове, програмиране, сигурност

При създаването на уеб сайт се обръща внимание на много аспекти – функционалност, дизайн, ползваемост, качествен хостинг и др. “Сигурността на сайта и информацията” е още един аспект, който заема място редом до всички останали за развитието на успешен проект.

В тази статия ще дадем съвети как да защитите кода на сайта от неоторизирано добавяне на файлове и какви са добрите практики при разработката на сайт.

На какво да обърна внимание при разработка и писане на код?


Създаването на уеб сайт се извършва с написване на код, който се структурира в отделни файлове. Това най-често се ползва за логическо разделение на различните функционалности в сайта. А и по този начин има прегледност на кода. За да може да работят отделните функционалности описани във всеки файл, е необходимо да има връзка на тези файлове помежду им. Съществуват различни начини за свързването им.

Един от начините за свръзка е в кода да се посочи при дадена функционалност кой файл е необходим, за да работи тази функционалност. Този файл може да се извика и чрез URL адрес.

Например:

http://www.my-site.com/index.php?p=contactus.php

В случая в URL адреса се подава като параметър името на файла – contactus.php. Файлът е необходим за зареждането на страницата за контакти. В тази ситуация е важно да се направи проверка този файл contactus.php дали се намира в хостинг акаунта или дали е част от приложението.

В случай че не се направи проверка дали файлът се намира в хостинг акаунта или дали е част от приложението, се дава възможност трети лица да посочат техен файл, който да се зареди на сайта.

На практика това може да се използва от недобронамерени лица при опит за злоупотреба.

Начини за защита на сайта от include на външен файл

Как да защитим кода можем да представим най-нагледно със следния пример. Имаме PHP код, в който не е добавена проверка къде се намира файлът, който се извиква.

// $page се подава като параметър в URL адреса
include($page);

При ползване на тази логика за достъпване на страници, променливата $page може да се ползва и да се вмъкне друг файл или URL адрес, например http://www.not-my-site.com/contactus.php. Външният файл може да съдържа код, който да се ползва за злонамерени действия.

Добра практика е вместо да се ползват променливи за имена на файлове, да се ползват например уникални номера (ID).

Едно от решенията е да се създаде таблица, в която всеки файл, които ще се вмъква, е описан с уникален ID. В URL адреса се подава ID номера на файла, а вътрешно в скрипта е определено кой файл трябва да се include-не.

По този начин няма как да се подаде друг файл, освен този, които е дефиниран.

Например таблица:

|ID|FILE
——————-
|1 |index.php
|2 |aboutus.php
|3 |products.php
|4 |prices.php
|5 |contactus.php

Тогава URL адресът се променя и вместо

http://www.my-site.com/index.php?p=contactus.php

ще се зареди

http://www.my-site.com/index.php?p=5

Понякога преработката към ID не е удачен вариант за конкретен проект. В случай че е необходимо да остане подаването на файл в URL адреса, трябва да се добави и допълнителна проверка за защита дали файлът се намира в хостинг акаунта. Ако е изпълнено това условие файлът да се include-не.

Ето примерно решение за проверка дали файлът се намира в акаунта:

<?php
// Файловете, които се добавят, трябва задължително да се намират в
// хостинг акаунта. Всички останали действия вероятно са
// опит за злоупотреба.define (‘APP_BASEDIR’, ‘/home/cPanelUserName’);

// $url e параметърът, който се подава през URL.
// Ако е зададен несъществуващ файл или път, няма да се направи опит
// за достъпване. След това се преобразува подадения през URL път от
// относителен в абсолютен път. По този начин се избягват всички
// опити за заобикаляне на проверката къде е разположен файла.

$url=realpath($url);

//Проверяваме дали извиквания файл се намира в нашата директория.

if ( substr($url, 0, strlen(APP_BASEDIR)) == APP_BASEDIR){

//Ако файлът се намира в наша директория, го зареждаме.

include($url);
}else{

// Ако файлът не се намира в наша директория, отхвърляме заявката.
// Например добавяме наш файл по подразбиране, който да се зареди.

include(“default_include_file.php”);
}
?>

В примера по-горе е указан пълния път до основната директория на хостинг акаунта. Може да използвате и по-стриктен път. Например ако всички файлове се намират в директория /public_html/appdir, може да зададете следния път /home/cPanelUserName/public_html/appdir .

За готовите CMS системи като WordPress, Joomla и други

Преди пускането на дадена система за ползване от потребителите, разработчиците извършват редица тестове и проверки, включително за пропуски в сигурността на кода. Въпреки това е добре да се следи за нови версии на системата, в които са коригирани пропуски в кода.

За плъгините, модулите и инсталираните теми към готовата система също е препоръчително да се следи за нови версии и да се извършва редовно обновяване.

Вижте как да повишите на сигурността на сайта в 10 стъпки!

А следните статии ще ви дадат насоки за повишаването на сигурността при ползване на WordPress и Joomla.

Съвет от support- a: 

Когато пишете код, неизменна част е тестването. Важно е при тестовете да се провери както очаквания начин на работа, така и да се направи опит да се “счупи” сайта. По този начин може да бъде намерено непредвидено поведение на приложението.

Вие извършвате ли проверка и тестове на кода, преди да пуснете уеб проекта в Интернет? Откривали ли сте нещо интересно и неочаквано в поведението на сайта?

Специалист Техническа Поддръжка

Меган е нашият support гуру – може да отговори на всеки технически въпрос. Знае всичко за новите технологии. СуперСилата на Меган е, че може да обясни и най-сложните технологии на достъпен за всеки език.

500px270px
SuperHosting.BG

Препоръчани статии

Оставете коментар

4 Коментара към "По-сигурен код със защита при include на файлове"

Уведоми ме при
avatar

Никола
Гост
Никола
28 март 2014 16:33

Или просто отваряте php.ini
Намирате:
allow_url_include
И го слагате на:
allow_url_include = Off

И цялото това обяснение с простата промяна за 10 секунди.

СуперХостинг.БГ
SH
28 март 2014 19:34

Здравейте Никола,

Благодарим ви за мнението.

Деактивирането на allow_url_include e само една част от защитата, която може да се извърши при написан вече код. Това ще предотврати include-ването на URL адреси, като например http://my-site.com/index.php?page=http://bad-site.com/file.txt

Друга също много важна част от защитата е да не се допуска чрез неоторизирани заявки през кода да се достъпват файлове от сайта, които не би трябвало да се достъпват, или да се изпълнява код, който не е от приложението. По-добрият вариант е този, при който се ползват ID-та вместо директно имената на файловете.

Поздрави,
СуперХостинг.БГ

Geo
Гост
28 март 2014 9:58

Тази техника не е ли доста остаряла – инклудване на файлове, предавани с името си като URL параметър? В повечето случаи има mod-rewrite или както сте написали – масив с ID-та. И двата не позволяват описаните горе пробойни. Или имате примери на хоствани при вас сайтове, които ползват подобно инклудване?

СуперХостинг.БГ
SH
28 март 2014 19:35

Здравейте Geo,

Когато човек започне да се занимава с програмиране и все още няма натрупан опит, може да не осмисли някои аспекти от гледна точка на сигурността на кода. Желанието ни е да обърнем внимание за една добра практика. Ако има програмисти, които в свои проекти са ползвали URL include за страници, да проверят дали са достатъчно добре защитени.

Поздрави,
СуперХостинг.БГ

wpDiscuz