Андрей Селькин | Outbox
Как положить сервер на разборе параметров?
Есть одна оговорка про хеш-таблицы, которую все выдают на собеседовании, но забывают при разработке. Поиск и вставка работают за O(1). В среднем. Это «в среднем» многое меняет, если ключи в таблицу присылает тот, кто хочет положить сервис. Можно специально подобрать их так, чтобы сервер тратил всё больше времени на каждую последующую вставку. Эта атака называется hash flooding. И начинается она с обычной коллизии. ——— Хеш-функция выбирает корзину для ключа. Разные ключи могут попасть в одну корзину, поэтому таблице нужен способ хранить их вместе...
Как подделать JWT, зная только публичный ключ
Про JWT уже написали столько, что очередной разбор заголовка, данных и подписи хочется пролистнуть. Поэтому я хочу разобрать конкретную уязвимость: как пользователь может вписать себе role=admin и пройти проверку подписи. Без приватного ключа. Ему хватит публичного — того самого, который можно свободно раздавать. Уязвимость называется algorithm confusion — подмена алгоритма. Атакующий указывает в токене другой алгоритм и подписывает его публичным ключом сервера. Уязвимый код использует этот ключ как HMAC-секрет...
Тимлид, который решает всё сам, делает команду слабее
Аналитик и тимлид тащат проект в две каски. Аналитик собирает ФТ и НФТ, проектирует интеграции, ведёт проект и согласует ожидаемый результат. Когда перестаёт вывозить, НФТ и интеграции забирает тимлид. У тимлида при этом остаются люди, процессы и ответственность за результат. В какой-то момент проект упирается в свободное время этих двоих. ——— Разработчики ждут декомпозицию. Решения принимают несколько экспертов, а на обсуждение с командой времени нет: «делаем вот так». Команда привыкает реализовывать чужие решения. Самостоятельно проектировать ей почти не приходится. Сильный тимлид может долго вытягивать проект в таком режиме...
🪫 После релиза отдохну
Ты уже устал, но ещё можешь поработать. Этого почему-то хватает, чтобы снова отложить отдых. Закрыть ноутбук неудобно: у разработчика вопрос, задача почти готова, завтра спросят результат. А прогулку перенести легко. Сон тоже. «После релиза отдохну». Только после релиза нужно разобрать баги и готовить следующий. Каждый раз находится достаточно веская причина ещё немного потерпеть. Так отдых постепенно становится чем-то, что ты разрешишь себе, когда уже совсем не сможешь работать. ——— При этом кажется, что ты справляешься. Задачи ведь закрываются. Только на обсуждении архитектуры уже хочется согласиться с первым вариантом, лишь бы закончили...
Go. Хватит хранить одно и то же
В памяти миллион строк. Уникальных — тысяч десять. Остальное — одни и те же значения, которые ты хранишь снова и снова. В Go для таких случаев есть пакет unique. Он появился в Go 1.23 и решает старую задачу interning: хранить одну каноническую копию одинаковых значений. words := make([]unique.Handle[string], n) for i := range n { words[i] = unique.Make(generate()) } unique.Make() принимает любое comparable-значение и возвращает Handle. Если сделать так: a := unique.Make("postgres") b := unique.Make("postgres") то: a == b // true Почему это полезно? Мы уже не сравниваем содержимое двух строк...
