💡 Инструкция: Выберите один ответ из пяти. На работу отведено 85 минут. В заданиях с кодом опирайтесь на показанный фрагмент и наблюдаемое поведение; в ситуационных — на публичный договор и последствия решения.
Вопрос 1 из 30
Какое утверждение корректно связывает показанный код с семантикой темы «Секреты»?
Dart Dart · Секреты · семантика Копировать
const publicClientId = String.fromEnvironment('PUBLIC_CLIENT_ID');
Future<AccessToken> signIn(AuthCode code) {
return backend.exchange(code: code, clientId: publicClientId);
}
// No permanent client secret is embedded in the application.
// Контекст задания: проверка семантики фрагмента.
Секрет, встроенный в мобильный клиент, можно извлечь; приложение хранит только публичные идентификаторы или краткоживущие токены, а постоянный ключ остаётся на сервере.
Для «Секреты» считать случаи «секрет в исходниках, ресурсах, строках бинарника и журнале приложения» эквивалентными, если программа не завершается аварийно.
Порядок внутренних вызовов «Секреты» считать публичной гарантией, которую нельзя менять при рефакторинге. Так внутренняя структура «Секреты» фактически становится частью внешнего обещания.
Спорный результат «Секреты» должен разбирать вызывающий код, поскольку компонент отвечает лишь за обычный путь. Предполагается, что компиляция уже подтверждает весь договор «Секреты».
Случай «журнале приложения» объявить внутренней деталью «Секреты», даже если клиент видит иной результат. Клиенту «Секреты» предлагают самостоятельно уточнять смысл спорного результата.
Вопрос 16 из 30
Обычный путь в коде зелёный. Как построить проверку «Защита данных», чтобы не пропустить различия между отказами?
Dart Dart · Защита данных · границы Копировать
Future<void> saveEncrypted(File file, Uint8List plaintext, SecretKey key) async {
final nonce = randomBytes(12);
final box = await cipher.encrypt(plaintext, secretKey: key, nonce: nonce);
await writeAtomically(file, [...nonce, ...box.cipherText, ...box.mac.bytes]);
}
// Контекст задания: анализ граничных входов.
Составить отдельные сценарии для границ: персональные данные в кэше и журнале, слабый ключ и отсутствие удаления после завершения срока хранения.
Для «Защита данных» ограничиться случаем «персональные данные в кэше и журнале», а остальные входы считать тем же классом отказа.
Объединить «персональные данные в кэше и журнале» и «слабый ключ» в один тест «Защита данных» с общим ожидаемым исходом.
Проверить для «Защита данных» только самый сложный случай «отсутствие удаления после завершения срока хранения», считая остальные границы косвенно покрытыми.
Автоматизировать обычный путь «Защита данных», а случай «отсутствие удаления после завершения срока хранения» оставить в ручном чек-листе выпуска.
Вопрос 17 из 30
Несколько мест использования повторяют одну и ту же защиту. Какая правка должна стать единой для темы «Защита данных»?
Dart Dart · Защита данных · исправление Копировать
Future<void> saveEncrypted(File file, Uint8List plaintext, SecretKey key) async {
final nonce = randomBytes(12);
final box = await cipher.encrypt(plaintext, secretKey: key, nonce: nonce);
await writeAtomically(file, [...nonce, ...box.cipherText, ...box.mac.bytes]);
}
// Контекст задания: выбор места исправления.
Оставить поведение «Защита данных» прежним, но заменить сообщение об ошибке на более подробное.
Скрыть сбой «Защита данных» автоматической повторной попыткой без ограничения числа запусков.
Перенести проверку «Защита данных» в тестовый код, не меняя производственную реализацию. Команда выбирает этот путь как локальный и наименее рискованный для соседнего кода.
Минимизировать данные, шифровать подходящим ключом и удалять их по окончании жизненного цикла.
Скопировать защиту «Защита данных» во все найденные места вызова и считать повторение единым исправлением.
Вопрос 18 из 30
Какой тезис о коде «Защита данных» можно защитить без ссылки на удачный тестовый запуск?
Dart Dart · Защита данных · семантика Копировать
Future<void> saveEncrypted(File file, Uint8List plaintext, SecretKey key) async {
final nonce = randomBytes(12);
final box = await cipher.encrypt(plaintext, secretKey: key, nonce: nonce);
await writeAtomically(file, [...nonce, ...box.cipherText, ...box.mac.bytes]);
}
// Контекст задания: проверка семантики фрагмента.
Два компилирующихся варианта «Защита данных» считать семантически взаимозаменяемыми без проверки результата.
Порядок внутренних вызовов «Защита данных» считать публичной гарантией, которую нельзя менять при рефакторинге.
Случай «отсутствие удаления после завершения срока хранения» объявить внутренней деталью «Защита данных», даже если клиент видит иной результат.
Спорный результат «Защита данных» должен разбирать вызывающий код, поскольку компонент отвечает лишь за обычный путь.
Чувствительные данные минимизируют, шифруют подходящим ключом и удаляют по жизненному циклу; маскирование интерфейса не защищает файл на диске.
Вопрос 22 из 30
Какое описание семантики показанного решения по теме «Риски безопасности» является точным?
Dart Dart · Риски безопасности · семантика Копировать
Future<ApiResponse> transfer(Transfer command) {
return api.post(
'/transfers',
body: command.toJson(),
headers: {'Idempotency-Key': command.idempotencyKey.value},
);
}
// Контекст задания: проверка семантики фрагмента.
Случай «анализ бинарника» объявить внутренней деталью «Риски безопасности», даже если клиент видит иной результат.
Для «Риски безопасности» считать случаи «подменённое устройство, вредоносный прокси, повтор запроса, утечка токена и анализ бинарника» эквивалентными, если программа не завершается аварийно.
Порядок внутренних вызовов «Риски безопасности» считать публичной гарантией, которую нельзя менять при рефакторинге.
Спорный результат «Риски безопасности» должен разбирать вызывающий код, поскольку компонент отвечает лишь за обычный путь.
Модель угроз учитывает подменённое устройство, вредоносный прокси, утечку журналов и повтор запросов; защита только от случайного пользователя недостаточна.