Один за другим они называли себя и свои зоны ответственности. Алина занималась серверной частью. Роман, двадцать восемь лет, отвечал за мобильное приложение. Игорь, тридцать два, работал с базой данных — тем самым хранилищем, где лежала вся пользовательская информация. Я заносила всё в блокнот без лишних подробностей: имя, проект, текущая задача.
Наконец очередь дошла до Максима.
Он негромко прочистил горло. Интонация у него по-прежнему оставалась самоуверенной, но сидел он уже иначе: не развалившись в кресле, а ровно, почти напряжённо.
— Максим. Фронтенд. Делаю личный кабинет пользователя.
— Фронтенд — это всё, что обычный пользователь видит перед собой на экране, — произнесла я, скорее фиксируя формулировку для себя, чем объясняя присутствующим. — Кнопки, поля ввода, страницы, формы. Личный кабинет — раздел, где человек входит по логину и паролю, меняет личные данные, смотрит историю действий или покупок. Правильно?
Максим коротко кивнул.
— По срокам что? — уточнила я.
— Да нормально. В работе.
— Мне нужны не общие слова, а дата. Когда будет готово?
Он едва заметно дёрнул плечом.
— Ну… к пятнице, наверное.
— Хорошо. Тогда сегодня до пяти пришли мне то, что уже сделано. Посмотрю текущее состояние.
Он усмехнулся. Почти незаметно — только уголок рта дрогнул, но я это уловила. И ещё двое рядом тоже заметили. Один из них, тот самый, что утром фыркнул в коридоре, демонстративно откинулся на спинку стула.
Планёрка закончилась. Сотрудники поднялись и потянулись к выходу. Я складывала блокнот, когда из коридора донёсся голос Максима. Говорил он негромко, но вовсе не шёпотом. Ровно так, чтобы я услышала, а в случае чего можно было сделать невинное лицо: мол, это не вам.
— По знакомству посадили, — сказал он. — Видели? Блокнотик, ручка. Как в бухгалтерии. Двадцать три года стажа, а выглядит как библиотекарша. Посмотрим, сколько продержится.
Кто-то тихо прыснул.
Алина стояла возле кулера. Она тоже всё слышала. Наши взгляды встретились. Я первой отвернулась и посмотрела в монитор.
Три раза. Всего за половину дня — три.
Сначала в коридоре: «тётенька, отойдите», да ещё при свидетелях. Потом — эта ухмылка на планёрке, когда я поставила ему конкретную задачу. И теперь — «по знакомству», сказанное у меня за спиной, но достаточно громко, чтобы попасть точно в цель.
Я вывела на экран проектный код. Нужно было понять, что уже сделано и на чём всё держится. Стоило пальцам коснуться клавиатуры, как внутри стало ровнее. Вот это была моя зона. Здесь никого не интересовало, сколько тебе лет и как ты выглядишь. Здесь существовал только один вопрос: работает система или нет.
Ровно к пяти Максим отправил код на проверку.
Я открыла файлы. Двенадцать модулей, чуть больше четырёхсот строк. Личный кабинет пользователя — та самая часть сайта, где человек авторизуется, редактирует свои данные и просматривает историю покупок. На первый взгляд задача не из самых сложных. Но именно такие участки требуют особой точности, потому что за красивой страницей стоят реальные люди, их адреса, телефоны, документы, банковские данные.
Максим подошёл к моему столу. Руки в карманах, подбородок чуть приподнят, наушники болтаются на шее.
— Отправил. Всё работает. Я могу идти?
— Подожди, — сказала я, пролистывая код. — Присядь, пожалуйста.
Он садиться не стал. Остался рядом, переступая с ноги на ногу.
Первую проблему я увидела уже через три минуты. Проверка пароля была написана неверно: система спокойно пропускала пустое поле. Это напоминало замок на двери, который открывается не ключом, а простым нажатием на ручку. Любой посторонний мог бы попасть в чужой кабинет, даже не зная пароля.
— Смотри сюда, — я указала на строку. — Проверка не отрабатывает. Пользователь может войти вообще без пароля. Ты понимаешь последствия? Чужой человек заходит в кабинет и видит всё: имя, адрес, номер карты.
Максим наклонился ближе к экрану.
— А, да. Понял. Мелочь, потом исправлю.
— Это не мелочь, — ровно ответила я. — Это дверь без замка.
Вторая ошибка оказалась не лучше: пользовательские данные передавались без защиты. Всё равно что отправить письмо с паспортными данными не в запечатанном конверте, а на открытке. Любой, кто перехватит его по дороге, сможет прочитать содержимое.
Третья проблема — одно и то же действие было продублировано в четырёх разных местах. Вместо одной общей функции он написал четыре одинаковых куска. Это как если бы в рецепте фразу «разогрейте духовку до ста восьмидесяти градусов» напечатали на каждой странице отдельно. В итоге программа становится тяжелее, медленнее и ломается чаще.
Потом нашлась четвёртая ошибка.
За ней пятая.
Потом шестая.
Максим молчал. Уши у него уже не розовели — они стали густо-красными, почти как варёные раки. Руки он наконец вынул из карманов и скрестил на груди.
Седьмая ошибка касалась проверки пользователя. Программа не убеждалась, что такой человек вообще существует, прежде чем показывать ему страницу. Как почтальон, который несёт посылку по адресу, не проверив, есть ли там дом. Посылка уходит в никуда. А данные — неизвестно кому.
— Семь ошибок, — я закрыла блокнот. — В четырёхстах с небольшим строках. Три из них критические. Если бы этот код попал на рабочий сайт, личная информация пользователей оказалась бы открыта практически для всех.
Максим стоял передо мной уже без прежней бравады. Руки опустил вдоль тела, пальцы сжал в кулаки.
— Я исправлю, — произнёс он тихо.
— Разумеется, исправишь. Завтра к десяти утра жду новую версию. Все семь пунктов должны быть закрыты.
Он резко развернулся и пошёл к выходу быстрым шагом, ни разу не оглянувшись. Дверь за ним закрылась тихо.
