TGViewer
extern volatile world extern volatile world @extern_world · 554 subscribers
Post #290 1.15K
Question interfaces! Нет ничего важнее. Если не сомневаться в основах и не задумываться над тем, что именно мы хотим сделать, то будет вечное "хотели как лучше, получилось как всегда". Расскажу историю.

Традиционно, аутентификация пользователя в Unix системах производилась в соответствии с файлом /etc/passwd, где хранились логины и хеши от паролей пользователей, а стандартная библиотека предоставляла функцию проверки, что-то в духе:

bool check_credentials(const char *username, const char *password)

На самом деле интерфейс более неуклюжий, но это не важно. Важно то, что со временем появилась необходимость хранить данные о пользователях способами, отличным от формата /etc/passwd — в базе данных или на удалённом сервере. И что-бы удовлетворить эту потребность, стали появляться библиотеки, которые предоставляли примерно такой-же интерфейс, но проверяли логин и пароль, используя данные из альтернативных источником. Вершиной такой эволюции стала библиотека PAM (Pluggable Authentication Modules), которая предоставляет универсальный интерфейс к огромному количеству способов проверки логина и пароля, большинством из которых вы никогда не воспользуетесь.

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

Можно ли было сделать лучше? Нет, если держаться за интерфейс стандартной библиотеки. Но нужно ли?

Если сделать шаг назад и пересмотреть что именно мы хотим сделать, то мы увидим, что программа состоит из трёх частей: часть, которая выполняется до проверки логина/пароля, собственно проверка и часть, которая выполняется после. Если разделить программу на три меньшие программы, то только вторая будет содержать код, связанный с проверкой логина/пароля. Да, это давно известная вещь.

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

Конечно, всё не так прямолинейно. Как за простыми формулами школьной физике, так и за простыми решениями в IT стоит титан мысли, гениальность которого нам сложно оценить, когда ответ уже перед нами.

Question interfaces, и возможно жизнь станет немного проще.
More from @extern_world
  1. Dec 28, 2023https://en.wikipedia.org/wiki/Cyber_Resilience_Act Хотели как лучше, получилось как всегда…
  2. Dec 8, 2023Они пытаются переизобрести списки рассылки и впихнуть git-send-email в этот дурной Discour…
  3. Oct 26, 2023You should regard anything from 2001 or earlier as having been written by a different pers…
  4. Oct 21, 2023У человечества новая игрушка -- machine learning как идея и ChatGPT в частности. И в моей…
  5. Oct 5, 2023Welcome to my world. # select count(*) from information_schema.columns group by table_name…
  6. Sep 14, 2023Перед вами гений инженерной мысли, без иронии. Переходник между всеми мыслимыми форматами…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →