Вы пишете на PHP и думаете, что ваш сайт в безопасности? А что, если я скажу, что одна маленькая ошибка может открыть дверь хакерам? В этой статье мы разберём две самые популярные атаки на PHP-приложения: SQL-инъекции и XSS. Вы узнаете, как они работают и как от них защититься.

Digital-студия WNDER

SQL-инъекции: когда запросы становятся оружием

SQL-инъекция — это когда злоумышленник вставляет свой SQL-код в запрос через пользовательский ввод. Представьте, что вы оставили ключи от квартиры в двери. Пример уязвимого кода:

$id = $_GET['id'];
$query = "SELECT * FROM users WHERE id = $id";
$result = mysqli_query($conn, $query);

Если пользователь передаст 1 OR 1=1, запрос вернёт всех пользователей. А если 1; DROP TABLE users; --, вы потеряете данные. Как защититься? Используйте подготовленные выражения (prepared statements).

$stmt = $conn->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("i", $id);
$stmt->execute();
$result = $stmt->get_result();

Подготовленные выражения отделяют код от данных, поэтому инъекция невозможна. Также всегда проверяйте типы данных и используйте белый список для допустимых значений.

Правило: Никогда не подставляйте пользовательские данные напрямую в SQL-запрос. Всегда используйте подготовленные выражения или хранимые процедуры.

XSS-атаки: когда ваш сайт атакует пользователя

XSS (Cross-Site Scripting) — это внедрение вредоносного JavaScript-кода на страницу, который выполняется в браузере жертвы. Например, если вы выводите комментарии без фильтрации:

echo $_POST['comment'];

Злоумышленник может отправить комментарий с таким кодом:

alert('XSS');

И этот скрипт выполнится у всех, кто увидит комментарий. Чтобы защититься, экранируйте вывод с помощью htmlspecialchars():

echo htmlspecialchars($_POST['comment'], ENT_QUOTES, 'UTF-8');

Также используйте Content Security Policy (CSP) и устанавливайте флаг HttpOnly для cookie, чтобы JavaScript не мог их прочитать.

Лайфхак: Для вывода данных в HTML всегда используйте htmlspecialchars(). Для JavaScript — json_encode(). Для URL — urlencode().

Другие распространённые угрозы

Помимо SQL-инъекций и XSS, есть и другие опасности: CSRF, включение файлов, выполнение команд. Вот краткая таблица с методами защиты:

Угроза Метод защиты
SQL-инъекция Подготовленные выражения, валидация
XSS htmlspecialchars(), CSP
CSRF Токены, SameSite cookies
Включение файлов Белый список файлов, realpath()
Выполнение команд Избегать shell_exec, escapeshellarg()

Практические советы по безопасности

  • Всегда обновляйте PHP и библиотеки.
  • Используйте фреймворки (Laravel, Symfony) — они уже содержат защиту.
  • Включите отображение ошибок только на этапе разработки, на продакшене — логируйте.
  • Ограничьте права базы данных: не используйте root для приложения.
  • Регулярно проводите аудит кода и пентесты.

Заключение

Безопасность — это не роскошь, а необходимость. SQL-инъекции и XSS — самые распространённые атаки, но с ними можно справиться, если следовать простым правилам: используйте подготовленные выражения, экранируйте вывод, валидируйте входные данные. Помните, что безопасность — это процесс, а не одноразовое действие.

Студия WNDER