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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python17 105
  • Облачные технологии14 073
  • QA вакансии3 460
  • Backend вакансии2 098
  • Инженер данных1 805
  • Продакт-менеджер1 266

Разработка

  • Android1 866
  • iOS1 699
  • Fullstack вакансии979
  • AI вакансии951
  • Frontend вакансии742
  • Mobile вакансии44

По стеку

  • Go8 651
  • Java6 544
  • Node.js2 018
  • .NET1 719
  • Kotlin1 623
  • Rust1 453
  • C#709
  • PHP683
  • C++571

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

  • Kubernetes7 763
  • DevOps вакансии6 057
  • Linux-инфраструктура5 492
  • Terraform / IaC4 261
  • CI/CD3 240
  • Мониторинг и Observability1 783
  • SRE566
  • Кибербезопасность453

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

  • Data Scientist1 140
  • Бизнес-аналитик930
  • Аналитик данных853
  • Системный аналитик154

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

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

По регионам

  • Вакансии в США43 685
  • Вакансии в Европе23 862
  • Вакансии в Канаде4 413
  • Работа в России3 909

По формату

  • Удалённые вакансии73 887
  • Релокация в США43 685
  • Гибридная работа12 392
  • Офисная работа7 088

По уровню

  • Senior вакансии42 236
  • Middle вакансии20 545
  • Junior вакансии6 653

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

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab138 вакансий
  • Celonis39 вакансий
  • Spotify36 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace16 вакансий

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

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

Как валидировать и ограничивать размер request body, чтобы не получить DoS?

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

Оберните Request.Body в http.MaxBytesReader до вызова ShouldBind, установите ReadTimeout на http.Server и проверяйте ошибку &http.MaxBytesError при парсинге тела.

Уровень 1: ReadTimeout на http.Server

Ограничивает общее время чтения запроса (заголовки + тело). Защищает от slow-body атак.

srv := &http.Server{
	Addr:        ":8080",
	Handler:     router,
	ReadTimeout: 10 * time.Second, // полное время чтения запроса
}

Ограничение размера request body в Gin

Без ограничений клиент может отправить тело произвольного размера и заставить сервер выделить столько же памяти. Защита строится на трёх уровнях: таймаут TCP-чтения, ограничение размера тела и явная проверка ошибки превышения.

Уровень 2: http.MaxBytesReader в middleware

http.MaxBytesReader оборачивает io.Reader и возвращает ошибку, когда прочитано больше лимита. Устанавливайте его глобально через middleware:

func MaxBodySize(limit int64) gin.HandlerFunc {
	return func(c *gin.Context) {
		c.Request.Body = http.MaxBytesReader(c.Writer, c.Request.Body, limit)
		c.Next()
	}
}

func main() {
	router := gin.New()
	router.Use(gin.Recovery())
	router.Use(MaxBodySize(4 << 20)) // 4 MB для всех маршрутов

	// Для отдельных маршрутов можно задать другой лимит:
	upload := router.Group("/upload")
	upload.Use(MaxBodySize(50 << 20)) // 50 MB для загрузки файлов
	upload.POST("/avatar", uploadHandler)
}

Уровень 3: Обработка ошибки превышения лимита

При парсинге тела через c.ShouldBindJSON или ручное чтение нужно проверять тип ошибки:

func createItemHandler(c *gin.Context) {
	var req CreateItemRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		var maxBytesErr *http.MaxBytesError
		if errors.As(err, &maxBytesErr) {
			c.JSON(http.StatusRequestEntityTooLarge, gin.H{
				"error": "request body too large",
				"limit": maxBytesErr.Limit,
			})
			return
		}
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}
	c.JSON(http.StatusCreated, gin.H{"id": "123"})
}

Валидация структуры запроса

После парсинга дополнительно валидируйте поля через теги binding (используется github.com/go-playground/validator/v10):

type CreateItemRequest struct {
	Name    string `json:"name" binding:"required,max=255"`
	Content string `json:"content" binding:"required,max=65536"`
	Tags    []string `json:"tags" binding:"max=10,dive,max=50"`
}

Content-Length заголовок

Проверка Content-Length быстрее, но ненадёжна — клиент может прислать неверный заголовок или chunked encoding без него. Используйте как дополнительный быстрый отказ:

func RejectLargeContentLength(limit int64) gin.HandlerFunc {
	return func(c *gin.Context) {
		if c.Request.ContentLength > limit {
			c.AbortWithStatusJSON(http.StatusRequestEntityTooLarge, gin.H{
				"error": "content-length exceeds limit",
			})
			return
		}
		c.Next()
	}
}

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

  • MaxBytesReader не вызван до чтения тела — если тело уже начало читаться (например, другим middleware), ограничение не сработает.
  • Порядок middleware важен — MaxBodySize должен быть зарегистрирован до любого middleware, который читает тело (например, логирования с body capture).
  • Multipart/form-data требует отдельной настройки — для форм используйте c.Request.ParseMultipartForm(maxMemory) с явным лимитом; MaxBytesReader ограничивает только поток чтения, но не предотвращает запись во временные файлы.
  • gzip тела обходит лимит — если принимаете сжатые тела, ограничивайте размер после распаковки, иначе небольшой сжатый запрос может распаковаться в гигабайты (zip bomb).
  • Разные лимиты для разных эндпоинтов — повторный вызов MaxBytesReader в хендлере перезапишет middleware-уровень; убедитесь, что логика согласована.
  • 413 vs 400 — превышение размера это HTTP 413 (Request Entity Too Large), не 400; клиенты могут обрабатывать их по-разному.

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

  • В каких backend-проектах Gin (Go framework) является сильным выбором, а где лучше выбрать более простой или другой стек?
  • Что такое система валидации Gin и как использовать struct tags для валидации входных данных?
  • Как писать unit-тесты для Gin-обработчиков с помощью httptest?
  • Как реализовать middleware аутентификации (JWT) в Gin?

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

  • Отвечать определением без production-сценария.
  • Не называть runtime boundary, security boundary или failure mode.
  • Игнорировать версию API, observability и тестовую проверку.

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

  • Объясняет механизм своими словами и без выдуманных API.
  • Называет реальные риски, диагностику и критерий корректности.
  • Связывает ответ с текущей документацией и миграционными ограничениями.

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

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

Источники

  • https://gin-gonic.com/en/docs/middleware/security-guide/
  • https://gin-gonic.com/en/docs/server-config/custom-http-config/

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

GinGINgin-productionrisk-analysistechnical-depth