
Уязвимости безопасности 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 инъекции - уязвимость, которая позволем злоумышленнику при помощи передаваемых параметров внедрять части 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
Есть несколько подходов к защите вашего веб-сайта от атак с использованием 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
Оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи