C# C#  ·  30 вопросов  ·  ~85 мин  ·  ⏱ Таймер 25:00  ·  Сложный  · 

Безопасность .NET-приложения

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

Отвечено: 0 из 30
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 30 вопросов отведено 85 минут. В заданиях с кодом учитывайте указанную конструкцию и не додумывайте отсутствующие условия. После завершения откроются общий результат, тематические шкалы и разбор каждого ответа.
Вопрос 1 из 30
Что доказывает успешная аутентификация?
C#
app.MapGet("/me", (ClaimsPrincipal user) => user.Identity?.Name)
   .RequireAuthorization();
Вопрос 2 из 30
Какие проверки нужны JWT access token?
C#
services.AddAuthentication().AddJwtBearer(options =>
{
    options.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuer = true,
        ValidateAudience = true,
        ValidateLifetime = true,
        ValidateIssuerSigningKey = true,
        ValidIssuer = issuer,
        ValidAudience = audience,
        IssuerSigningKey = signingKey
    };
});
Вопрос 3 из 30
Как хранить пароль пользователя?
Вопрос 4 из 30
Почему access token лучше делать короткоживущим?
Вопрос 5 из 30
Какой риск создаёт такое журналирование заголовка авторизации?
C#
var authorization = context.Request.Headers.Authorization.ToString();
log.LogInformation("Authorization: {Header}", authorization);
Вопрос 6 из 30
Что отвечает авторизация?
C#
var result = await authorization.AuthorizeAsync(
    user, order, "CanRefundOrder");
if (!result.Succeeded) return Results.Forbid();
Вопрос 7 из 30
Почему [Authorize(Roles="Manager")] может быть недостаточно для редактирования заказа?
Вопрос 8 из 30
Как выполнить resource-based authorization?
C#
var order = await repository.FindAsync(id, token);
if (order is null) return Results.NotFound();
var allowed = await authorization.AuthorizeAsync(user, order, "CanEditOrder");
return allowed.Succeeded ? await Update(order) : Results.Forbid();
Вопрос 9 из 30
Что означает deny by default?
Вопрос 10 из 30
Почему проверка ownerId из тела запроса опасна?
C#
var command = await request.ReadFromJsonAsync<DeleteDocumentCommand>();
var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);

if (command!.OwnerId != userId)
    return Results.Forbid();

return await documents.DeleteAsync(command.DocumentId);
Вопрос 11 из 30
Где не следует хранить production connection string с паролем?
JSONappsettings.json
{
  "ConnectionStrings": {
    "Main": "Server=db;User Id=app;Password=plain-secret"
  }
}
Вопрос 12 из 30
Для чего dotnet user-secrets?
Вопрос 13 из 30
Почему управляемая идентичность лучше статического облачного ключа?
Вопрос 14 из 30
Как подготовить ротацию ключа подписи?
C#
var credentials = keyRing.CurrentSigningCredentials;
var validationKeys = keyRing.ActiveValidationKeys;
Вопрос 15 из 30
Какое действие должно быть первым после обнаружения такого файла в истории Git?
C#
// appsettings.Production.json из старого коммита
{
  "Payments": {
    "ApiKey": "sk_live_7f3c..."
  }
}
Вопрос 16 из 30
Почему BinaryFormatter не подходит для недоверенных данных?
C#
var formatter = new BinaryFormatter();
var value = formatter.Deserialize(untrustedStream);
Вопрос 17 из 30
Что опасно в TypeNameHandling.Auto/All для внешнего JSON без binder allowlist?
Вопрос 18 из 30
Как безопасно поддержать несколько видов команд?
C#
return envelope.Kind switch
{
    "create-order" => envelope.Payload.Deserialize<CreateOrderDto>(options),
    "cancel-order" => envelope.Payload.Deserialize<CancelOrderDto>(options),
    _ => throw new JsonException("Unsupported command kind")
};
Вопрос 19 из 30
Зачем MaxDepth и лимит размера?
Вопрос 20 из 30
Какую защитную границу создаёт этот код?
C#
var dto = await JsonSerializer.DeserializeAsync<CreateUserDto>(body, options, token);
Validate(dto);
var user = User.Create(dto.Name, dto.Email);
Вопрос 21 из 30
Какая матрица нужна для защищённого endpoint?
C#
var cases = new[]
{
    Anonymous(), ExpiredToken(), WrongTenant(), Owner(), Administrator()
};
foreach (var testCase in cases)
    await AssertAuthorizationAsync(testCase);
Вопрос 22 из 30
Как тестировать JWT-подпись?
C#
var forged = TamperPayload(validToken, new { role = "admin" });
using var request = new HttpRequestMessage(HttpMethod.Get, "/admin");
request.Headers.Authorization = new("Bearer", forged);
Assert.Equal(HttpStatusCode.Unauthorized, (await client.SendAsync(request)).StatusCode);
Вопрос 23 из 30
Что делает secret scanning в CI?
Вопрос 24 из 30
Что журналировать при отказе авторизации?
C#
audit.LogAuthorizationDenied(
    policy: "CanEditOrder",
    subjectId: user.FindFirstValue(ClaimTypes.NameIdentifier),
    resourceId: order.Id,
    traceId: Activity.Current?.TraceId.ToString());
Вопрос 25 из 30
Как fuzzing помогает JSON-граничному коду?
Вопрос 26 из 30
Почему хеширование пароля намеренно дорогой?
C#
var result = passwordHasher.HashPassword(user, password);
Вопрос 27 из 30
Что кэшировать при проверке JWT от внешнего issuer?
C#
var configuration = await configurationManager
    .GetConfigurationAsync(token);
var signingKeys = configuration.SigningKeys;
Вопрос 28 из 30
Что такое граница доверия?
Вопрос 29 из 30
Почему многоуровневая защита не означает дублировать один и тот же if повсюду?
Вопрос 30 из 30
Как защитить дорогой endpoint генерации отчёта?
C#
app.MapPost("/reports", CreateReport)
    .RequireAuthorization("CanCreateReports")
    .RequireRateLimiting("reports");
// Внутри — bounded queue и cancellation.

Ответьте на все 30 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу