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

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

Безопасность в PHP

При написании кода всегда стоит помнить, что есть те, кто охотиться за пользовательскими данными, промышляет взломом и различными видами атак на сайты и различные системы. 

В этой статье мы познакомимся с наиболее распространенными видами атак на сайт, а также как с ними бороться при помощи качественного кода.

Типы уязвимостей

Это наиболее распространенные уязвимости, с которыми вы столкнетесь при написании PHP кода. Ниже мы более подробно рассмотрим каждую из них.

  • Подделка межсайтовых запросов (Cross Site Request Forgery) - Уязвимость в приложении, вызванная тем, что программист не проверяет, откуда был отправлен запрос - эта атака отправляется пользователю с высоким уровнем привилегий для получения доступа к приложению более высокого уровня.
  • Межсайтовый скриптинг (Cross Site Scripting) -  Уязвимость в приложении, вызванная тем, что программист не обрабатывает пользователский ввод, к примеру через форму, и не обрабатывает ввод перед выводом в браузер (например, комментарий в блоге). Он обычно используется для запуска вредоносного javascript в браузере для выполнения таких атак, как кража файлов cookie, что может помочь злоумышленнику получить привилегии более высокого доступа.
  • Включение локального файла (Local File Inclusion) - Уязвимость в приложении вызвана тем, что программист требует ввода файла, предоставленного пользователем, и не проверяет этот файл, по типу, размеру и т.д. Это позволяет загрузить вредоносный файл туда, где его быть не должно.
  • Включение удаленного файла (Remote File Inclusion) - Уязвимость в приложении вызвана тем, что программист требует ввода файла, предоставленного пользователем, и не очищает ввод перед доступом к запрошенному файлу. Это приводит к тому, что файл извлекается с удаленного сервера и включается там, где его не должно быть.
  • Взлом сессии (Session Hijacking) - Уязвимость, вызванная тем, что злоумышленник получает доступ к идентификатору сеанса пользователя и может использовать учетную запись другого пользователя, выдавая себя за него. Часто используется для получения доступа к учетной записи администратора.
  • SQL-инъекция (SQL-инъекция) - Уязвимость в приложении, вызванная тем, что программист не очищает ввод перед включением его в запрос к базе данных. Это приводит к тому, что злоумышленник получает полный доступ для чтения и чаще всего для записи в базу данных. С этим типом доступа злоумышленник может делать очень плохие вещи.

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

Взлом сессии пользователя

Это уязвимость, вызванная тем, что злоумышленник получает доступ к идентификатору сеанса пользователя и может использовать учетную запись другого пользователя, выдавая себя за него. Это часто используется для получения доступа к учетной записи администратора.

Защита от атак с перехватом сессии в PHP

Чтобы защититься от атак с перехватом сессии, вам необходимо сравнить информацию о браузере и местоположении текущего пользователя, хранящуюся в текущем  сеансе/сессии.  Ниже приведен пример реализации, которая может помочь смягчить последствия атаки с перехватом сеанса. Он проверяет IP-адрес, агента пользователя и, если сеанс истек, удаляя сеанс до его возобновления.

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

Межсайтовый скриптинг 

Межсайтовый скриптинг - это тип уязвимости в веб-приложении, вызванный тем, что программист не очищает ввод перед выводом ввода в веб-браузер (например, комментарий в блоге). Обычно используется для запуска вредоносного javascript в веб-браузере для выполнения таких атак, как кража файлов cookie сеанса среди других вредоносных действий с целью получения привилегий более высокого уровня в веб-приложении.

Пример атаки:

Блог позволяет пользователям стилизовать свои комментарии с помощью тегов HTML, однако сценарий, запускающий блог, не удаляет теги

Защита сайта от атак межсайтового скриптинга в PHP

В PHP есть две основные функции, htmlspecialchars() и strip_tags(), встроенные для защиты от атак межсайтового скриптинга.

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

alert('Cross Site Scripting!');";
echo htmlspecialchars($usercomment);

 

 Другой подход - это функция strip_tags($ string, $ allowedtags), которая удаляет все теги HTML, кроме тегов, которые вы добавили в белый список.

alert('Cross Site Scripting!');";
$allowedtags = "

 

 

 

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

 

Настройка заголовка X-XSS-Protection

В PHP вы можете отправить заголовок X-XSS-Protection, который сообщит браузерам, что нужно проверить наличие отраженной атаки межсайтового скриптинга и заблокировать загрузку страницы. Этот способ  не предотвращает все атаки межсайтового скриптинга, только отраженные атаки, и его следует использовать в сочетании с другими методами.

Установите политику безопасности контента как метатеги 

Вы также можете включить свою политику безопасности контента непосредственно в HTML-код страницы и задать ее для каждой страницы отдельно. При использовании этого метода необходимо включать на КАЖДОЙ странице сайта, иначе метод теряет свои преимущества.


SQL-инъекции

Sql инъекции - уязвимость, которая позволем злоумышленнику при помощи передаваемых параметров внедрять части sql запросов. Приведенный ниже сценарий PHP запускает оператор SQL для получения электронной почты пользователя поего  идентификатору. Однако переданный параметр не валидируется и не проверяется, что делает его уязвимым для SQL-инъекции.


connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

$sql = "SELECT email FROM users WHERE id =" . $input;

$result = $conn->query($sql);

if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
        echo $row["email"];
    }
} else {
    echo "no results";
}

$conn->close();

SELECT email FROM users WHERE id = `$input`;

Таким образом, с приведенным выше примере, у переменной $input не приведен тип  (т.е. нет требования, что параметр должен быть только числом) и не экранирован, позволяя кому-либо выполнить атаку SQL-инъекции - например, URL-адрес 'getemailbyuserid.php?Id=1 '; В этом случае мы позволем злоумышленнику передать любое значение параметра

Защита сайта от sql-инъекций в PHP  

Есть несколько подходов к защите вашего веб-сайта от атак с использованием SQL-инъекций. Это:

  • белые списки
  • принудительное приведение типов  
  • экранирование символов.

Белый список: метод белого списка используется в тех случаях, когда ожидается только несколько входных данных. Вы можете перечислить каждый ожидаемый ввод в PHP, а затем указать значение по умолчанию для недопустимого ввода. Вам не нужно беспокоиться о проблеме с приведением типов или обходом экранирования символов, но разрешенный ввод чрезвычайно ограничен. Остается вариант, см. Пример ниже.


Приведение типов: подход приведения типов обычно используется для приложений, использующих числовой ввод. Просто приведите параметр к типу integer принудительно при помощи (int) $input, и тогда будет разрешено только числовое значение. 

Экранирование символов: подход к экранированию символов позволяет экранировать символы, такие как кавычки и косые черты, предоставленные пользователем, для предотвращения атаки. Рассмотрим пример, когда в качестве базы данных мы используем MySql и библиотеку Mysqli для обращения к ней из php. Нам пригодится функция mysqli_real_escape_string($ conn, $ string), которая будет принимать два аргумента:

  • соединение MySQLi
  • и строку

 Функция mysqli_real_escape_string будет корректно экранировать переданную строку, чтобы заблокировать атаку sql инъекции.  От того, какую библитотеку вы используете для общения с базой данных(mysql, mysqli, PDO и т.д.), зависит выбор функции экранирования. Более подробную информацию можно найти на сайте php.net

  • share:
Комментарии 0

Оставить комментарий


Комментарии могут оставлять только зарегистрированные пользователи

shape shape