CA5378: не отключайте ServicePointManagerSecurityProtocols
Свойство | Значение |
---|---|
Идентификатор правила | CA5378 |
Заголовок | Не отключайте ServicePointManagerSecurityProtocols |
Категория | Безопасность |
Исправление является критическим или не критическим | Не критическое |
Включен по умолчанию в .NET 8 | No |
Причина
При вызове метода AppContext.SetSwitch для Switch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols
устанавливается значение true
.
По умолчанию это правило анализирует всю базу кода, но такое поведение можно настроить.
Описание правила
Задание для Switch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols
значения true
разрешает использовать только протокол TLS 1.0 в Windows Communication Framework. Эта версия TLS будет считаться нерекомендуемой. Дополнительные сведения см. в разделе Рекомендации по использованию протокола TLS с .NET Framework.
Устранение нарушений
- Если приложение предназначено для .NET Framework версии 4.7 или более поздней, можно либо удалить вызов метода AppContext.SetSwitch, либо задать для параметра значение
false
. - Если приложение предназначено для .NET Framework 4.6.2 или более ранней версии и работает на платформе .NET Framework 4.7 или более поздней версии, установите значение параметра
false
. - В противном случае ознакомьтесь с разделом Рекомендации по использованию протокола TLS с .NET Framework для устранения рисков.
Когда лучше отключить предупреждения
Вы можете отменить это предупреждение, если необходимо подключиться к устаревшей службе, которая не может быть обновлена для использования безопасных конфигураций TLS.
Отключение предупреждений
Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.
#pragma warning disable CA5378
// The code that's violating the rule is on this line.
#pragma warning restore CA5378
Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none
в файле конфигурации.
[*.{cs,vb}]
dotnet_diagnostic.CA5378.severity = none
Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.
Настройка кода для анализа
Используйте следующие параметры, чтобы указать части базы кода, к которым будет применяться это правило.
Эти параметры можно настроить только для этого правила, для всех правил, к которым она применяется, или для всех правил в этой категории (безопасности), к которым она применяется. Дополнительные сведения см. в статье Параметры конфигурации правила качества кода.
Исключение определенных символов
Вы можете исключить из анализа определенные символы, например типы и методы. Например, чтобы указать, что правило не должно выполняться для какого-либо кода в типах с именем MyType
, добавьте следующую пару "ключ-значение" в файл EDITORCONFIG в своем проекте:
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType
Допустимые форматы имени символа в значении параметра (разделенные |
):
- Только имя символа (включает все символы с этим именем, любого типа и в любом пространстве имен).
- Полные имена в формате идентификатора документации для символа. Для каждого имени символа требуется префикс в виде символа, например
M:
для методов,T:
для типов иN:
для пространств имен. .ctor
используется для конструкторов, а.cctor
— для статических конструкторов.
Примеры:
Значение параметра | Итоги |
---|---|
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType |
Соответствует всем символам с именем MyType . |
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 |
Соответствует всем символам с именем MyType1 или MyType2 . |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) |
Соответствует конкретному методу MyMethod с заданной полной сигнатурой. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) |
Соответствует конкретным методам MyMethod1 и MyMethod2 с соответствующими полными сигнатурами. |
Исключить определенные типы и их производные типы
Из анализа можно исключать определенные типы и их производные типы. Например, чтобы указать, что правило не должно выполняться в каких-либо методах типов MyType
и их производных типов, добавьте следующую пару "ключ-значение" в файл .editorconfig своего проекта:
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType
Допустимые форматы имени символа в значении параметра (разделенные |
):
- Только имя типа (включает все типы с этим именем, любого типа и в любом пространстве имен).
- полные имена в формате идентификатора документации для символа с необязательным префиксом
T:
.
Примеры:
Значение параметра | Итоги |
---|---|
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType |
Соответствует всем типам с именем MyType и всем их производным типам. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 |
Соответствует всем типам с именем MyType1 или MyType2 и всем их производным типам. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType |
Соответствует конкретному типу MyType с заданным полным именем и всем производным от него типам. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 |
Соответствует конкретным типам MyType1 и MyType2 с заданным полным именем и всем производным от них типам. |
Примеры псевдокода
Нарушение
using System;
public class ExampleClass
{
public void ExampleMethod()
{
// CA5378 violation
AppContext.SetSwitch("Switch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols", true);
}
}
Imports System
Public Class ExampleClass
Public Sub ExampleMethod()
' CA5378 violation
AppContext.SetSwitch("Switch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols", true)
End Sub
End Class
Решение
using System;
public class ExampleClass
{
public void ExampleMethod()
{
AppContext.SetSwitch("Switch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols", false);
}
}
Imports System
Public Class ExampleClass
Public Sub ExampleMethod()
AppContext.SetSwitch("Switch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols", false)
End Sub
End Class