SQL-инъекции: простое объяснение и защита

отец

Что это и почему это опасно?

Привет! Сегодня мы разберем, что такое SQL-инъекции простыми словами и научимся защищать наши базы данных от взлома.

Что такое SQL-инъекция?

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

Как выглядит SQL-инъекция?

1. Простой пример со входом

Допустим, у вас есть форма входа на сайт:

// ❌ Опасный код
$query = "SELECT * FROM users 
          WHERE username = '$username' 
          AND password = '$password'";

// 😈 Злоумышленник может ввести в поле username:
// admin' -- 
// И пароль не будет проверяться вообще!

2. Пример с поиском

// ❌ Опасный код
$query = "SELECT * FROM products 
          WHERE name LIKE '%$search%'";

// 😈 Злоумышленник может ввести:
// '; DROP TABLE products; --
// И таблица products будет удалена!

Как защитить свой сайт?

1. Используйте подготовленные запросы

Это как использовать специальный бланк, где нельзя написать ничего лишнего:

// ✅ Безопасный код
$stmt = $db->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$stmt->execute([$username, $password]);

// Даже если кто-то введет вредоносный код, он не сработает!

2. Используйте ORM

ORM (Object-Relational Mapping) - это как надежный помощник, который проверяет все запросы за вас:

// ✅ Безопасный код с Laravel
$user = User::where('username', $username)
           ->where('password', $password)
           ->first();

// Всё безопасно и просто!

3. Проверяйте типы данных

Если вы ждете число, убедитесь, что это действительно число:

// ✅ Безопасный код
if (!is_numeric($userId)) {
    die('Ошибка: ID должен быть числом!');
}
$query = "SELECT * FROM users WHERE id = " . (int)$userId;

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

  1. ✅ Никогда не вставляйте данные напрямую в SQL-запрос
  2. ✅ Всегда используйте подготовленные запросы
  3. ✅ Проверяйте типы данных
  4. ✅ Ограничивайте права пользователя базы данных
  5. ✅ Делайте регулярные резервные копии

Как проверить свой сайт?

  1. Попробуйте ввести в формы такой текст:

    ' OR '1'='1
    
  2. Если увидите больше данных, чем должны - у вас проблема с безопасностью

  3. Используйте инструменты проверки:

    • SQLmap (бесплатный)
    • OWASP ZAP (бесплатный)

Пример защищенного кода

Вот как должна выглядеть безопасная работа с базой данных:

// ✅ Безопасный код
class UserRepository {
    private $db;

    public function findUser($username, $password) {
        // 1. Подготовленный запрос
        $stmt = $this->db->prepare(
            "SELECT * FROM users WHERE username = ? AND password_hash = ?"
        );

        // 2. Хеширование пароля
        $passwordHash = password_hash($password, PASSWORD_DEFAULT);

        // 3. Безопасное выполнение
        $stmt->execute([$username, $passwordHash]);

        // 4. Получение результата
        return $stmt->fetch();
    }
}

Заключение

SQL-инъекции могут быть опасны, но защититься от них довольно просто! Главное - всегда использовать подготовленные запросы и никогда не доверять данным от пользователя. Следуйте нашим простым правилам, и ваша база данных будет в безопасности.

SQL Injection Web Security Database Безопасность
Просмотров: 0