Уразливості безпеки PHP: викрадення сеансів, міжсайтові сценарії, введення SQL та способи їх виправлення

Безпека в PHP

Під час написання коду PHP дуже важливо пам’ятати про такі вразливі місця безпеки, щоб уникнути написання незахищеного коду.

Типи вразливостей

Це загальні уразливості, з якими ви зіткнетеся під час написання PHP-коду. Нижче ми обговоримо декілька деталей.

  • Підробка міжсайтових запитів Вразливість програми, спричинена тим, що програміст не перевіряє, звідки надіслано запит - ця атака надсилається користувачеві з високим рівнем привілеїв, щоб отримати доступ до додатку вищого рівня.
  • Міжсайтові сценарії Вразливість у програмі, спричинена програмістом, який не дезінфікує вхідні дані перед тим, як виводити вхідні дані у браузер (наприклад, коментар до блогу). Зазвичай він використовується для запуску шкідливого javascript у браузері для здійснення атак, таких як викрадення файлів cookie сеансу, серед інших шкідливих дій для отримання привілеїв вищого рівня в програмі.
  • Включення локального файлу Вразливість програми, спричинена програмістом, який вимагає введення файлу, наданого користувачем, і не дезінфікує вхідні дані перед тим, як отримати доступ до запитуваного файлу. Це призводить до включення файлу там, де він не повинен бути.
  • Віддалене включення файлів Вразливість у програмі, спричинена програмістом, який вимагає введення файлу, наданого користувачем, і не дезінфікує вхідні дані перед тим, як отримати доступ до запитуваного файлу. Це призводить до того, що файл витягується з віддаленого сервера та включається туди, де він не повинен бути.
  • Викрадення сесії Вразливість, спричинена тим, що зловмисник отримує доступ до ідентифікатора сеансу користувача та може використовувати обліковий запис іншого користувача, що видає себе за нього. Це часто використовується для отримання доступу до адміністративного облікового запису користувача.
  • Отримання ідентифікатора сеансу Отримання ідентифікатора сеансу - це вразливість, спричинена тим, що зловмисник може або вгадати ідентифікатор сеансу користувача, або використати вразливості в самій програмі або браузері користувача для отримання ідентифікатора сеансу.
  • SQL Injection Уразливість у програмі, спричинена програмістом, який не дезінфікує вхідні дані, перш ніж включити їх у запит до бази даних. Це призводить до того, що зловмисник має повне читання та частіше за все доступ до записів до бази даних. З таким типом доступу зловмисник може робити дуже погані вчинки.

Тепер давайте розглянемо деякі загальні уразливості більш докладно.

Викрадення сесії

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

Захист від атак викрадення сесій у PHP

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

 ($_SESSION['lastaccess'] + 3600)) { session_unset(); session_destroy(); } else { $_SESSION['lastaccess'] = time(); }

Міжсайтові сценарії

Міжсайтові сценарії - це тип вразливості у веб-програмі, спричинений тим, що програміст не дезінфікує вхідні дані перед тим, як вводити дані у веб-браузер (наприклад, коментар до блогу). Зазвичай він використовується для запуску шкідливого javascript у веб-браузері для здійснення атак, таких як викрадення сесійних файлів cookie серед інших шкідливих дій, щоб отримати привілеї вищого рівня у веб-програмі.

Приклад міжсайтової атаки сценаріїв

Блог дозволяє користувачам стилізувати свої коментарі за допомогою тегів HTML, однак скрипт блогу не вилучає теги, що дозволяє будь-якому користувачеві запускати javascript на сторінці. Зловмисник може використовувати це на свою користь для запуску шкідливого javascript у браузері. Вони можуть заражати користувачів шкідливим програмним забезпеченням, викрадати сеансові файли cookie тощо.

 alert('Cross Site Scripting!'); 

Захист вашого веб-сайту від атак сценаріїв між сайтами в PHP

У PHP є дві основні функції, htmlspecialchars()і strip_tags(), вбудована, щоб захистити себе від атак сценаріїв між сайтами.

htmlspecialchars($string)Функція запобігає рядок HTML з рендеринга в HTML і відобразити його в вигляді простого тексту в веб - браузері. Приклад коду htmlspecialchars ()

The other approach is the strip_tags($string, $allowedtags) function which removes all HTML tags except for the HTML tags that you’ve whitelisted. It’s important to note that with the strip_tags() function you have to be more careful, this function does not prevent the user from including javascript as a link, you’ll have to sanitize that on our own.

strip_tags() code example

" ; echo strip_tags($usercomment, $allowedtags);

Setting the X-XSS-Protection Header:

In PHP you can send the X-XSS-Protection Header which will tell browsers to check for a reflected Cross Site Scripting attack and block the page from loading. This does not prevent all cross site scripting attacks only reflected ones and should be used in combination with other methods.

Writing your own sanitization function Another option, if you would like more control over how the sanitization works, is to write your own HTML Sanitization function, this is not recommended for PHP Beginners as a mistake would make your website vulnerable.

Defending your website from cross site scripting attacks with a Content Security Policy

An effective approach to preventing cross site scripting attacks, which may require a lot of adjustments to your web application’s design and code base, is to use a content security policy.

Set a Content Security Policy as an HTTP Header

The most common way of setting a Content Security Policy is by setting it directly in the HTTP Header. This can be done by the web server by editing it’s configuration or by sending it through PHP.

Example of a Content Security Policy set in a HTTP Header

Set a Content Security Policy as a Meta tags

You can include your Content Security Policy in the page’s HTML and set on a page by page basis. This method requires you to set on every page or you lose the benefit of the policy.

Example of a Content Security Policy set in a HTML Meta Tag

Original text


SQL Injection

SQL injection is a vulnerability in the application caused by the programmer not sanitizing input before including it into a query into the database. This leads to the attacker having full read and more often than not write access to the database. With this type of access an attacker can do very bad things.

Example SQL Injection attack

The below PHP Script runs an SQL Statement to get a user’s email by ID. However the input is not sanitized making it vulnerable to SQL Injection

connect_error) { die("Connection failed: " . $conn->connect_error); } $sql = "SELECT email FROM users WHERE idemail"]; } } else { echo "no results"; } $conn->close();
SELECT email FROM users WHERE id = `$input`;

So with the above the input is not type casted (I.e. casting the input with (int) so only a number is allowed) nor escaped allowing someone to perform an SQL Injection attack - for example the URL getemailbyuserid.php?id=1'; My Query Here-- - would allow you to run arbitrary SQL queries with little effort.

Defending your website from sql injection attacks in PHP

There are a few approaches to defend your website from SQL Injection Attacks. These approaches are Whitelisting, Type Casting, and Character Escaping

Whitelisting: The whitelisting approach is used in cases where only a few inputs are expected. You can list each expected input in a PHP Switch and then have a default for invalid input. You do not have to worry about a type casting issue or a character escape bypass but the allowed input is extreamly limited. It remains an option, see the example below.

Type Casting: The type casting approach is commonly used for an application using numeric input. Simply cast the input with (int) $input and only a numeric value will be allowed.

Character Escaping: The character escaping approach will escape characters such as quotes and slashes provided by the user to prevent an attack. If you are using MySQL Server and the MySQLi library to access your database, the mysqli_real_escape_string($conn, $string) function will take two arguments, the MySQLi connection, and the string and will properly escape the user’s input to block an sql injection attack. The exact function you use depends on the database type and php library you are using check the php library’s documentation for more information on escaping user input.

More on PHP:

  • PHP best practices
  • Best PHP code examples
  • How to prevent a slow loris attack on a PHP server
  • How to set up a local debugging environment in PHP