CA5361: Nie wyłączaj używania silnej kryptografii SChannel
Właściwości | Wartość |
---|---|
Identyfikator reguły | CA5361 |
Tytuł | Nie wyłączaj użycia silnej kryptografii w pakiecie SChannel |
Kategoria | Bezpieczeństwo |
Poprawka powodująca niezgodność lub niezgodność | Niezgodność |
Domyślnie włączone na platformie .NET 9 | Nie. |
Przyczyna
Wywołanie AppContext.SetSwitch metody ustawia wartość Switch.System.Net.DontEnableSchUseStrongCrypto
.true
Domyślnie ta reguła analizuje całą bazę kodu, ale można to skonfigurować.
Opis reguły
Ustawienie Switch.System.Net.DontEnableSchUseStrongCrypto
w celu true
osłabienia kryptografii używanej w wychodzących połączeniach protokołu Transport Layer Security (TLS). Słabsza kryptografia może naruszyć poufność komunikacji między aplikacją a serwerem, co ułatwia osobom atakującym podsłuchiwanie poufnych danych. Aby uzyskać więcej informacji, zobacz Transport Layer Security (TLS) best practices with .NET Framework (Transport Layer Security ) best practices with .NET Framework (Najlepsze rozwiązania dotyczące protokołu Transport Layer Security (TLS).
Jak naprawić naruszenia
- Jeśli aplikacja jest przeznaczona dla programu .NET Framework w wersji 4.6 lub nowszej, możesz usunąć AppContext.SetSwitch wywołanie metody lub ustawić wartość przełącznika na
false
. - Jeśli aplikacja jest przeznaczona dla programu .NET Framework wcześniej niż wersja 4.6 i działa w programie .NET Framework w wersji 4.6 lub nowszej, ustaw wartość przełącznika na
false
. - W przeciwnym razie zapoznaj się z najlepszymi rozwiązaniami dotyczącymi protokołu Transport Layer Security (TLS) w programie .NET Framework , aby uzyskać środki zaradcze.
Kiedy pomijać ostrzeżenia
To ostrzeżenie można pominąć, jeśli musisz nawiązać połączenie ze starszą usługą, której nie można uaktualnić w celu korzystania z bezpiecznych konfiguracji protokołu TLS.
Pomijanie ostrzeżenia
Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.
#pragma warning disable CA5361
// The code that's violating the rule is on this line.
#pragma warning restore CA5361
Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none
w pliku konfiguracji.
[*.{cs,vb}]
dotnet_diagnostic.CA5361.severity = none
Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.
Konfigurowanie kodu do analizowania
Użyj poniższych opcji, aby skonfigurować, które części bazy kodu mają być uruchamiane w tej regule.
Możesz skonfigurować te opcje tylko dla tej reguły, dla wszystkich reguł, do których ma ona zastosowanie, lub dla wszystkich reguł w tej kategorii (Zabezpieczenia), których dotyczy. Aby uzyskać więcej informacji, zobacz Opcje konfiguracji reguły jakości kodu.
Wykluczanie określonych symboli
Z analizy można wykluczyć określone symbole, takie jak typy i metody. Aby na przykład określić, że reguła nie powinna być uruchamiana w żadnym kodzie w typach o nazwie MyType
, dodaj następującą parę klucz-wartość do pliku editorconfig w projekcie:
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType
Dozwolone formaty nazw symboli w wartości opcji (oddzielone przez |
):
- Tylko nazwa symbolu (zawiera wszystkie symbole o nazwie, niezależnie od typu zawierającego lub przestrzeni nazw).
- W pełni kwalifikowane nazwy w formacie identyfikatora dokumentacji symbolu. Każda nazwa symboli wymaga prefiksu typu symboli, takiego jak
M:
metody,T:
dla typów iN:
przestrzeni nazw. .ctor
dla konstruktorów i.cctor
konstruktorów statycznych.
Przykłady:
Wartość opcji | Podsumowanie |
---|---|
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType |
Pasuje do wszystkich symboli o nazwie MyType . |
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 |
Pasuje do wszystkich symboli o nazwie MyType1 lub MyType2 . |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) |
Pasuje do określonej metody MyMethod z określonym w pełni kwalifikowanym podpisem. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) |
Pasuje do określonych metod MyMethod1 i MyMethod2 z odpowiednimi w pełni kwalifikowanymi podpisami. |
Wykluczanie określonych typów i ich typów pochodnych
Z analizy można wykluczyć określone typy i ich typy pochodne. Aby na przykład określić, że reguła nie powinna być uruchamiana na żadnych metodach w typach nazwanych MyType
i ich typach pochodnych, dodaj następującą parę klucz-wartość do pliku .editorconfig w projekcie:
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType
Dozwolone formaty nazw symboli w wartości opcji (oddzielone przez |
):
- Nazwa typu (zawiera tylko wszystkie typy o nazwie, niezależnie od typu zawierającego lub przestrzeni nazw).
- W pełni kwalifikowane nazwy w formacie identyfikatora dokumentacji symbolu z opcjonalnym
T:
prefiksem.
Przykłady:
Wartość opcji | Podsumowanie |
---|---|
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType |
Pasuje do wszystkich typów nazwanych MyType i wszystkich ich typów pochodnych. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 |
Dopasuje wszystkie typy o nazwie MyType1 lub MyType2 i wszystkie ich typy pochodne. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType |
Pasuje do określonego typu MyType z daną w pełni kwalifikowaną nazwą i wszystkimi jego typami pochodnymi. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 |
Pasuje do określonych typów MyType1 i MyType2 z odpowiednimi w pełni kwalifikowanymi nazwami i wszystkimi ich typami pochodnymi. |
Przykłady przykładów kodu przykładowego
Naruszenie
using System;
public class ExampleClass
{
public void ExampleMethod()
{
// CA5361 violation
AppContext.SetSwitch("Switch.System.Net.DontEnableSchUseStrongCrypto", true);
}
}
Imports System
Public Class ExampleClass
Public Sub ExampleMethod()
' CA5361 violation
AppContext.SetSwitch("Switch.System.Net.DontEnableSchUseStrongCrypto", true)
End Sub
End Class
Rozwiązanie
using System;
public class ExampleClass
{
public void ExampleMethod()
{
AppContext.SetSwitch("Switch.System.Net.DontEnableSchUseStrongCrypto", false);
}
}
Imports System
Public Class ExampleClass
Public Sub ExampleMethod()
AppContext.SetSwitch("Switch.System.Net.DontEnableSchUseStrongCrypto", false)
End Sub
End Class