Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+659новых вакансий за сутки·52 454вакансии открыты сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 688
РезюмеAIПодготовкаСтатьи
ТарифыТарифы
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 392 кандидата открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python6 033
  • Облачные технологии4 127
  • QA вакансии1 598
  • Android1 395
  • Инженер данных767
  • Продакт-менеджер295

Разработка

  • Backend вакансии1 342
  • iOS1 307
  • AI вакансии660
  • Fullstack вакансии524
  • Frontend вакансии465
  • Mobile вакансии28

По стеку

  • Go3 416
  • Java2 070
  • Kotlin926
  • Node.js731
  • Rust514
  • .NET462
  • PHP267
  • C++206
  • C#195

DevOps и инфраструктура

  • Kubernetes2 336
  • Linux-инфраструктура1 899
  • DevOps вакансии1 844
  • Terraform / IaC1 428
  • CI/CD848
  • Мониторинг и Observability650
  • SRE220
  • Кибербезопасность35

Аналитика и данные

  • Аналитик данных464
  • Data Scientist434
  • Бизнес-аналитик337
  • Системный аналитик48

Другие направления

  • Проджект-менеджер101
  • UI/UX дизайн69
  • Ручное тестирование14

По регионам

  • Вакансии в США23 332
  • Вакансии в Европе9 074
  • Работа в России2 931
  • Вакансии в Канаде2 054

По формату

  • Удалённые вакансии40 752
  • Релокация в США23 332
  • Гибридная работа3 446
  • Офисная работа2 568

По уровню

  • Senior вакансии19 645
  • Middle вакансии11 602
  • Junior вакансии3 620

Сейчас нанимают

Все компании
  • Rakuten188 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Wise94 вакансии
  • Infobip28 вакансий
  • Spotify18 вакансий
  • Celonis17 вакансий
  • Darktrace17 вакансий
  • Adyen13 вакансий
  • UiPath13 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К подготовке по вакансии←К теме MySQLВсе вопросы
MySQLSeniorТеория

Как предотвратить SQL injection при работе с MySQL?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

SQL-инъекции предотвращаются параметризованными запросами (prepared statements) — никогда не интерполируйте пользовательский ввод в SQL. Дополнительно: принцип минимальных привилегий и WAF.

Уязвимый код (никогда не делайте так)

// УЯЗВИМО: прямая конкатенация
$query = "SELECT * FROM users WHERE username = '" . $_GET['user'] . "'";
// Ввод: admin' OR '1'='1
// Итоговый запрос: SELECT * FROM users WHERE username = 'admin' OR '1'='1'

Предотвращение SQL-инъекций в MySQL

SQL-инъекция — атака, при которой вредоносный ввод изменяет структуру SQL-запроса. Единственная надёжная защита — параметризованные запросы, при которых данные и код SQL разделены на уровне протокола.

Защита 1: Prepared Statements (PDO)

$pdo = new PDO('mysql:host=127.0.0.1;dbname=app', $user, $pass, [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_EMULATE_PREPARES   => false, // критично! реальные prepared statements
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]);

$stmt = $pdo->prepare(
    'SELECT id, email FROM users WHERE username = :username AND active = :active'
);
$stmt->execute([
    ':username' => $username,  // данные никогда не попадают в SQL-текст
    ':active'   => 1,
]);
$user = $stmt->fetch();

Защита 2: MySQLi с bind_param

$mysqli = new mysqli('127.0.0.1', $user, $pass, 'app');
$mysqli->set_charset('utf8mb4'); // обязательно!

$stmt = $mysqli->prepare('SELECT id FROM users WHERE email = ? AND role = ?');
$stmt->bind_param('ss', $email, $role); // 's' = string, 'i' = int, 'd' = double
$stmt->execute();
$result = $stmt->get_result();

Защита 3: ORM (Eloquent / Doctrine)

// Eloquent автоматически параметризует
$users = User::where('email', $email)
             ->where('role', $role)
             ->get();

// Raw-запросы в Eloquent тоже безопасны через биндинг
$users = DB::select(
    'SELECT * FROM users WHERE email = ? AND created_at > ?',
    [$email, $date]
);

// ОПАСНО: DB::statement с интерполяцией:
// DB::statement("DELETE FROM users WHERE id = $id"); // никогда!

Принцип минимальных привилегий

-- Создаём отдельного пользователя для приложения
CREATE USER 'app_user'@'%' IDENTIFIED BY 'strong_password';
-- Только необходимые права — никакого SUPER, DROP, FILE
GRANT SELECT, INSERT, UPDATE, DELETE ON appdb.* TO 'app_user'@'%';
-- Для readonly-реплики:
GRANT SELECT ON appdb.* TO 'app_readonly'@'%';
FLUSH PRIVILEGES;

Дополнительные меры

  • Валидация и whitelist: если нужно динамически подставлять имя таблицы или колонки — валидируйте через whitelist, биндинг не поддерживает идентификаторы.
  • Хранимые процедуры: инкапсулируют SQL и принимают параметры — не панацея, но уменьшают поверхность атаки.
  • WAF: ModSecurity с OWASP CRS или AWS WAF с правилами для SQL-инъекций как дополнительный слой.
  • Аудит: MySQL Audit Log Plugin или Percona Audit Log — фиксируют все запросы к БД для forensics.

Подводные камни

  • PDO::ATTR_EMULATE_PREPARES = true (значение по умолчанию!) делает биндинг иллюзорным — PDO сам интерполирует данные в строку; отключайте явно.
  • Биндинг не защищает от инъекций в идентификаторы (ORDER BY $column) — используйте whitelist разрешённых значений.
  • htmlspecialchars() и addslashes() не защищают от SQL-инъекций — это инструменты для XSS и не заменяют параметризацию.
  • Second-order injection: данные сохраняются «безопасно», но потом используются в другом запросе без параметризации — часто упускают при code review.
  • Кодировка: без set_charset('utf8mb4') в MySQLi многобайтные символы могут обойти экранирование в старых версиях.
  • ORM-методы типа whereRaw(), selectRaw(), orderByRaw() принимают сырой SQL — вставка переменных без биндинга так же уязвима.
  • Сообщения об ошибках БД в ответе приложения раскрывают структуру таблиц — всегда логируйте ошибки сервер-сайд, пользователю возвращайте generic message.
  • Недостаточно параметризовать только WHERE — LIKE-паттерны с % и _ внутри биндинга остаются мета-символами; экранируйте их дополнительно.

Типичные ошибки

  • Не уточнять storage engine и говорить о предотвращение sql injection так, будто MyISAM и InnoDB ведут себя одинаково.
  • Игнорировать implicit commit, autocommit, isolation level или binlog там, где они меняют ответ.
  • Описывать PostgreSQL-поведение как MySQL-поведение.
  • Забывать проверить план через EXPLAIN и фактическую версию MySQL.

Что проверяет интервьюер

  • Кандидат объясняет предотвращение sql injection через реальный механизм MySQL, а не общими словами.
  • Приводит корректный SQL или диагностический запрос для этой СУБД.
  • Называет ограничения, версионные отличия или эксплуатационные последствия.
  • Связывает ответ с проектированием приложения, производительностью, надежностью или безопасностью.

Как вы знаете этот вопрос?

Проверить себя по теме MySQL →

Источники

  • https://dev.mysql.com/doc/refman/8.4/en/sql-prepared-statements.html
Следующий вопрос→Как делать backup/restore и point-in-time recovery через binary logs?

Связанные темы

MySQLBackend-Developmentsecure-coding

Вакансии с этим навыком

  • Senior Leader Kotlin Engineer (#5878)
  • Senior Python Engineer (with TypeScript and Agentic development experience) (#5874)
  • Senior / Lead PHP Engineer with AI skills (#5887)
  • Senior/ Lead PHP Engineer (with AI Skills) (#5828)
  • Vice Senior Manager/Group Manager - Database Section, Cloud Services Department (CLSD)

Частые вопросы на собеседовании

  • Как делать backup/restore и point-in-time recovery через binary logs?
  • Что такое MySQL и каковы его основные области применения?
  • Что такое транзакции в MySQL и как их использовать?
  • Что такое индексы в MySQL и каковы их разновидности (B-tree, full-text, spatial)?