CA5386: избегайте жесткого кодирования значения SecurityProtocolType

Свойство Значение
Идентификатор правила CA5386
Заголовок Не встраивайте значение SecurityProtocolType
Категория Безопасность
Исправление является критическим или не критическим Не критическое
Включен по умолчанию в .NET 8 No

Причина

Это правило возникает при выполнении любого из следующих условий:

  • Было указано надежное, но жестко заданное значение System.Net.SecurityProtocolType.
  • Переменной SecurityProtocolType было присвоено целочисленное значение, представляющее версию безопасного протокола.

Безопасными являются следующие значения:

  • Tls12
  • Tls13

Описание правила

Протокол TLS обеспечивает безопасность взаимодействия между компьютерами, чаще всего с помощью протокола HTTPS. Протоколы версии TLS 1.0 и TLS 1.1 являются устаревшими, а TLS 1.2 и TLS 1.3 являются актуальными. В будущем протоколы TLS 1.2 и TLS 1.3 могут быть отмечены как нерекомендуемые. Чтобы обеспечить безопасность приложения, не следует жестко задавать версию протокола, и рекомендуется использовать по крайней мере .NET Framework версии 4.7.1. Дополнительные сведения см. в разделе Рекомендации по использованию протокола TLS с .NET Framework.

Устранение нарушений

Не следует жестко задавать версии протокола TLS.

Когда лучше отключить предупреждения

Вывод предупреждения можно отключить, если приложение предназначено для .NET Framework версии 4.6.2 или более ранней версии и может выполняться на компьютере с небезопасными настройками по умолчанию.

Отключение предупреждений

Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.

#pragma warning disable CA5386
// The code that's violating the rule is on this line.
#pragma warning restore CA5386

Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none в файле конфигурации.

[*.{cs,vb}]
dotnet_diagnostic.CA5386.severity = none

Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.

Примеры псевдокода

Нарушение имени перечисления

using System;
using System.Net;

public class ExampleClass
{
    public void ExampleMethod()
    {
        // CA5386 violation
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
    }
}
Imports System
Imports System.Net

Public Class TestClass
    Public Sub ExampleMethod()
        ' CA5386 violation
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
    End Sub
End Class

Нарушение целочисленного значения

using System;
using System.Net;

public class ExampleClass
{
    public void ExampleMethod()
    {
        // CA5386 violation
        ServicePointManager.SecurityProtocol = (SecurityProtocolType) 3072;    // TLS 1.2
    }
}
Imports System
Imports System.Net

Public Class TestClass
    Public Sub ExampleMethod()
        ' CA5386 violation
        ServicePointManager.SecurityProtocol = CType(3072, SecurityProtocolType)   ' TLS 1.2
    End Sub
End Class

Решение

using System;
using System.Net;

public class TestClass
{
    public void TestMethod()
    {
        // Let the operating system decide what TLS protocol version to use.
        // See https://learn.microsoft.com/dotnet/framework/network-programming/tls
    }
}
Imports System
Imports System.Net

Public Class TestClass
    Public Sub ExampleMethod()
        ' Let the operating system decide what TLS protocol version to use.
        ' See https://learn.microsoft.com/dotnet/framework/network-programming/tls
    End Sub
End Class

CA5364: не используйте устаревшие протоколы безопасности

CA5397: не используйте устаревшие значения SslProtocols

CA5398: избегайте жестко закодированных значений SslProtocols