Курс — «Программирование на PHP8 для начинающих» — #18 Обработка данных из форм. Защита от XSS и CSRF атак
Здравствуйте, дорогие друзья.
Безопасность веб-приложений является критически важным аспектом разработки. Две из наиболее распространенных уязвимостей, связанных с обработкой данных из форм, — это межсайтовый скриптинг (XSS) и межсайтовая подделка запросов (CSRF). В этом разделе мы рассмотрим, как защитить ваше приложение от этих атак.
Защита от XSS атак
Межсайтовый скриптинг (XSS) — это тип атаки, при котором злоумышленник внедряет вредоносный скрипт в веб-страницу, которую просматривают другие пользователи. Это может привести к краже данных, изменению содержимого страницы и другим вредоносным действиям.
- Экранирование вывода:
- Используйте функции
htmlspecialchars()
илиhtmlentities()
для экранирования специальных символов в выводимых данных.
- Используйте функции
1 2 3 4 |
<?php $userInput = "<script>alert('XSS')</script>"; echo htmlspecialchars($userInput); // Вывод: <script>alert('XSS')</script> ?> |
2. Использование Content Security Policy (CSP):
- Настройте заголовок CSP для ограничения источников, с которых могут быть загружены скрипты.
1 |
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'"> |
3. Использование безопасных библиотек:
- Используйте библиотеки, которые автоматически экранируют вывод, такие как Twig или Blade.
Защита от CSRF атак
Межсайтовая подделка запросов (CSRF) — это тип атаки, при котором злоумышленник заставляет пользователя выполнить нежелательные действия на веб-сайте, на котором пользователь аутентифицирован.
- Использование CSRF токенов:
- Генерируйте уникальный токен для каждой формы и проверяйте его при обработке запроса.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?php // Генерация CSRF токена session_start(); if (empty($_SESSION['csrf_token'])) { $_SESSION['csrf_token'] = bin2hex(random_bytes(32)); } ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>CSRF Protection Example</title> </head> <body> <form action="process_form.php" method="post"> <input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>"> <label for="name">Name:</label> <input type="text" id="name" name="name" required><br><br> <input type="submit" value="Submit"> </form> </body> </html> |
2. Использование SameSite атрибута для куки:
- Настройте атрибут SameSite для куки, чтобы предотвратить отправку куки с запросами, инициированными с других сайтов.
1 2 3 |
<?php setcookie("session_id", "value", ["samesite" => "Strict"]); ?> |
3. Проверка реферера:
- Проверяйте заголовок Referer, чтобы убедиться, что запрос был отправлен с вашего сайта.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php if ($_SERVER["REQUEST_METHOD"] == "POST") { $referer = $_SERVER['HTTP_REFERER']; $host = $_SERVER['HTTP_HOST']; if (strpos($referer, $host) === false) { die("Invalid referer."); } // Обработка данных формы $name = htmlspecialchars($_POST['name']); echo "Name: " . $name . "<br>"; } ?> |
Пример полного цикла защиты от XSS и CSRF атак:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'"> <title>Secure Form Example</title> </head> <body> <form action="process_form.php" method="post"> <input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>"> <label for="name">Name:</label> <input type="text" id="name" name="name" required><br><br> <label for="email">Email:</label> <input type="email" id="email" name="email" required><br><br> <label for="message">Message:</label> <textarea id="message" name="message" required></textarea><br><br> <input type="submit" value="Submit"> </form> </body> </html> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
<?php // process_form.php session_start(); if ($_SERVER["REQUEST_METHOD"] == "POST") { // Проверка CSRF токена if (!hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) { die("Invalid CSRF token."); } // Проверка реферера $referer = $_SERVER['HTTP_REFERER']; $host = $_SERVER['HTTP_HOST']; if (strpos($referer, $host) === false) { die("Invalid referer."); } // Валидация и фильтрация данных $name = htmlspecialchars(trim($_POST['name'])); if (empty($name)) { die("Name is required."); } $email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL); if ($email === false) { die("Invalid email format."); } $message = htmlspecialchars(trim($_POST['message'])); if (empty($message)) { die("Message is required."); } echo "Name: " . $name . "<br>"; echo "Email: " . $email . "<br>"; echo "Message: " . $message . "<br>"; } ?> |
Защита от XSS и CSRF атак является критически важной для обеспечения безопасности веб-приложений. Использование экранирования вывода, CSRF токенов, CSP и других методов защиты помогает предотвратить эти уязвимости и сделать ваше приложение более безопасным.
На этом все. Всем хорошего дня!
Цикл статей по курсу — «Программирование на PHP8 для начинающих».