Идеи и инсайты

Исследуем AI-first разработку, кодовые ограждения и архитектуру одноразовости.

Ваши зависимости могут читать переменные окружения. JavaScript им позволяет.

Ambient Authority означает, что любой код в вашем процессе Node.js может взаимодействовать с файловой системой, сетью и окружением. Вот как убрать это с помощью lockdown, compartments и явной передачи capabilities.

Одна скомпрометированная транзитивная зависимость может эксфильтровать ваш , записать данные в вашу файловую систему и открыть исходящие соединения. Ей не…

Близость в сети — это не идентичность: как сервисы аутентифицируются без окружающего полномочия

Большая часть доверия между сервисами основана на сетевом расположении, а не на криптографическом доказательстве. Вот как возможности, mTLS и SPIFFE позволяют сервисам аутентифицироваться без окружающего полномочия, и почему это сложнее, чем должно быть.

Ваши микросервисы используют общую VPC, поэтому доверяют друг другу. Это доверие — окружающее полномочие: разрешение на вызов сервиса предоставляется не…

Ваши зависимости могут читать любые файлы на диске. cap-std заставляет их запрашивать разрешение.

Стандартная библиотека Rust предоставляет окружающее файловое полномочие каждой зависимости. cap-std заменяет его API на основе полномочий, которые заставляют код доказывать, что у него есть право доступа к пути, прежде чем он откроет его.

Любой crate в дереве ваших зависимостей может открыть , записать в ваш каталог или перечислить каждый файл в вашем проекте. Стандартная библиотека Rust не…

Ваш сервис — невольный пособник: как работают атаки Confused Deputy

Атака Confused Deputy заставляет привилегированный сервис использовать свои полномочия против себя. Вот как злоумышленники эксплуатируют неявное доверие и почему capability-based security — это решение.

У вашего сервиса есть API-ключ к облачному хранилищу. Пользователь отправляет запрос. Ваш сервис добросовестно записывает файл. Файл попадает в бакет…

Ваши проверки прав вам лгут

Безопасность на основе capabilities заменяет разбросанные проверки ролей на неподделываемые токены полномочий. Вот как реализовать это в TypeScript, не делая код нечитаемым.

С задним умом любой баг с правами доступа выглядит одинаково. Какая-то функция глубоко в стеке вызовов предполагает, что вызывающая сторона уже проверила . Но…

Что, если каждая функция должна была бы получить разрешение, вместо того чтобы предполагать его?

Большая часть кода работает с окружающей полномочностью: каждая функция может затронуть всё. Безопасность на основе возможностей переворачивает эту модель, заставляя функции получать явные, ограниченные разрешения.

Ваша функция имеет доступ к базе данных, платёжному шлюзу и журналу аудита только потому, что она выполняется в том же процессе. Если злоумышленник находит баг…

Хватит выбрасывать ошибки, которые не видит ваша система типов

Выброшенные исключения скрывают пути отказа от вашей системы типов. Вот почему явный возврат ошибок делает ваш код более честным, и как перейти на него, не ненавидя свою жизнь.

Сигнатура вашей функции говорит, что она возвращает . Это не так. Она возвращает или взрывается. Система типов просто не знает о второй ветке. Это…

Newtypes в Rust делают некорректные состояния невыразимыми на этапе компиляции бесплатно

Однополевая обёрточная структура ловит баги смешения единиц измерения и путаницу типов, не добавляя ни одного байта накладных расходов.

Передайте с идентификатором пользователя в функцию, которая ожидает идентификатор заказа, и Rust не пожалуется. Оба типа — . Компилятор видит одинаковые типы,…

Операторы switch пропускают баги на этапе компиляции

Операторы switch в TypeScript молча позволяют забыть кейсы. Вот как заменить их паттернами с проверкой на исчерпываемость, которые ломают сборку вместо рантайма.

Вы отрефакторили тип фигуры, добавили новый вариант, а TypeScript остался зелёным. CI прошёл. Деплой ушёл. А потом пользователь попал в рантайм-ветку, которая…

Компилятор должен отлавливать недостающие case'ы состояний, а не ваша команда QA

Добавить новое состояние в машину легко. Помнить об обновлении каждого switch — нет. Вот как заставить TypeScript отказаться компилироваться, если вы забудете case.

Машины состояний начинаются чистыми. Три значения, три ветки switch. Затем логика повторных попыток добавляет четвёртое состояние. Частичный сбой — пятое. Вы…