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;
Простые правила безопасности
- ✅ Никогда не вставляйте данные напрямую в SQL-запрос
- ✅ Всегда используйте подготовленные запросы
- ✅ Проверяйте типы данных
- ✅ Ограничивайте права пользователя базы данных
- ✅ Делайте регулярные резервные копии
Как проверить свой сайт?
-
Попробуйте ввести в формы такой текст:
' OR '1'='1
-
Если увидите больше данных, чем должны - у вас проблема с безопасностью
-
Используйте инструменты проверки:
- 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-инъекции могут быть опасны, но защититься от них довольно просто! Главное - всегда использовать подготовленные запросы и никогда не доверять данным от пользователя. Следуйте нашим простым правилам, и ваша база данных будет в безопасности.