База данных — самый ценный актив любого сайта. Здесь хранятся профили пользователей, пароли, заказы, платежные данные и другая критическая информация. Нарушение безопасности БД не только останавливает работу сайта, но и разрушает доверие пользователей, может привести к юридическим последствиям. Для клиентов Sayt.uz безопасность БД — область, требующая особого внимания, и мы внедряем защитные слои на каждом этапе.
SQL injection — самая частая атака
SQL injection — это атака, при которой злоумышленник через поля ввода пытается отправить вредоносный SQL-код в базу. Например, если в поле пароля написать "' OR '1'='1" и сайт напрямую вставит это в SQL-запрос, аутентификация может быть нарушена. В результате такой атаки можно скачать всю базу пользователей, получить админ-права или удалить всю БД. В списке OWASP Top 10 SQL injection годами занимает верхние позиции.
Параметризованные запросы (Prepared Statements)
Самый эффективный способ защиты от SQL injection — использование параметризованных запросов. При таком подходе структура SQL-запроса и пользовательские данные отправляются отдельно, поэтому любой текст пользователя не выполняется как SQL-код. В PHP такие запросы пишутся через PDO или MySQLi. Например, через PDO: $stmt = $pdo->prepare("SELECT * FROM users WHERE email = ?"); $stmt->execute([$email]); — здесь какой бы текст ни был в $email, он принимается только как значение, а не как код.
Валидация и очистка ввода
Помимо параметризованных запросов, важна валидация введенных пользователем данных. Для каждого поля должны быть четкие правила: поле email только в формате email, поле телефона только цифры, поле имени только буквы. В PHP через filter_var() выполняются разные виды валидации. Также htmlspecialchars() защищает от XSS-атак. Такой многослойный подход обеспечивает защиту — если один слой будет пробит, другой продолжит защищать.
Минимальные права пользователя
Пользователь, через которого сайт подключается к БД, должен иметь минимально необходимые права. Для веб-сайтов обычно достаточно SELECT, INSERT, UPDATE и DELETE. Права CREATE TABLE, ALTER TABLE нужны только при установке — потом их можно убрать. Высокие права GRANT OPTION, SUPER, DROP DATABASE не должны быть у пользователя сайта. Такой подход ограничивает ущерб при успешной SQL injection — злоумышленник не сможет сделать DROP DATABASE или читать другие базы.
Шифрование чувствительных данных
Даже при всех слоях защиты есть вероятность кражи БД. Поэтому чувствительные данные должны храниться зашифрованными. Пароли никогда не должны храниться в открытом виде — они должны хешироваться через bcrypt, Argon2 или минимум PBKDF2. В PHP именно для этого созданы функции password_hash() и password_verify(). Данные кредитных карт, номера документов рекомендуется хранить зашифрованными алгоритмом AES-256.
Практика Sayt.uz
На хостинге Sayt.uz безопасность БД обеспечивается многослойным подходом. Для каждого клиента создается отдельный MySQL/MariaDB пользователь с доступом только к его базам. Прямые подключения с внешних IP заблокированы — доступ только через localhost. Автоматические ежедневные бэкапы БД хранятся 14 дней. В разделе "Безопасность БД" личного кабинета можно посмотреть статистику запросов и подозрительной активности. Наша система безопасности автоматически обнаруживает аномальные запросы (большое количество чтений, массовые DELETE) и уведомляет клиента.
Регулярные бэкапы и мониторинг
Никакая защита не дает 100% гарантии, поэтому нужны регулярные бэкапы и мониторинг. Рекомендуется ежедневное автоматическое резервное копирование БД с хранением минимум в двух местах (локальный сервер и облачное хранилище). Slow query log и general query log MySQL помогают обнаружить подозрительную активность. Также регулярно обновляйте сервер БД — много исправлений безопасности приходит с обновлениями.