Вход Регистрация
щит PHP и MySQL Безопасность: Ошибки, Типы Атак и Защита

щит PHP и MySQL Безопасность: Ошибки, Типы Атак и Защита

В этой статье рассматриваются ошибки безопасности, возникающие при написании веб-приложений на PHP и MySQL — SQL инъекции, XSS, CSRF, неправильное хранение паролей, опасные файлы

1. Введение

PHP и MySQL — самые часто используемые технологии для веб-программирования. Однако взломать их очень легко с помощью неправильно написанного кода. В этой статье рассматриваются уязвимые коды, методы атак и способы их предотвращения.


2. Наиболее распространенные ошибки безопасности

🔸 a) SQL Injection (Внедрение SQL-кода)

Уязвимый код:

php CopyEdit $id = $_GET['id']; $query = "SELECT * FROM users WHERE id = $id";

Что произойдет?

http CopyEdit ?id=1 OR 1=1

Этот запрос выведет всех пользователей.

Способ защиты:

php CopyEdit $stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id"); $stmt->execute(['id' => $_GET['id']]); ✅ Используйте PDO или MySQLi + подготовленные запросы (prepared statements).

🔸 b) XSS (Cross-site Scripting)

Уязвимый код:

php CopyEdit echo $_GET['name']; Пользователь может отправить следующую ссылку:html CopyEdit <script>alert('hacked!')</script>

Защита:

php CopyEdit echo htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8');

🔸 c) CSRF (Cross-Site Request Forgery)

Пользователь открывает страницу и выполняет вредоносное действие через вашу сессию.

Защита:

  • Добавьте токен к каждому POST-запросу.
  • $_SESSION проверяйте токен.

3. Усиление безопасности базы данных MySQL

🔹 Ограничение прав пользователя

sql CopyEdit GRANT SELECT, INSERT ON mydb.* TO 'user'@'localhost'; Никогда не пишите код через пользователя root.

🔹 Сохранение паролей

Ошибка:

php CopyEdit $password = $_POST['password'];

Правильно:

php CopyEdit $hash = password_hash($_POST['password'], PASSWORD_DEFAULT);

И проверка:

php CopyEdit if (password_verify($input_password, $hash)) { // успех }

4. Безопасность загрузки файлов

🔸 Уязвимый код:

php CopyEdit move_uploaded_file($_FILES['file']['tmp_name'], 'uploads/' . $_FILES['file']['name']);

🔸 Защита:

  • Разрешите только разрешенные типы файлов:
php CopyEdit $allowed = ['jpg', 'png', 'pdf'];
  • Измените имя файла:
php CopyEdit $filename = uniqid() . '.' . $ext;

🔹 Предотвращение перехвата сессии:

php CopyEdit ini_set('session.cookie_httponly', 1); session_start(); session_regenerate_id(true); php CopyEdit setcookie("auth", $token, [ 'expires' => time() + 3600, 'secure' => true, 'httponly' => true, 'samesite' => 'Strict' ]);

6. Дополнительные меры защиты

  • Обязательно используйте HTTPS.
  • Установите правильные разрешения для файлов и каталогов (chmod 755, 644).
  • Заблокируйте файлы .env с помощью .htaccess:
apacheconf CopyEdit <Files .env> Order allow,deny Deny from all </Files>

7. Заключение

Безопасность при работе с PHP и MySQL — это не выбор, а обязанность. Всегда считайте информацию, вводимую пользователями, ненадежной. Защищая свой код, вы защищаете как своих пользователей, так и самих себя.