Telegram Web Link
🔐 Непредвиденные уязвимости в парсерах Go

Go-разработчики нередко упускают из виду, как стандартные JSON / XML / YAML-парсеры могут быть использованы злоумышленниками, что приводит к обходу аутентификации и утечке данных.

1. Опасные теги при (un)marshal

* Поля без json:"-" участвуют в Unmarshal.
* Неверные теги:
* json:"-,omitempty" — парсер ждёт ключ "-", поле остаётся доступным.
* json:"omitempty" — имя поля становится "omitempty", модификатор не работает.

Решение: использовать json:"-" и Semgrep-правила:
trailofbits.go.unmarshal-tag-is-dash и trailofbits.go.unmarshal-tag-is-omitempty.

2. Несогласованность парсеров

* Дубликаты ключей: Go берёт последнее значение, другие парсеры — первое или ошибку.
* Регистронезависимый поиск: {"ACTION":"X"} читается как Action только в Go.
* Unicode-подмена имён (`aKtionſ`) проходит незамеченной.

3. Путаница форматов

* XML-парсер Go игнорирует мусор до/после документа → JSON-внедрение.
* YAML-парсер принимает JSON как валидный YAML.
* Пример CVE-2020-16250 (Hashicorp Vault): JSON в XML-парсер → обход auth.

Рекомендации

* Жёсткий режим:
* JSON — decoder.DisallowUnknownFields()
* YAML — KnownFields(true)
* Свой строгий парсер с проверкой дубликатов и case-collisions.
* Единый парсер и настройки во всех сервисах.
* Следить за безопасными дефолтами JSON v2 в Go.
* Использовать Semgrep для поиска рисков.

Ключевые выводы

1. Включить строгий парсинг.
2. Синхронизировать настройки во всех микросервисах.
3. Переходить на JSON v2, когда он стабилизируется.
4. Периодически запускать статический анализ (Semgrep).

Go-парсеры удобны, но при работе с недоверенными данными необходимы дополнительные меры.

📌 Читать
Forwarded from Golang
«Go 1.25 interactive tour» — отличный обзор ключевых новинок, запланированных для Go 1.25 (релиз — август 2025)

Основные моменты:
1. Синтетическое время для тестов (synctest)
Новая библиотека testing/synctest позволяет использовать «фейковый» таймер для тестов, без реального ожидания:

🧪 Использование synctest.Test для "синтетического времени"

- synctest.Test(t, func(t *testing.T) {...}) запускает функцию в изолированном "пузыре", где:

- функции пакета time используют фиктивные часы;

- если все горутины заблокированы (например, time.Sleep, select без case), время продвигается вперед автоматически, чтобы "разблокировать" эти операции.

Пример теста:


func TestReadTimeout(t *testing.T) {
synctest.Test(t, func(t *testing.T) {
ch := make(chan int)
_, err := Read(ch)
if err == nil {
t.Fatal("expected timeout error, got nil")
}
})
}

Здесь мы проверяем, что Read действительно отдает ошибку "timeout", без реального ожидания 60 секунд — synctest просто симулирует, что они прошли.

🕰 Как это работает?
Внутри synctest.Test:

- Время начинается с 2000-01-01T00:00:00Z;

- Когда все горутины заблокированы, время продвигается до следующего события (time.After, time.Sleep и т.д.);

- Это позволяет сразу активировать нужные ветки кода, которые зависят от времени, без настоящих задержек.

⚠️ Ограничения
Внутри synctest.Test нельзя использовать:


t.Run(...)

t.Parallel()

t.Deadline()

Пример неверного использования:


synctest.Test(t, func(t *testing.T) {
t.Run("subtest", func(t *testing.T) {
t.Log("fail!") // это работать не будет
})
})


testing/synctest — это инструмент для тестирования кода, зависящего от времени, без реального ожидания, что делает тесты мгновенными и стабильными. Идеально подходит для timeout, retry, delays, ticker, и других случаев, когда вы хотите протестировать "прошло ли время", но не хотите реально ждать.

2. JSON v2 — серьезный апдейт
json/v2 вводит новые функции, включая MarshalToFunc, UnmarshalFromFunc и более гибкую систему маршаллинга с пользовательскими функциями.

Пример:



json.Marshal(vals, json.WithMarshalers(marshalers))


👉 Подробно можно почитать здесь


3. Container-aware GOMAXPROCS

Теперь Go учитывает ограничения CPU из cgroups – на Docker/Kubernetes GOMAXPROCS автоматически подстраивается под лимит, а не просто равен NumCPU


4. Новый сборщик мусора — Green Tea
Экспериментальный сборщик мусора оптимизирован для больших объёмов мелких объектов, обещают на 10–40 % снижение оверхеда. Включается через GOEXPERIMENT=greenteagc 


5. Защита от CSRF (http.CrossOriginProtection)

Добавлен новый тип для отсечения запросов из кросс-доменных источников, анализируя заголовки Sec-Fetch-Site и Origin 

6. sync.WaitGroup.Go
Упрощение работы c WaitGroup — теперь можно писать:


wg.Go(func() { /* … */ })
wg.Wait()

Вместо Add + Done 

7. Flight Recorder (trace.FlightRecorder)
Flight recording — это способ отслеживать, что происходит в программе: какие функции вызываются, сколько памяти используется и другие важные события.
Но главное — эта запись ведётся не всё время, а только в «скользящем окне»: сохраняются только последние N секунд или последние N мегабайт данных.
👉 Это полезно, когда вы не знаете заранее, когда случится ошибка — flight recorder позволит «поймать» последние события перед сбоем.

8. Расширенные методы os.Root
Добавлены методы Chmod, Chown, Chtimes, Link, MkdirAll, RemoveAll, Rename, Symlink, ReadFile, WriteFile 

9. reflect.TypeAssert
Упрощает преобразование reflect.Value в конкретный тип без промежуточного интерфейса.

10. hash.Cloner
Интерфейс клонирования состояния hash-функций (Clone()), поддерживается всеми реализациями STD (SHA-1, MD5 и др.)

📌 Полный обзор обновлений

@golang_google
🔄 Cascading Context Cancellation в Go: от исходников к продакшену

В статье подробно разобрано, как Go управляет цепочками отмен Context — от базового кода до продакшен-паттернов.

🧠 Как устроена отмена Context внутри Go

1. При создании cancelCtx функция propagateCancel делает так, чтобы отмена родителя передавалась детям.
2. Если родитель — тоже cancelCtx, он хранит список потомков в children map и пробрасывает cancel(...) при отмене.
3. Если родитель имеет AfterFunc, используется таймер; иначе создаётся горутина, которая ждёт <-parent.Done() и вызывает cancel.

Структура cancelCtx:

type cancelCtx struct {
Context
mu sync.Mutex
done atomic.Value
children map[canceler]struct{}
err atomic.Value
cause error
}


🧪 WithCancelCause — отмена с причиной

Позволяет указывать причину отмены вместо обычного context.Canceled.
Пример:

ctx, cancel := context.WithCancelCause(base)
cancel(errors.New("my custom reason"))
fmt.Println(ctx.Err(), context.Cause(ctx))


Причина отмены наследуется дочерними контекстами.

🧵 Безопасность в многопоточности

Методы Done() и Err() потокобезопасны благодаря мьютексам и атомикам.
CancelFunc можно вызывать многократно — только первый вызов имеет эффект.

AfterFunc — код по отмене

Позволяет запускать функцию, когда контекст отменяется:

stop := context.AfterFunc(ctx, func() {
tx.Rollback()
})
...
if stop() { log.Println("cancel handler stopped") }


Если контекст уже отменён — функция вызовется немедленно. stop() может отменить выполнение функции.

🚫 WithoutCancel — фоновые задачи без отмены

Полезно, если горутина не должна завершаться при отмене родителя.
Важно: Done() == nil → чтение из канала блокирует навсегда.

⏲️ Таймеры: WithDeadline и WithTimeout

Функции создают контексты, которые отменяются автоматически по истечении времени.
Не забудьте делать defer cancel() после создания!

Практические советы


ctx, cancel := context.WithTimeout(parent, 100*time.Millisecond)
defer cancel()


Всегда вызывайте cancel() для освобождения ресурсов и предотвращения утечек.

🧰 Что в итоге

Этот материал охватывает:
• внутреннее устройство cancelCtx
• новые API: WithCancelCause, AfterFunc, WithoutCancel
• продакшен-паттерны безопасной отмены

📖 Полный текст статьи: https://dev.to/flew1x/cascading-context-cancellation-in-go-from-source-code-to-production-patterns-177j

@golang_books
Forwarded from Golang
🔥 Обширная коллекция практичных сниппетов, примеров и рецептов на Go для создания эффективных, надёжных и масштабируемых приложений.

Идеально для разработчиков, которые хотят:
- писать чистый и читаемый Go-код
- быстро находить решения типовых задач
- изучать лучшие практики и готовые паттерны

📚 Всё — от HTTP-серверов и работы с JSON до многопоточности, базы данных и REST API.

🔗 https://go-cookbook.com

@Golang_google

#golang #go #guide
⚡️ Почему лучшие разработчики всегда на шаг впереди?

Потому что они знают, где брать настоящие инсайд!
Оставь “программирование в вакууме” в прошлом, выбирай свой стек — подпишись и погружайся в поток идей, лайфхаков и знаний, которые не найдёшь в открытом доступе.

ИИ: www.tg-me.com/ai_machinelearning_big_data
Python: www.tg-me.com/pythonl
Linux: www.tg-me.com/linuxacademiya
Мл собес www.tg-me.com/machinelearning_interview
C++ www.tg-me.com/cpluspluc
Docker: www.tg-me.com/DevopsDocker
Хакинг: www.tg-me.com/linuxkalii
МЛ: www.tg-me.com/machinelearning_ru
Devops: www.tg-me.com/DevOPSitsec
Data Science: www.tg-me.com/data_analysis_ml
Javascript: www.tg-me.com/javascriptv
C#: www.tg-me.com/csharp_ci
Java: www.tg-me.com/java_library
Базы данных: www.tg-me.com/sqlhub
Python собеседования: www.tg-me.com/python_job_interview
Мобильная разработка: www.tg-me.com/mobdevelop
Golang: www.tg-me.com/Golang_google
React: www.tg-me.com/react_tg
Rust: www.tg-me.com/rust_code
ИИ: www.tg-me.com/vistehno
PHP: www.tg-me.com/phpshka
Android: www.tg-me.com/android_its
Frontend: www.tg-me.com/front
Big Data: www.tg-me.com/bigdatai
МАТЕМАТИКА: www.tg-me.com/data_math
Kubernets: www.tg-me.com/kubernetc
Разработка игр: https://www.tg-me.com/gamedev
Физика: www.tg-me.com/fizmat
SQL: www.tg-me.com/databases_tg

Папка Go разработчика: www.tg-me.com/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: www.tg-me.com/addlist/eEPya-HF6mkxMGIy
Папка ML: https://www.tg-me.com/addlist/2Ls-snqEeytkMDgy
Папка FRONTEND: https://www.tg-me.com/addlist/mzMMG3RPZhY2M2Iy

🎓954ГБ ОПЕНСОРС КУРСОВ: @courses
😆ИТ-Мемы: www.tg-me.com/memes_prog
🇬🇧Английский: www.tg-me.com/english_forprogrammers
🧠ИИ: www.tg-me.com/vistehno

🖥 Chatgpt для кода в тг: @Chatgpturbobot

📕Ит-книги: https://www.tg-me.com/addlist/BkskQciUW_FhNjEy
💼ИТ-вакансии www.tg-me.com/addlist/_zyy_jQ_QUsyM2Vi

Подпишись, чтобы всегда знать, куда двигаться дальше!
Please open Telegram to view this post
VIEW IN TELEGRAM
⚙️ Как правильно управлять конфигурацией в Go-приложении?

Алекс Эдвардс выпустил чёткий гайд по работе с настройками в веб-приложениях на Go:
• флаги командной строки
• переменные окружения
• конфиг-файлы (JSON, YAML)
• разделение по средам: dev, staging, prod
• и главное — как всё это объединить в чистую архитектуру

Без лишнего кода, с примерами и практикой. Подойдёт как для новичков, так и для тех, кто хочет структурировать свой проект правильно.

📖 Читать статью:
https://alexedwards.net/blog/how-to-manage-configuration-settings-in-go-web-applications
2025/07/06 17:27:51
Back to Top
HTML Embed Code: