Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Analiza kodu platformy .NET udostępnia reguły mające na celu poprawę jakości kodu. Reguły są zorganizowane w takie obszary jak projektowanie, globalizacja, wydajność i zabezpieczenia. Niektóre reguły są specyficzne dla użycia interfejsu API platformy .NET, a inne dotyczą jakości kodu ogólnego.
Indeks reguł
W poniższej tabeli wymieniono reguły analizy jakości kodu.
| Identyfikator reguły i ostrzeżenie | Description |
|---|---|
| CA1000: Nie deklaruj składowych statycznych w typach ogólnych | Gdy wywoływana jest składowa statyczna typu generycznego, należy podać argument typu dla tego typu. Gdy wywoływana jest ogólna składowa wystąpienia, która nie obsługuje wnioskowania typów, należy określić argument typu dla tej składowej. W tych dwóch przypadkach składnia określająca argument typu jest różna i łatwo o pomyłkę. |
| CA1001: Typy posiadające pola wymagające usunięcia powinny być usuwalne | Klasa deklaruje i zawiera pole instancji typu System.IDisposable, ale sama nie implementuje interfejsu IDisposable. Klasa, która deklaruje pole IDisposable, pośrednio posiada niezarządzany zasób i powinna implementować interfejs IDisposable. |
| CA1002: Nie ujawniaj list ogólnych | System.Collections.Generic.List<(Of <(T>)>) to kolekcja ogólna przeznaczona do wydajności, a nie dziedziczenia. Dlatego klasa List nie zawiera żadnych wirtualnych składowych. Należy zamiast tego udostępnić kolekcje generyczne zaprojektowane z myślą o dziedziczeniu. |
| CA1003: Użyj wystąpień ogólnego programu obsługi zdarzeń | Typ zawiera delegata, który zwraca wartość void, a jego sygnatura zawiera dwa parametry (z których pierwszy jest obiektem, a drugi typem, który można przypisać do klasy EventArgs), a zestaw zawierający jest przeznaczony dla platformy Microsoft .NET Framework 2.0. |
| CA1005: Unikaj nadużywania parametrów w typach ogólnych | Im więcej parametrów typu zawiera typ ogólny, tym trudniej poznać i zapamiętać, co reprezentuje każdy z nich. Zwykle jest to oczywiste w przypadku jednego parametru typu, jak w List<T>, oraz w niektórych przypadkach z dwoma parametrami typu, jak w Dictionary<TKey, TValue>. Jeśli jednak istnieją więcej niż dwa parametry typu, poziom trudności staje się zbyt wysoki dla większości użytkowników. |
| CA1008: Wyliczenia powinny zawierać wartość zero | Wartość domyślna niezainicjowanego typu wyliczeniowego, podobnie jak inne typy wartości, wynosi zero. Wyliczanie przypisane bez flag powinno definiować element członkowski przy użyciu wartości zero, tak że wartość domyślna jest prawidłową wartością wyliczenia. Jeśli wyliczenie, w którym zastosowano atrybut FlagsAttribute, definiuje element członkowski o wartości zero, powinno być nazwane „Brak”, aby wskazać, że żadne wartości nie zostały ustawione w wyliczeniu. |
| CA1010: Kolekcje powinny implementować interfejs ogólny | Aby poszerzyć użyteczność kolekcji, zaimplementuj jeden z interfejsów kolekcji generycznej. Następnie kolekcja może zostać użyta do zapełnienia generycznych typów kolekcji. |
| CA1012: Typy abstrakcyjne nie powinny mieć publicznych konstruktorów | Konstruktory dla typów abstrakcyjnych mogą być wywoływane tylko przez typy pochodne. Ponieważ publiczne konstruktory tworzą instancje typu, a nie można tworzyć instancji typu abstrakcyjnego, typ abstrakcyjny, który ma publiczny konstruktor, jest błędnie zaprojektowany. |
| CA1014: Oznacz zestawy atrybutem CLSCompliant | The Common Language Specification (CLS) definiuje ograniczenia nazw, typów danych i reguł, z którymi muszą być zgodne zestawy, jeśli zostaną użyte w językach programowania. Dobre praktyki projektowe wymagają, aby wszystkie asembalcje jawnie deklarowały zgodność z CLS za pomocą CLSCompliantAttribute . Jeśli ten atrybut nie jest obecny w zestawie, oznacza to, że zestaw jest niezgodny. |
| CA1016: Oznacz zestawy atrybutem AssemblyVersion | Platforma .NET używa numeru wersji, aby jednoznacznie zidentyfikować zestaw i powiązać z typami w silnie nazwanych zestawach. Numer wersji jest używany razem z zasadami wersji i wydawcy. Domyślnie aplikacje są uruchamiane wyłącznie przy użyciu wersji asemblacji, z którą zostały skompilowane. |
| CA1017: Oznacz zestawy atrybutem ComVisibleAttribute | ComVisibleAttribute określa, w jaki sposób klienci COM otrzymują dostęp do kodu zarządzanego. Zasada dobrego projektowania nakazuje, aby zestawy jawnie wskazywały widoczność COM. Ustawienie widoczności COM można określić dla całego złożenia, a następnie nadpisać dla poszczególnych typów i ich składowych. Jeśli ten atrybut jest nieobecny, zawartość zestawu jest widoczna dla klientów COM. |
| CA1018: Oznacz atrybuty atrybutem AttributeUsage | Podczas definiowania atrybutu niestandardowego należy go oznaczyć przy użyciu elementu AttributeUsageAttribute, aby wskazać, w którym miejscu kodu źródłowego ma być on zastosowany. Znaczenie i zamierzone użycie atrybutu określi jego prawidłowe lokalizacje w kodzie. |
| CA1019: Zdefiniuj metody dostępu dla argumentów atrybutu | Atrybuty mogą definiować obowiązkowe argumenty, które trzeba określić, aby móc zastosować atrybut do obiektu docelowego. Znane są również jako argumenty pozycyjne, ponieważ są one dostarczane do konstruktorów atrybutu jako parametry pozycyjne. Dla każdego obowiązkowego argumentu atrybut powinien również dostarczyć odpowiadającą właściwość tylko do odczytu, dzięki której można pobrać wartość argumentu w czasie wykonywania. Atrybuty mogą też definiować argumenty opcjonalne, które są znane również jako argumenty nazwane. Argumenty te są dostarczane do konstruktorów atrybutu poprzez nazwę i powinny mieć odpowiadającą właściwość umożliwiającą odczyt i zapis. |
| CA1021: Unikaj parametrów out | Przekazywanie typów przez odwołanie (używając out lub ref) wymaga doświadczenia w zakresie wskaźników, rozumienia różnicy między typami wartości i typami odwołania oraz umiejętności obsługi metod z wieloma wartościami zwracanymi. Ponadto różnica między parametrami out i ref nie jest powszechnie zrozumiała. |
| CA1024: Używaj właściwości wszędzie tam, gdzie jest to odpowiednie | Metody publiczne lub chronione mają nazwę zaczynającą się od „Get”, nie posiadają parametrów i zwracają wartość, która nie jest tablicą. Ta metoda może być dobrym kandydatem do przekształcenia we właściwość. |
| CA1027: Oznacz typy enum atrybutem FlagsAttribute | Wyliczenie to typ wartości, który definiuje zestaw powiązanych, nazwanych stałych. Zastosuj atrybut FlagsAttribute do wyliczenia, gdy jego nazwane stałe można sensownie łączyć. |
| CA1028: Magazyn typu wyliczeniowego powinien być typu Int32 | Wyliczenie to typ wartości, który definiuje zestaw powiązanych, nazwanych stałych. Domyślnie typ danych System.Int32 jest używany do przechowywania wartości stałej. Mimo że można zmienić ten typ podstawowy, nie jest to wymagane ani zalecane dla większości scenariuszy. |
| CA1030: Używaj zdarzeń tam, gdzie jest to właściwe | Ta reguła wykrywa metody, których nazwy zwykle byłyby używane w przypadku zdarzeń. Jeśli metoda jest wywoływana w odpowiedzi na jasno określoną zmianę stanu, powinna ona zostać wywołana przez program obsługi zdarzeń. Obiekty, które wywołują tę metodę, powinny wywoływać zdarzenia, a nie bezpośrednio metodę. |
| CA1031: Nie przechwytuj ogólnych typów wyjątków | Ogólne wyjątki nie powinny być przechwytywane. Przechwyć bardziej precyzyjny wyjątek lub ponownie zgłoś ogólny wyjątek jako ostatnią instrukcję w bloku catch. |
| CA1032: Zaimplementuj standardowe konstruktory wyjątku | Niepowodzenie podczas dostarczenia pełnego zestawu konstruktorów może utrudnić poprawną obsługę wyjątków. |
| CA1033: Typy podrzędne powinny mieć możliwość wywoływania metod interfejsu | Niezapieczętowany typ widoczny na zewnątrz zapewnia jawną implementację metody interfejsu publicznego i nie dostarcza alternatywnej metody widocznej z zewnątrz o tej samej nazwie. |
| CA1034: Typy zagnieżdżone nie powinny być widoczne | Typ zagnieżdżony to typ, który jest zadeklarowany wewnątrz zakresu innego typu. Typy zagnieżdżone są przydatne do hermetyzowania prywatnych szczegółów implementacji typu zewnętrznego. Używane w tym celu typy zagnieżdżone nie powinny być widoczne na zewnątrz. |
| CA1036: Przesłoń metody dla typów porównywalnych | Typ publiczny lub chroniony implementuje interfejs System.IComparable. Nie zastępuje on metody Object.Equals ani nie przeciąża specyficznego dla języka operatora równości, nierówności, mniejsze lub większe niż. |
| CA1040: Unikaj pustych interfejsów | Interfejsy definiują składowe, które określają kontrakt zachowania lub użycia. Funkcjonalność opisana przez interfejs może zostać przyjęta przez dowolny typ, niezależnie od tego, gdzie ten typ się pojawia w hierarchii dziedziczenia. Typ implementuje interfejs, dostarczając implementacje jego składowych. Pusty interfejs nie definiuje żadnych elementów członkowskich; dlatego też nie definiuje kontraktu, który można zaimplementować. |
| CA1041: Określ komunikat ObsoleteAttribute | Typ lub element członkowski jest oznaczony za pomocą atrybutu System.ObsoleteAttribute, który nie ma określonej właściwości ObsoleteAttribute.Message. Podczas kompilowania typu lub składowej oznaczonych atrybutem ObsoleteAttribute jest wyświetlana właściwość Message tego atrybutu. Zapewnia użytkownikowi informacje o przestarzałym typie lub składowej. |
| CA1043: Używaj argumentu integral lub string dla indeksatorów | Indeksatory (właściwości indeksowane) powinny używać dla indeksu typów całkowitych lub ciągu. Typy te są zwykle używane do indeksowania struktur danych i zwiększają one użyteczność biblioteki. Użycie typu Object powinno być ograniczone do przypadków, w których w czasie projektowania nie można określić konkretnego typu całkowitoliczbowego lub typu ciągu. |
| CA1044: Właściwości nie powinny być tylko do zapisu | Chociaż posiadanie właściwości tylko do odczytu jest dopuszczalne i często konieczne, wytyczne projektowania zabraniają używania właściwości tylko do zapisu. Dzieje się tak dlatego, że umożliwienie użytkownikowi ustawienia wartości, a następnie uniemożliwianie przeglądania tej wartości nie zapewnia żadnych zabezpieczeń. Poza tym bez dostępu do odczytu nie można przeglądać stanu obiektów udostępnionych, co ogranicza ich przydatność. |
| CA1045: Nie przekazuj typów przez referencję | Przekazywanie typów przez odwołanie (używając out lub ref) wymaga doświadczenia w zakresie wskaźników, rozumienia różnicy między typami wartości i typami odwołania oraz umiejętności obsługi metod z wieloma wartościami zwracanymi. Architekci bibliotek, którzy projektują dla odbiorców ogólnych, nie powinni oczekiwać, że użytkownicy staną się biegłi w pracy z parametrami out lub ref . |
| CA1046: Nie przeciążaj operatora == na typach referencyjnych | Dla typów referencyjnych domyślna implementacja operatora równości jest prawie zawsze poprawna. Domyślnie dwa odwołania są równe tylko wtedy, gdy wskazują ten sam obiekt. |
| CA1047: Nie deklaruj chronionych składników w typach hermetyzowanych | Typy deklarują chronione składowe, aby typy dziedziczące mogły uzyskiwać do nich dostęp lub je przesłaniać. Z definicji po typach zamkniętych nie można dziedziczyć, co oznacza, że nie można wywoływać metod chronionych w typach zamkniętych. |
| CA1050: Deklaruj typy w przestrzeniach nazw | Typy są zadeklarowane w przestrzeniach nazw, aby zapobiec kolizjom nazw oraz jako sposób organizowania typów powiązanych w hierarchii obiektów. |
| CA1051: Nie deklaruj dostępnych pól instancji | Podstawowym zastosowaniem pola powinno być użycie go jako szczegółu implementacyjnego. Pola powinny być prywatne lub wewnętrzne i powinny być udostępniane za pomocą właściwości. |
| CA1052: Statyczne typy przechowujące powinny być zapieczętowane | Typ publiczny lub chroniony zawiera wyłącznie składowe statyczne i nie został zadeklarowany przy użyciu modyfikatora sealed (C# Reference) (NotInheritable). Typ, który nie jest przeznaczony do dziedziczenia, należy oznaczyć modyfikatorem sealed, aby zapobiec używaniu go jako typu bazowego. |
| CA1053: Statyczne typy przechowujące nie powinny mieć konstruktorów | Typ publiczny lub zagnieżdżony typ publiczny zawiera wyłącznie składowe statyczne i ma domyślny konstruktor publiczny lub chroniony. Konstruktor jest zbędny, ponieważ uzyskanie dostępu do składowych statycznych nie wymaga instancji tego typu. Przeciążenie typu ciąg powinno wywoływać, dla bezpieczeństwa, przeciążenie jednolitego identyfikatora zasobów (URI) przy użyciu argumentu typu ciąg. |
| CA1054: Parametry identyfikatora URI nie powinny być ciągami | Jeśli metoda przyjmuje reprezentację URI w postaci ciągu znaków, należy udostępnić odpowiadające jej przeciążenie przyjmujące instancję klasy URI, która zapewnia te funkcje w sposób bezpieczny i niezawodny. |
| CA1055: Wartości zwracane identyfikatora URI nie powinny być ciągami | Reguła ta zakłada, że metoda zwraca identyfikator URI. Reprezentacja URI w postaci ciągu znaków jest podatna na błędy parsowania i kodowania oraz może prowadzić do luk w zabezpieczeniach. Klasa System.Uri udostępnia te usługi w bezpieczny sposób. |
| CA1056: Właściwości identyfikatora URI nie powinny być ciągami | Reguła ta zakłada, że właściwość reprezentuje identyfikator URI. Ciąg znaków reprezentujący identyfikator URI jest podatny na błędy podczas analizowania i kodowania oraz może prowadzić do luk w zabezpieczeniach. Klasa System.Uri udostępnia te usługi w bezpieczny sposób. |
| CA1058: Typy nie powinny rozszerzać pewnych typów podstawowych | Typ widoczny na zewnątrz rozszerza niektóre typy podstawowe. Użyj jednej z alternatyw. |
| CA1060: Przenieś wywołania P/Invoke do klasy NativeMethods | Metody wywołania platformy, takie jak metody oznaczone atrybutem System.Runtime.InteropServices.DllImportAttribute lub metody zdefiniowane za pomocą słowa kluczowego Declare w języku Visual Basic, uzyskują dostęp do kodu niezarządzanego. Metody te powinny być klasami NativeMethods, SafeNativeMethods lub UnsafeNativeMethods. |
| CA1061: Nie ukrywaj metod klasy podstawowej | Metoda w typie podstawowym jest ukryta przez metodę o identycznej nazwie typu pochodnego, gdy sygnatura parametru metody pochodnej różni się tylko typami, które są słabiej dziedziczone niż odpowiadające typy w sygnaturze parametru metody podstawowej. |
| CA1062 Zweryfikuj argumenty metod publicznych | Wszystkie argumenty referencyjne przekazywane do metod dostępnych z zewnątrz należy sprawdzać pod kątem wartości null. |
| CA1063: Zaimplementuj poprawnie interfejs IDisposable | Wszystkie typy IDisposable powinny poprawnie implementować wzorzec Dispose. |
| CA1064: Wyjątki powinny być publiczne | Wyjątek wewnętrzny jest widoczny tylko wewnątrz własnego zakresu wewnętrznego. W przypadku wystąpienia wyjątku poza zakresem wewnętrznym tylko wyjątek podstawowy może zostać użyty do jego przechwycenia. Jeśli wyjątek wewnętrzny jest dziedziczony z Exception, SystemExceptionlub ApplicationException, kod zewnętrzny nie będzie miał wystarczających informacji, aby wiedzieć, co zrobić z wyjątkiem. |
| CA1065: Nie zgłaszaj wyjątków w nieoczekiwanych lokalizacjach | Metoda, od której nie oczekiwano zgłaszania wyjątków, zgłasza wyjątek. |
| CA1066: Implementowanie funkcji IEquatable podczas zastępowania wartości Equals | Typ wartości zastępuje metodę, ale nie implementuje EqualsIEquatable<T>metody . |
| CA1067: Przesłoń metodę Equals podczas implementowania interfejsu IEquatable | Typ implementuje metodę IEquatable<T>, ale nie zastępuje Equals metody. |
| CA1068: Parametry CancellationToken muszą znajdować się na końcu | Metoda ma parametr CancellationToken, który nie jest ostatnim parametrem. |
| CA1069: Wyliczenia nie powinny mieć zduplikowanych wartości | Wyliczenie ma wiele składników, którym jawnie przypisano tę samą wartość stałą. |
| CA1070: Nie deklaruj pól zdarzeń jako wirtualne | Zdarzenie typu pola zostało zadeklarowane jako wirtualne. |
| CA1200: Unikaj używania tagów cref z prefiksem | Atrybut cref w tagu dokumentacji XML oznacza "odwołanie do kodu". Określa, że tekst wewnętrzny tagu jest elementem kodu, takim jak typ, metoda lub właściwość. Unikaj używania cref tagów z prefiksami, ponieważ uniemożliwia kompilatorowi weryfikowanie odwołań. Uniemożliwia to również zintegrowanemu środowisku programistycznemu (IDE) programu Visual Studio znajdowanie i aktualizowanie tych odwołań do symboli podczas refaktoryzacji. |
| CA1303: Nie przekazuj literałów jako parametrów podlegających lokalizacji | Zewnętrznie widoczna metoda przekazuje literał ciągu jako parametr do konstruktora lub metody platformy .NET, a ten ciąg powinien być lokalizowalny. |
| CA1304: Określ CultureInfo | Metoda lub konstruktor wywołuje składnik mający przeciążenie przyjmujące parametr System.Globalization.CultureInfo, ale sama metoda lub konstruktor nie wywołuje przeciążenia przyjmującego parametr CultureInfo. Kiedy obiekt CultureInfo lub System.IFormatProvider nie jest podany, domyślna wartość, która jest dostarczana przez członka przeciążonego, może nie wywoływać oczekiwanego efektu we wszystkich ustawieniach regionalnych. |
| CA1305: Określ IFormatProvider | Metoda lub konstruktor wywołuje co najmniej jeden składowy, który ma przeciążenia przyjmujące parametr System.IFormatProvider, ale sama metoda lub sam konstruktor nie wywołuje przeciążenia przyjmującego parametr IFormatProvider. Kiedy obiekt System.Globalization.CultureInfo lub IFormatProvider nie jest podany, domyślna wartość przekazywana przez członka przeciążonego może nie wywoływać oczekiwanego efektu we wszystkich ustawieniach regionalnych. |
| CA1307: Określ parametr StringComparison, aby uzyskać jasność | Operacja porównania łańcuchów używa przeciążonej wersji metody, która nie określa parametru StringComparison. |
| CA1308: Normalizuj ciągi znaków do postaci wielkich liter | Ciągi powinny być znormalizowane do użycia wielkich liter. Niewielka grupa znaków nie może zostać przekształcona z powrotem do pierwotnej postaci po zamianie na małe litery. |
| CA1309: Używaj wyliczenia StringComparison stosującego reguły sortowania oparte na wartości | Operacja porównania ciągu, która jest nielingwistyczna, nie ustawia parametru StringComparison na Ordinal lub OrdinalIgnoreCase. Poprzez jawne ustawienie parametru na StringComparison.Ordinal lub StringComparison.OrdinalIgnoreCase kod często zaczyna działać szybciej, staje się bardziej poprawny i niezawodny. |
| CA1310: Określ parametr StringComparison pod kątem poprawności | Operacja porównywania ciągów korzysta z przeciążonej metody, która nie ustawia parametru StringComparison i domyślnie używa porównywania ciągów zależnego od ustawień kulturowych. |
| CA1311: Określ kulturę lub użyj niezmiennej wersji | Określ kulturę lub użyj kultury niezmiennej, aby uniknąć niejawnej zależności od bieżącej kultury podczas wywoływania ToUpper lub ToLower. |
| CA1401: Metody P/Invoke nie powinny być widoczne | Publiczna lub chroniona metoda w typie publicznym ma atrybut System.Runtime.InteropServices.DllImportAttribute (implementowany również przez słowo kluczowe Declare w Visual Basic). Takie metody nie powinny być udostępniane. |
| CA1416: Weryfikowanie zgodności platformy | Korzystanie z interfejsów API zależnych od platformy w składniku sprawia, że kod nie działa już na wszystkich platformach. |
CA1417: Nie używaj OutAttribute w deklaracjach P/Invoke dla parametrów typu string |
Parametry ciągu przekazywane przez wartość z parametrem OutAttribute mogą zdestabilizować środowisko uruchomieniowe, jeśli ciąg jest ciągiem internowany. |
| CA1418: Użyj prawidłowego ciągu platformy | Analizator zgodności platformy wymaga prawidłowej nazwy i wersji platformy. |
CA1419: Podaj konstruktor bez parametrów, który ma taką samą widoczność jak typ zawierający, dla konkretnych typów pochodzących z System.Runtime.InteropServices.SafeHandle |
Zapewnienie bezparametrowego konstruktora o widoczności takiej samej jak typ otaczający dla typu pochodzącego z System.Runtime.InteropServices.SafeHandle umożliwia lepszą wydajność i obsługę rozwiązań interoperacyjności generowanych przez kod źródłowy. |
| CA1420: Właściwość, typ lub atrybut wymagają marshalingu środowiska uruchomieniowego | Korzystanie z funkcji wymagających marshalingu środowiska uruchomieniowego, gdy marshalling środowiska uruchomieniowego jest wyłączone, spowoduje wyjątki środowiska uruchomieniowego. |
| CA1421: Metoda używa marshalingu środowiska uruchomieniowego podczas stosowania elementu DisableRuntimeMarshallingAttribute | Metoda wykorzystuje marshaling środowiska uruchomieniowego, a marshaling środowiska uruchomieniowego jest jawnie wyłączony. |
| CA1422: Weryfikowanie zgodności platformy | Nie zaleca się wywoływania przestarzałego interfejsu API w danej wersji systemu operacyjnego z miejsca wywołania osiągalnego z tej wersji systemu operacyjnego. |
| CA1501: Unikaj nadmiernego dziedziczenia | Typ ma więcej niż cztery poziomy w hierarchii dziedziczenia. Głęboko zagnieżdżone hierarchie typów mogą być trudne do śledzenia, zrozumienia i utrzymania. |
| CA1502: Unikaj nadmiernej złożoności | Ta reguła mierzy liczbę liniowo niezależnych ścieżek za pośrednictwem metody, która jest określona przez liczbę i złożoność rozgałęzień warunkowych. |
| CA1505: Unikaj kodu trudnego w utrzymaniu | Typ lub metoda ma niską wartość indeksu konserwacji. Niski indeks konserwacji wskazuje, że typ lub metoda są prawdopodobnie trudne do utrzymania i są dobrymi kandydatami do przeprojektowania. |
| CA1506: Unikaj nadmiernego sprzężenia klas | Ta reguła mierzy sprzęgnięcie klasy na podstawie liczby unikalnych odwołań do typów zawartych w typie lub metodzie. |
| CA1507: Użyj nameof zamiast string | Literał ciągu znaków jest używany jako argument tam, gdzie można użyć wyrażenia nameof. |
| CA1508: Unikaj martwego kodu warunkowego | Metoda ma kod warunkowy, który zawsze ocenia wartość true lub false w czasie wykonywania. Prowadzi to do martwego kodu w gałęzi false warunku. |
| CA1509: Nieprawidłowy wpis w pliku konfiguracji metryk kodu | Reguły metryk kodu, takie jak CA1501, CA1502, CA1505 i CA1506, dostarczyły plik konfiguracji o nazwie CodeMetricsConfig.txt, który zawiera nieprawidłowy wpis. |
| CA1510: Użyj pomocnika throw ArgumentNullException | Metody pomocnicze zgłaszające wyjątki są prostsze i bardziej wydajne niż bloki if, które tworzą nową instancję wyjątku. |
| CA1511: Użyj pomocnika throw ArgumentException | Metody pomocnicze zgłaszające wyjątki są prostsze i bardziej wydajne niż bloki if, które tworzą nowe wystąpienie wyjątku. |
| CA1512: Użyj pomocnika throw ArgumentOutOfRangeException | Metody pomocnicze throw są prostsze i bardziej wydajne niż bloki if, które tworzą nowe wystąpienie wyjątku. |
| CA1513: Użyj metody pomocniczej throw ObjectDisposedException | Metody pomocnicze do zgłaszania wyjątków są prostsze i wydajniejsze niż bloki if, które tworzą nowe wystąpienie wyjątku. |
| CA1514: Unikaj argumentu nadmiarowej długości | Zbędny argument długości jest stosowany podczas wycinania do końca ciągu lub bufora. Długość obliczeniowa może być podatna na błędy i jest również niepotrzebna. |
| CA1515: Rozważ zmianę typów publicznych na wewnętrzne | W przeciwieństwie do biblioteki klas interfejs API aplikacji nie jest zwykle publicznie przywołyny, więc typy mogą być oznaczone wewnętrznie. |
| CA1516: Używanie funkcji wewnętrznych międzyplatformowych | Ta reguła wykrywa użycie funkcji wewnętrznych specyficznych dla platformy, które można zastąpić równoważnymi elementami wewnętrznymi międzyplatformowymi. |
| CA1700: Nie nazywaj wartości enum „Reserved” | Ta reguła zakłada, że element członkowski wyliczenia o nazwie, która zawiera „reserved”, nie jest obecnie używany, ale jest symbolem zastępczym do zmiany nazwy lub usunięcia w przyszłej wersji. Zmiana nazwy lub usuwanie członka jest zmianą przerywającą. |
| CA1707: Identyfikatory nie powinny zawierać podkreśleń | Przez konwencję identyfikatory nazw nie zawierają znaku podkreślenia (_). Ta reguła sprawdza przestrzenie nazw, typy, elementy członkowskie i parametry. |
| CA1708: Identyfikatory powinny różnić się nie tylko wielkością liter | Identyfikatory przestrzeni nazw, typów, składowych i parametrów nie mogą różnić się wyłącznie wielkością liter, ponieważ języki przeznaczone dla wspólnego środowiska uruchomieniowego nie muszą rozróżniać wielkości liter. |
| CA1710: Identyfikatory powinny mieć poprawny sufiks | Według konwencji nazwy typów, które rozszerzają pewne typy podstawowe lub implementują określone interfejsy lub typy pochodzące z tych typów, mają przyrostek skojarzony z typem bazowym lub interfejsem. |
| CA1711: Identyfikatory nie powinny mieć niepoprawnego sufiksu | Według konwencji nazwy typów, które rozszerzają pewne typy podstawowe lub implementują dane interfejsy lub typy pochodzące z tych typów, powinny kończyć się określonym zarezerwowanym sufiksem. Inne nazwy typów nie powinny używać tych zarezerwowanych sufiksów. |
| CA1712: Nie poprzedzaj wartości wyliczenia nazwą typu | Nazwy składowych wyliczenia nie są poprzedzane nazwą typu, ponieważ oczekuje się, że narzędzia programistyczne będą udostępniać informacje o typie. |
| CA1713 Zdarzenia nie powinny mieć prefiksu Before ani After | Nazwa zdarzenia rozpoczyna się od „Before” lub „After”. Aby nazwać powiązane zdarzenia, które są wyzwalane w określonej kolejności, użyj czasu teraźniejszego lub przeszłego, aby wskazać ich względne miejsce w sekwencji działań. |
| CA1714: Wyliczenia flag powinny mieć nazwy w liczbie mnogiej | Publiczne wyliczenie ma atrybut System.FlagsAttribute, a jego nazwa nie kończy się na „s”. Typy oznaczone przy użyciu FlagsAttribute mają nazwy w liczbie mnogiej, ponieważ atrybut wskazuje, że można określić więcej niż jedną wartość. |
| CA1715: Identyfikatory powinny mieć poprawny prefiks | Nazwa interfejsu, który jest widoczny na zewnątrz, nie zaczyna się od wielkiej litery „I”. Nazwa parametru typu ogólnego na widocznych zewnętrznie typie lub metodzie nie zaczyna się od wielkiej litery „T”. |
| CA1716: Identyfikatory nie powinny odpowiadać słowom kluczowym | Przestrzeń nazw lub nazwa typu odpowiada zastrzeżonym słowom kluczowym w języku programowania. Identyfikatory przestrzeni nazw i typów nie powinny pokrywać się ze słowami kluczowymi zdefiniowanymi przez języki, których celem jest wspólne środowisko uruchomieniowe. |
| CA1717: Tylko wyliczenia FlagsAttribute powinny mieć nazwy w liczbie mnogiej | Zgodnie z konwencjami nazewnictwa, nazwa w liczbie mnogiej dla wyliczenia wskazuje, że w tym samym czasie można określić więcej niż jedną wartość wyliczenia. |
| CA1720: Identyfikatory nie powinny zawierać nazw typów | Nazwa parametru w widocznym na zewnątrz elemencie członkowskim zawiera nazwę typu danych lub nazwa widocznego na zewnątrz elementu członkowskiego zawiera specyficzną dla języka nazwę typu danych. |
| CA1721: Nazwy właściwości nie powinny odpowiadać metodom Get | Nazwa publicznego lub chronionego elementu członkowskiego zaczyna się od „Get” i odpowiada nazwie właściwości publicznej lub chronionej. Metody „Get” i właściwości powinny mieć nazwy, które jasno wskazują ich funkcję. |
| CA1724: Nazwy typów nie powinny pasować do przestrzeni nazw | Nazwy typów nie powinny być zgodne z nazwami przestrzeni nazw platformy .NET. Naruszenie tej zasady może zmniejszyć użyteczność biblioteki. |
| CA1725: Nazwy parametrów powinny pasować do deklaracji podstawowej | Spójne nazewnictwo parametrów w hierarchii przesłonięć zwiększa użyteczność przesłonięć metod. Jeśli nazwa parametru w metodzie pochodnej różni się od nazwy podstawowej deklaracji, może nie być jasne, czy metoda jest zastąpieniem metody podstawowej, czy też nowym przeciążeniem metody. |
| CA1727: Użyj PascalCase dla nazwanych symboli zastępczych | Użyj pascalCase dla nazwanych symboli zastępczych w szablonie komunikatu rejestrowania. |
| CA1801: Przejrzyj nieużywane parametry | Podpis metody zawiera parametr, który nie jest używany w jej treści. |
| CA1802: Używaj literałów wszędzie tam, gdzie jest to odpowiednie | Pole jest zadeklarowane jako statyczne i tylko do odczytu (Shared i ReadOnly w języku Visual Basic) oraz jest inicjowane wartością, którą można obliczyć w czasie kompilacji. Ponieważ wartość przypisana do pola docelowego jest obliczana w czasie kompilacji, zmień deklarację na const (Const in Visual Basic), aby wartość była obliczana w czasie kompilacji zamiast w czasie wykonywania. |
| CA1805: Nie inicjuj niepotrzebnie | Środowisko uruchomieniowe platformy .NET inicjuje wszystkie pola typów referencyjnych do ich wartości domyślnych przed wykonaniem konstruktora. W większości przypadków jawne inicjowanie pola do jego wartości domyślnej jest nadmiarowe, co zwiększa koszty konserwacji i może obniżyć wydajność (na przykład przy zwiększonym rozmiarze zestawu). |
| CA1806: Nie ignoruj wyników metod | Nowy obiekt jest tworzony, ale nigdy nie jest używany; albo metoda, która tworzy i zwraca nowy ciąg, jest wywoływana, ale nowy ciąg nigdy nie jest używany; albo metody COM lub P/Invoke zwracają HRESULT lub kod błędu, który nigdy nie jest używany. |
| CA1810: Inicjuj statyczne pola typu referencyjnego w deklaracji | Gdy typ deklaruje jawny konstruktor statyczny, kompilator JIT (just-in-time) dodaje sprawdzenie do każdej metody statycznej i każdego konstruktora instancji tego typu, aby upewnić się, że konstruktor statyczny został wcześniej wywołany. Sprawdzenia konstruktora statycznego mogą obniżyć wydajność. |
| CA1812: Unikaj nieinstancjonowanych klas wewnętrznych | Instancja typu zdefiniowanego na poziomie zestawu nie jest tworzona przez kod zawarty w zestawie. |
| CA1813: Unikaj niezapieczętowanych atrybutów | Platforma .NET udostępnia metody pobierania atrybutów niestandardowych. Domyślnie te metody wyszukują hierarchie dziedziczenia atrybutu. Zapieczętowanie atrybutu eliminuje konieczność przeszukiwania hierarchii dziedziczenia i może zwiększyć wydajność. |
| CA1814: Wybieraj tablice nieregularne zamiast tablic wielowymiarowych | Tablica postrzępiona to tablica, której elementami są tablice. Tablice, które tworzą elementy, mogą mieć różne rozmiary, co zapewnia większą oszczędność miejsca w przypadku niektórych zestawów danych. |
| CA1815: Przesłaniaj metodę Equals i operator == dla typów wartości | Dla typów wartości odziedziczona implementacja metody Equals używa mechanizmu refleksji i porównuje zawartość wszystkich pól. Refleksja jest kosztowna obliczeniowo, a porównywanie wszystkich pól pod kątem równości może być niepotrzebne. Jeśli można się spodziewać, że użytkownicy będą porównywać lub sortować wystąpienia lub używać wystąpień jako kluczy tabel haszowanych, typ wartości powinien implementować Equals. |
| CA1816: Wywołaj poprawnie metodę GC.SuppressFinalize | Metoda, która jest implementacją metody Dispose, nie wywołuje metody GC.SuppressFinalize; lub metoda, która nie jest implementacją metody Dispose, wywołuje metodę GC.SuppressFinalize; lub metoda wywołuje metodę GC.SuppressFinalize i przekazuje argument inny niż this (Me w Visual Basic). |
| CA1819: Właściwości nie powinny zwracać tablic | Tablice zwracane przez właściwości nie są chronione przed zapisem, nawet jeśli właściwość jest tylko do odczytu. Aby zachować tablicę odporną na manipulacje, właściwość musi zwracać kopię tablicy. Zwykle użytkownicy nie rozumieją, jak niekorzystny wpływ na wydajność ma wywołanie takiej właściwości. |
| CA1820: Testuj obecność pustych ciągów przy użyciu długości ciągu | Porównywanie ciągów za pomocą właściwości String.Length lub metody String.IsNullOrEmpty jest znacznie szybsze niż użycie operatora Equals. |
| CA1821: Usuń puste finalizatory | Jeśli to możliwe, należy unikać finalizatorów ze względu na dodatkowy narzut wydajnościowy związany ze śledzeniem czasu życia obiektu. Pusty finalizator powoduje dodatkowe obciążenie i nie zapewnia żadnych korzyści. |
| CA1822: Oznaczaj składowe jako statyczne | Składowe, które nie uzyskują dostępu do danych wystąpienia ani nie wywołują metod wystąpienia, mogą być oznaczone jako statyczne (Shared w Visual Basic). Po oznaczeniu metod jako statyczne kompilator wygeneruje niewirtualne miejsca wywołania dla tych składowych. To może dać wymierny zysk wydajnościowy dla kodu wrażliwego na wydajność. |
| CA1823: Unikaj nieużywanych pól prywatnych | Wykryto pola prywatne, które nie wydają się być używane w asemblii. |
| CA1824: Oznaczaj zestawy za pomocą atrybutu NeutralResourcesLanguageAttribute | Atrybut NeutralResourcesLanguage informuje menedżera zasobów o języku, który został użyty do wyświetlania zasobów neutralnej kultury dla zestawu. Poprawia to wydajność wyszukiwania dla pierwszego ładowanego zasobu i może zmniejszyć zużycie pamięci. |
| CA1825: Unikaj alokacji tablic o zerowej długości | Inicjowanie tablicy o zerowej długości prowadzi do niepotrzebnej alokacji pamięci. Zamiast tego użyj statycznie alokowanej pustej tablicy, wywołując Array.Empty. Alokacja pamięci jest współdzielona we wszystkich wywołaniach tej metody. |
| CA1826: Użyj właściwości zamiast metody Linq Enumerable | Enumerable Metoda LINQ została użyta dla typu, który obsługuje równoważną, bardziej wydajną właściwość. |
| CA1827: Nie używaj Count/LongCount, gdy można użyć Any | Count metoda lub LongCount została użyta, gdzie Any metoda byłaby bardziej wydajna. |
| CA1828: Nie używaj funkcji CountAsync/LongCountAsync, gdy można użyć narzędzia AnyAsync | CountAsync metoda lub LongCountAsync została użyta, gdzie AnyAsync metoda byłaby bardziej wydajna. |
| CA1829: Użyj właściwości Length/Count zamiast metody Enumerable.Count |
Count Metoda LINQ została użyta dla typu, który obsługuje równoważne, bardziej wydajne Length lub Count właściwości. |
| CA1830: Preferuj silnie typizowane przeciążenia metody Append i Insert w programie StringBuilder | Append i Insert zapewniają przeciążenia dla wielu typów poza String. Jeśli to możliwe, preferuj przeciążenia silnie typizowane zamiast używania metody ToString() i przeciążenia przyjmującego parametr typu string. |
| CA1831: Użyj narzędzia AsSpan zamiast indeksatorów opartych na zakresie dla ciągu, jeśli jest to konieczne | W przypadku używania indeksatora zakresu w ciągu i niejawnego przypisania wartości do typu char ReadOnlySpan<metoda > zostanie użyta zamiast Substring, co spowoduje utworzenie kopii żądanej częściSlice ciągu. |
| CA1832: Użyj klasy AsSpan lub AsMemory zamiast indeksatorów opartych na zakresie, aby uzyskać fragment ReadOnlySpan lub ReadOnlyMemory tablicy | Podczas używania indeksatora zakresowego na tablicy i niejawnego przypisywania wartości do typu ReadOnlySpan<T> lub ReadOnlyMemory<T> zostanie użyta metoda GetSubArray zamiast Slice, co powoduje utworzenie kopii żądanego fragmentu tablicy. |
| CA1833: Użyj metod AsSpan lub AsMemory zamiast indeksatorów zakresowych w celu uzyskania obiektu Span lub Memory reprezentującego część tablicy | W przypadku użycia indeksatora zakresu na tablicy i niejawnego przypisania wartości do typu Span<T> lub Memory<T> zostanie użyta metoda GetSubArray zamiast Slice, co powoduje utworzenie kopii żądanego fragmentu tablicy. |
| CA1834: Użyj StringBuilder.Append(char) w przypadku ciągów składających się z jednego znaku |
StringBuilder
Append ma przeciążenie, które przyjmuje char jako argument. Należy preferować wywołanie przeciążenia char ze względu na wydajność. |
CA1835: Preferuj przeciążenia oparte na Memory dla ReadAsync i WriteAsync |
Stream
ReadAsync ma przeciążenie, które przyjmuje Memory<Byte> jako pierwszy argument, oraz przeciążenie WriteAsync, które przyjmuje ReadOnlyMemory<Byte> jako pierwszy argument. Preferuj wywoływanie przeciążeń opartych na pamięci, które są bardziej wydajne. |
CA1836: Preferuj użycie IsEmpty zamiast Count, jeśli jest dostępny |
Użyj właściwości IsEmpty, która jest wydajniejsza niż Count, Length, Count<TSource>(IEnumerable<TSource>) lub LongCount<TSource>(IEnumerable<TSource>), do określenia, czy obiekt zawiera jakiekolwiek elementy. |
CA1837: Użyj Environment.ProcessId zamiast Process.GetCurrentProcess().Id |
Environment.ProcessId jest prostsza i szybsza niż Process.GetCurrentProcess().Id. |
CA1838: Unikaj parametrów StringBuilder w deklaracjach P/Invoke |
Marshalling StringBuilder zawsze tworzy natywną kopię buforu, co skutkuje wielokrotnymi przydziałami pamięci dla jednej operacji marshallingu. |
| CA1839: Użyj Environment.ProcessPath zamiast Process.GetCurrentProcess().MainModule.FileName |
Environment.ProcessPath jest prostsza i szybsza niż Process.GetCurrentProcess().MainModule.FileName. |
| CA1840: Użyj Environment.CurrentManagedThreadId zamiast Thread.CurrentThread.ManagedThreadId |
Environment.CurrentManagedThreadId jest bardziej kompaktowy i wydajny niż Thread.CurrentThread.ManagedThreadId. |
| CA1841: Preferuj użycie metod Contains klasy Dictionary | Wywoływanie Contains kolekcji Keys lub Values może być często droższe niż wywoływanie ContainsKey lub ContainsValue w samym słowniku. |
CA1842: Nie używaj WhenAll z jednym zadaniem |
Użycie WhenAll z jednym zadaniem może spowodować utratę wydajności. Zamiast tego zaczekaj na zadanie lub zwróć je. |
CA1843: Nie używaj WaitAll z jednym zadaniem |
Użycie WaitAll z jednym zadaniem może spowodować utratę wydajności. Zamiast tego poczekaj na zadanie lub je zwróć. |
CA1844: Podaj zastąpienia oparte na pamięci metod asynchronicznych podczas podklasy Stream |
Aby zwiększyć wydajność, zastąp metody asynchroniczne oparte na pamięci podczas podklasowania Stream. Następnie zaimplementuj metody tablicowe w oparciu o metody operujące na pamięci. |
CA1845: Użyj opartego na zakresie string.Concat |
Bardziej wydajne jest użycie AsSpan i string.Concat zamiast Substring oraz operatora konkatenacji. |
CA1846: Preferuj użycie AsSpan zamiast Substring |
AsSpan jest wydajniejszy niż Substring.
Substring wykonuje kopiowanie ciągu znaków w czasie O(n), podczas gdy AsSpan nie robi tego i ma stały koszt.
AsSpan nie wykonuje również żadnych alokacji sterty. |
| CA1847: Użyj literału typu char do wyszukiwania pojedynczego znaku | Użyj String.Contains(char) zamiast String.Contains(string) podczas wyszukiwania pojedynczego znaku. |
| CA1848: Użyj delegatów LoggerMessage | Aby uzyskać lepszą wydajność, użyj LoggerMessage delegatów. |
| CA1849: Wywoływanie metod asynchronicznych w przypadku metody asynchronicznej | W metodzie, która jest już asynchroniczna, wywołania innych metod powinny dotyczyć ich wersji asynchronicznych, w których istnieją. |
CA1850: Preferuj użycie metody statycznej HashData zamiast ComputeHash |
Bardziej efektywne jest użycie metody statycznej HashData niż tworzenie wystąpienia HashAlgorithm i zarządzanie nim w celu wywołania ComputeHash. |
CA1851: Możliwe wielokrotne wyliczanie kolekcji IEnumerable |
Możliwe wielokrotne wyliczanie kolekcji IEnumerable. Rozważ użycie implementacji, która pozwala uniknąć wielu wyliczeń. |
| CA1852: Uczyń typy wewnętrzne hermetycznymi | Typ, który nie jest dostępny poza swoją asemblacją i nie ma w niej podtypów, nie jest hermetyzowany. |
CA1853: Niepotrzebne wywołanie metody Dictionary.ContainsKey(key) |
Nie ma potrzeby zabezpieczania Dictionary.Remove(key) przy użyciu Dictionary.ContainsKey(key).
Dictionary<TKey,TValue>.Remove(TKey) już sprawdza, czy klucz istnieje i nie zgłasza go, jeśli nie istnieje. |
CA1854: Preferuj metodę IDictionary.TryGetValue(TKey, out TValue) |
Preferuj TryGetValue zamiast dostępu do indeksatora słownika chronionego przez sprawdzenie ContainsKey.
ContainsKey i indeksator obydwaj wyszukują klucz, więc użycie TryGetValue unika dodatkowego wyszukiwania. |
| CA1855: Użyj opcji Span<T>. Clear() zamiast Span<T>. Fill() | Bardziej efektywne jest wywołanie metody Span<T>.Clear() niż metody Span<T>.Fill(T) w celu wypełnienia elementów spanu wartością domyślną. |
| CA1856: Nieprawidłowe użycie atrybutu ConstantExpected | Atrybut ConstantExpectedAttribute nie jest poprawnie stosowany w parametrze. |
| CA1857: Parametr oczekuje stałej w celu uzyskania optymalnej wydajności | Nieprawidłowy argument jest przekazywany do parametru, który jest oznaczony adnotacją .ConstantExpectedAttribute |
| CA1858: Użyj polecenia StartsWith zamiast indexOf | Bardziej wydajne jest wywołanie String.StartsWith niż wywołanie String.IndexOf w celu sprawdzenia, czy ciąg zaczyna się od danego prefiksu. |
| CA1859: Używaj typów konkretnych, jeśli to możliwe, aby zwiększyć wydajność | Kod używa typów interfejsów lub typów abstrakcyjnych, co prowadzi do niepotrzebnych wywołań interfejsu lub wywołań wirtualnych. |
CA1860: Unikaj używania Enumerable.Any() metody rozszerzenia |
Bardziej wydajne i czytelniejsze jest użycie Length, Count lub IsEmpty (jeśli to możliwe) niż wywołanie metody Enumerable.Any, aby sprawdzić, czy kolekcja zawiera jakiekolwiek elementy. |
| CA1861: Unikaj tablic stałych jako argumentów | Tablice stałe przekazywane jako argumenty nie są ponownie używane, co oznacza obciążenie związane z wydajnością. Rozważ wyodrębnienie ich do pól static readonly dla poprawy wydajności. |
CA1862: Użyj StringComparison przeciążeń metody do przeprowadzania porównań ciągów bez uwzględniania wielkości liter |
Gdy kod wywołuje ToLower() lub ToUpper(), aby wykonać porównanie ciągów znaków bez uwzględniania wielkości liter, wykonywana jest niepotrzebna alokacja. |
CA1863: Użyj CompositeFormat |
Aby zmniejszyć koszt formatowania, przechowuj w pamięci podręcznej i używaj wystąpienia CompositeFormat jako argumentu dla String.Format lub StringBuilder.AppendFormat. |
CA1864: Preferuj metodę IDictionary.TryAdd(TKey, TValue) |
Zarówno Dictionary<TKey,TValue>.ContainsKey(TKey), jak i Dictionary<TKey,TValue>.Add wykonują wyszukiwanie, co jest zbędne. Bardziej wydajne jest wywołanie Dictionary<TKey,TValue>.TryAdd, które zwraca wartość bool informującą, czy wartość została dodana, czy nie.
TryAdd nie zastępuje wartości klucza, jeśli klucz jest już obecny. |
| CA1865-CA1867: Użyj przeciążenia typu char | Przeciążenie dla typu char jest wydajniejsze w przypadku ciągu zawierającego pojedynczy znak. |
CA1868: Niepotrzebne wywołanie Contains dla zestawów |
Zarówno ISet<T>.Add(T), jak i ICollection<T>.Remove(T) wykonują wyszukiwanie, co sprawia, że wcześniejsze wywołanie ICollection<T>.Contains(T) jest zbędne. Bardziej wydajne jest bezpośrednie wywołanie Add(T) lub Remove(T), które zwraca wartość logiczną wskazującą, czy element został dodany czy usunięty. |
CA1869: Buforowanie i ponowne używanie JsonSerializerOptions wystąpień |
Użycie lokalnej instancji JsonSerializerOptions do serializacji lub deserializacji może znacznie obniżyć wydajność aplikacji, jeśli kod jest wykonywany wielokrotnie, ponieważ System.Text.Json wewnętrznie przechowuje w pamięci podręcznej metadane związane z serializacją w podanej instancji. |
CA1870: Użyj buforowanego wystąpienia SearchValues |
Użycie wystąpienia buforowanego SearchValues<T> jest bardziej wydajne niż przekazywanie wartości do IndexOfAny lub ContainsAny bezpośrednio. |
CA1871: Nie przekazuj struktury dopuszczającej wartości null do ArgumentNullException.ThrowIfNull |
ArgumentNullException.ThrowIfNull akceptuje element object, więc przekazanie struktury dopuszczającego wartość null może spowodować, że wartość zostanie w polu. |
CA1872: Preferuj Convert.ToHexString i Convert.ToHexStringLower zamiast łańcuchów wywołań opartych na BitConverter.ToString |
Użyj Convert.ToHexString lub Convert.ToHexStringLower podczas kodowania bajtów do reprezentacji ciągu szesnastkowego. Te metody są bardziej wydajne i powodują mniej alokacji niż użycie BitConverter.ToString w połączeniu z String.Replace do zastępowania myślników i String.ToLower. |
| CA1873: Unikaj potencjalnie kosztownego logowania | W wielu sytuacjach rejestrowanie jest wyłączone lub ustawione na poziom dziennika, który powoduje niepotrzebną ocenę argumentów rejestrowania. |
CA1874: Użyj Regex.IsMatch |
Regex.IsMatch jest prostsza i szybsza niż Regex.Match(...).Success. |
CA1875: Użyj Regex.Count |
Regex.Count jest prostsza i szybsza niż Regex.Matches(...).Count. |
| CA1877: Użyj przeciążeń "Path.Combine" lub "Path.Join" | Gdy wiele Path.Combine operacji lub Path.Join operacji jest zagnieżdżonych, można je zwinąć w jedną operację, aby uzyskać lepszą wydajność i czytelność. |
| CA2000: Zwalniaj obiekty, zanim wyjdą poza zakres | Ze względu na to, że może wystąpić wyjątkowe zdarzenie, które uniemożliwi uruchomienie finalizatora obiektu, obiekty powinny być jawnie usuwane, zanim wszystkie odwołania do niego znajdą się poza zakresem. |
| CA2002: Nie blokuj obiektów o słabej tożsamości | Obiekt ma słabą tożsamość, gdy można uzyskać do niego bezpośredni dostęp poza granicami domeny aplikacji. Wątek, który próbuje uzyskać blokadę na obiekcie o słabej tożsamości, może zostać zablokowany przez drugi wątek w innej domenie aplikacji, który ma blokadę na tym samym obiekcie. |
| CA2007: Nie czekaj bezpośrednio na zadanie | Metoda asynchroniczna oczekuje naTask bezpośrednio. Gdy metoda asynchroniczna bezpośrednio oczekuje na Task, wykonanie jest kontynuowane w tym samym wątku, w którym utworzono zadanie. Takie zachowanie może negatywnie wpływać na wydajność i może spowodować zakleszczenie w wątku interfejsu użytkownika. Rozważ wywołanie Task.ConfigureAwait(Boolean), aby zasygnalizować zamiar kontynuacji. |
| CA2008: Nie twórz zadań bez przekazywania TaskScheduler | Operacja tworzenia lub kontynuowania zadania korzysta z przeciążenia metody, które nie określa parametru TaskScheduler. |
| CA2009: Nie należy wywoływać metody ToImmutableCollection na wartości ImmutableCollection | metoda ToImmutable została niepotrzebnie wywołana dla niezmiennej kolekcji z przestrzeni nazw System.Collections.Immutable. |
| CA2011: Nie przypisuj właściwości w jej ustawieniu | Do właściwości przypadkowo przypisano wartość wewnątrz jej własnego akcesora set. |
| CA2012: Prawidłowo używaj ValueTask | ValueTaski zwracane z wywołań składowych są przeznaczone do tego, aby bezpośrednio na nie oczekiwać. Próby wielokrotnego użycia obiektu ValueTask lub bezpośredniego uzyskania jego wyniku, zanim będzie wiadomo, że operacja została ukończona, mogą prowadzić do zgłoszenia wyjątku lub uszkodzenia danych. Ignorowanie takiego elementu ValueTask może wskazywać na usterkę funkcjonalną i może obniżyć wydajność. |
| CA2013: Nie używaj właściwości ReferenceEquals z typami wartości | Podczas porównywania wartości za pomocą System.Object.ReferenceEquals, jeśli objA i objB są typami wartości, są opakowywane przed przekazaniem do metody ReferenceEquals. Oznacza to, że nawet jeśli zarówno objA, jak i objB reprezentują to samo wystąpienie typu wartości, ReferenceEquals metoda zwraca jednak wartość false. |
| CA2014: Nie używaj stackalloc w pętlach. | Pamięć stosu przydzielona przez `stackalloc` jest zwalniana dopiero po zakończeniu bieżącego wywołania metody. Używanie tego w pętli może spowodować nieograniczony wzrost stosu i w konsekwencji doprowadzić do jego przepełnienia. |
| CA2015: Nie należy definiować finalizatorów dla typów pochodzących z klasy MemoryManager<T> | Dodanie finalizatora do typu pochodzącego z klasy MemoryManager<T> może spowodować zwolnienie pamięci, podczas gdy nadal jest ona używana przez element Span<T>. |
| CA2016: Przekaż parametr CancellationToken do metod, które przyjmują jeden | Przekaż parametr CancellationToken do metod, które go akceptują, aby mieć pewność, że powiadomienia o anulowaniu operacji będą prawidłowo przekazywane, albo jawnie przekaż CancellationToken.None, aby wskazać, że token anulowania celowo nie jest propagowany dalej. |
| CA2017: Niezgodność liczby parametrów | Liczba parametrów podanych w szablonie komunikatu rejestrowania nie jest zgodna z liczbą nazwanych symboli zastępczych. |
CA2018: argument elementu countBuffer.BlockCopy powinien określać liczbę bajtów do skopiowania |
W przypadku używania Buffer.BlockCopycount argument określa liczbę bajtów do skopiowania. Należy używać Array.Length tylko dla argumentu count w przypadku tablic, których elementy mają rozmiar dokładnie jednego bajta.
byte, sbytei bool tablice mają elementy o rozmiarze jednego bajtu. |
CA2019: ThreadStatic pola nie powinny używać inicjalizacji wbudowanej |
Pole opatrzone adnotacją ThreadStaticAttribute jest inicjowane bezpośrednio w deklaracji lub jawnie w konstruktorze klasy static (Shared w Visual Basic). |
| CA2020: Zapobieganie zmianie zachowania powodowanej przez wbudowane operatory IntPtr/UIntPtr | Niektóre wbudowane operatory dodane na platformie .NET 7 zachowują się inaczej niż operatory zdefiniowane przez użytkownika na platformie .NET 6 i starszych wersjach. Niektóre operatory, które były używane do zgłaszania nieznaczonego kontekstu podczas przepełnienia nie są już zgłaszane, chyba że opakowane w kontekście sprawdzonym. Niektóre operatory, które wcześniej nie zgłaszały zaznaczonego kontekstu, zgłaszają teraz, chyba że są opakowane w nieznakowanym kontekście. |
| CA2021: Nie wywołuj Enumerable.Cast<T> ani Enumerable.OfType<T> z niezgodnymi typami | Wywołanie metody Enumerable.Cast<TResult>(IEnumerable) lub Enumerable.OfType<TResult>(IEnumerable) określa parametr typu niezgodny z typem kolekcji wejściowej. |
| CA2022: Unikaj niedokładnego odczytu przy użyciu metody Stream.Read | Wywołanie polecenia Stream.Read może zwracać mniej bajtów niż zażądano, co powoduje zawodny kod, jeśli wartość zwracana nie jest sprawdzana. |
| CA2023: Nieprawidłowe nawiasy klamrowe w szablonie wiadomości | Nawiasy klamrowe obecne w szablonie wiadomości są nieprawidłowe. Upewnij się, że wszystkie nawiasy klamrowe w szablonie wiadomości są prawidłowymi nawiasami klamrowymi otwierającymi/zamykającymi lub są zamykane. |
| CA2024: Nie używaj StreamReader.EndOfStream w metodach asynchronicznych | Właściwość StreamReader.EndOfStream może spowodować niezamierzone blokowanie synchroniczne, gdy żadne dane nie są buforowane. Zamiast tego użyj StreamReader.ReadLineAsync() bezpośrednio, co zwraca null po osiągnięciu końca strumienia. |
CA2025: Nie przekazuj IDisposable wystąpień do zadań nieoczekiwanych |
Nieoczekiwane zadania, które używają IDisposable wystąpień, mogą używać tych wystąpień długo po ich zwolnieniu. Upewnij się, że zadania korzystające z tych wystąpień są wykonane przed usunięciem wystąpień. |
| CA2026: Preferuj JsonElement.Parse ponad JsonDocument.Parse(). Element główny | Bardziej wydajne jest wywołanie JsonElement.Parse bezpośrednio niż wywołanie JsonDocument.Parse().RootElement. |
| CA2100: Sprawdź zapytania SQL pod kątem luk w zabezpieczeniach | Metoda ustawia właściwość System.Data.IDbCommand.CommandText przy użyciu ciągu utworzonego na podstawie argumentu typu string przekazanego do metody. Zasada ta zakłada, że argument ciągu zawiera dane wejściowe użytkownika. Ciąg polecenia SQL zbudowany z danych wejściowych użytkownika jest narażony na ataki przez wstrzyknięcie kodu SQL. |
| CA2101: Określ sposób marshalingu dla argumentów typu string w P/Invoke | Składowa wywołania platformy dopuszcza wywołania przez częściowo zaufanych wywołujących, ma parametr ciągu znaków i nie marshaluje jawnie tego ciągu. Może to spowodować potencjalne luki w zabezpieczeniach. |
| CA2109: Przeanalizuj widoczne procedury obsługi zdarzeń | Wykryto publiczną lub chronioną metodę obsługi zdarzeń. Metody obsługi zdarzeń nie powinny być udostępnione, chyba że jest to absolutnie konieczne. |
| CA2119: Uszczelnij metody implementujące interfejsy prywatne | Publiczny typ, który można dziedziczyć, zapewnia implementację metody, którą można przesłonić, dla wewnętrznego interfejsu (Friend in Visual Basic). Aby naprawić naruszenie tej zasady, należy zapobiegać zastąpieniu metody poza zestawem. |
| CA2153: Unikaj obsługi wyjątków stanu uszkodzonego | Wyjątki uszkodzonego stanu (CSE) wskazują na uszkodzenie pamięci w procesie. Przechwycenie tych błędów zamiast dopuszczenia do awarii procesu może prowadzić do luk w zabezpieczeniach, jeśli atakujący może umieścić exploit w uszkodzonym obszarze pamięci. |
| CA2200: Ponownie zgłoś wyjątek, aby zachować szczegóły stosu wywołań | Wyjątek jest zgłaszany ponownie i jest on jawnie określony w instrukcji „throw”. Jeśli wyjątek jest zgłaszany ponownie przez określenie wyjątku w instrukcji „throw”, lista wywołań metod między pierwotną metodą, która zgłosiła wyjątek, a bieżącą zostanie utracona. |
| CA2201: Nie wywołuj zastrzeżonych typów wyjątku | Dzięki temu oryginalny błąd jest trudny do wykrycia i debugowania. |
| CA2207: Inicjuj pola statyczne typu wartości bezpośrednio w deklaracji | Typ wartości deklaruje jawny, statyczny konstruktor. Aby usunąć naruszenie tej reguły, zainicjuj wszystkie dane statyczne w momencie ich deklaracji i usuń konstruktor statyczny. |
| CA2208: Poprawnie twórz wyjątki argumentów | Wywołanie jest wykonywane do domyślnego (bez parametrów) konstruktora typu wyjątku, który jest lub pochodzi z ArgumentException, lub nieprawidłowy argument ciągu jest przekazywany do sparametryzowanego konstruktora typu wyjątku, który jest lub pochodzi z ArgumentException. |
| CA2211: Pola, które nie są stałe, nie powinny być widoczne | Pola statyczne, które nie są ani stałe, ani tylko do odczytu, nie są bezpieczne wątkowo. Dostęp do takich pól musi być starannie kontrolowany i wymaga zaawansowanych technik programowania, aby synchronizować dostęp do obiektu klasy. |
| CA2213: Pola możliwe do likwidacji powinny zostać zlikwidowane | Typ, który implementuje element System.IDisposable, deklaruje pola takiego typu, które implementują także IDisposable. Metoda Dispose tego pola nie jest wywoływana przez metodę Dispose typu deklarującego to pole. |
| CA2214: Nie wywołuj metod, które można przesłonić, w konstruktorach | Gdy konstruktor wywołuje metodę wirtualną, konstruktor dla wystąpienia, które wywołuje metodę, może nie zostać wykonany. |
| CA2215: Metody Dispose powinny wywoływać metodę klasy podstawowej Dispose | Jeśli typ dziedziczy z typu usuwalnego, musi on wywołać metodę Dispose typu podstawowego z własną metodę Dispose. |
| CA2216: Typy możliwe do likwidacji powinny deklarować finalizator | Typ, który implementuje element System.IDisposable i zawiera pola, które sugerują wykorzystanie zasobów niezarządzanych, nie implementuje finalizatora, tak jak opisano w Object.Finalize. |
| CA2217: Nie oznaczaj wyliczeń za pomocą atrybutu FlagsAttribute | Wyliczenie widoczne zewnętrznie jest oznaczone atrybutem FlagsAttribute i ma co najmniej jedną wartość, która nie jest potęgą liczby dwa ani kombinacją innych wartości zdefiniowanych w wyliczeniu. |
| CA2218: Zastąp metodę GetHashCode podczas przesłaniania metody Equals | Publiczny typ przesłania System.Object.Equals, ale nie przesłania System.Object.GetHashCode. |
| CA2219: Nie zgłaszaj wyjątków w klauzulach wyjątku | Gdy w klauzuli „finally” lub „fault” zostanie zgłoszony wyjątek, nowy wyjątek ukryje bieżący wyjątek. Gdy wyjątek jest zgłaszany w klauzuli filtru, środowisko uruchomieniowe dyskretnie przechwytuje wyjątek. Dzięki temu oryginalny błąd jest trudny do wykrycia i debugowania. |
| CA2224: Przesłoń metodę Equals podczas przeciążania operatora równości | Typ publiczny implementuje operator równości, ale nie zastępuje System.Object.Equalselementu . |
| CA2225: Przeciążenia operatora mają nazwane alternatywy | Wykryto przeciążenie operatora, ale nie znaleziono oczekiwanej metody alternatywnej o tej nazwie. Nazwany alternatywny element członkowski udostępnia taką samą funkcjonalność jak operator i jest dostarczany deweloperom programującym w językach, które nie obsługują przeciążonych operatorów. |
| CA2226: Operatory powinny mieć symetryczne przeciążenia | Typ implementuje operator równości lub nierówności, ale nie implementuje operatora przeciwnego. |
| CA2227: Właściwości kolekcji powinny być tylko do odczytu | Właściwość zapisywalnej kolekcji pozwala użytkownikowi zastąpić kolekcję inną kolekcją. Właściwość tylko do odczytu uniemożliwia zastąpienie kolekcji, ale nadal pozwala na modyfikowanie poszczególnych elementów. |
| CA2229: Zaimplementuj konstruktory serializacji | Aby naprawić naruszenie tej zasady, należy zaimplementować konstruktora serializacji. Dla zamkniętej klasy należy ustawić konstruktor prywatny; w przeciwnym razie powinien być chroniony. |
| CA2231: Przeciąż operator równości podczas przesłaniania metody ValueType.Equals | Typ wartości zastępuje metodę Object.Equals, ale nie implementuje operatora równości. |
| CA2234: Przekaż obiekty System.Uri zamiast ciągów | Wykonano wywołanie do metody, która ma parametr typu ciąg, którego nazwa zawiera „uri”, „URI”, „urn”, „URN”, „url” lub „URL”. Deklarujący typ metody zawiera odpowiadające przeciążenie metody z parametrem System.Uri. |
| CA2235: Oznacz wszystkie pola nieprzeznaczone do serializacji | Pole instancji typu, który nie jest serializowalny, jest zadeklarowane w typie, który jest serializowalny. |
| CA2237: Oznacz typy implementujące interfejs ISerializable za pomocą atrybutu SerializableAttribute | Aby typy były rozpoznawalne przez CLR jako możliwe do serializacji, muszą być oznaczone za pomocą atrybutu SerializableAttribute nawet wtedy, gdy typ używa niestandardowych procedur serializacji przez implementację interfejsu ISerializable. |
| CA2241: Określ poprawne argumenty dla metod formatowania | Argument format przekazany do metody System.String.Format nie zawiera elementu formatu odpowiadającego każdemu argumentowi obiektowemu lub odwrotnie. |
| CA2242: Poprawnie sprawdzaj wartość NaN | To wyrażenie sprawdza, czy wartość jest równa Single.NaN lub Double.NaN. Użyj Single.IsNan(Single) lub Double.IsNan(Double) do testowania wartości. |
| CA2243: Analiza literałów typu string atrybutów powinna przebiegać poprawnie | Parametr o typie literału ciągu atrybutu nie analizuje poprawnie adresu URL, identyfikatora GUID lub wersji. |
| CA2244: Nie duplikuj inicjalizacji indeksowanych elementów | Inicjator obiektu zawiera więcej niż jeden inicjalizator elementu indeksowanego o tym samym stałym indeksie. Wszystkie poza ostatnim inicjalizatorem są zbędne. |
| CA2245: Nie przypisuj właściwości do samej siebie | Właściwość została przypadkowo przypisana do siebie. |
| CA2246: Nie przypisuj symbolu i jego składowej w jednej instrukcji | Przypisywanie symbolu i jego składowej, czyli pola lub właściwości, w ramach tej samej instrukcji nie jest zalecane. Nie jest jasne, czy odwołanie do składowej w tej instrukcji miało wykorzystywać starą wartość symbolu sprzed przypisania czy nową wartość wynikającą z przypisania. |
| CA2247: Argument przekazany do konstruktora TaskCompletionSource powinien być typu wyliczeniowego TaskCreationOptions, a nie typu wyliczeniowego TaskContinuationOptions. | TaskCompletionSource ma konstruktory, które przyjmują parametr TaskCreationOptions sterujący bazowym zadaniem, oraz konstruktory, które przyjmują stan obiektu przechowywany w zadaniu. Przypadkowe przekazanie obiektu TaskContinuationOptions zamiast TaskCreationOptions spowoduje, że wywołanie potraktuje te opcje jako stan. |
| CA2248: Przekaż poprawny argument typu wyliczeniowego do metody Enum.HasFlag | Typ wyliczeniowy przekazany jako argument w wywołaniu metody HasFlag różni się od typu wyliczeniowego obiektu wywołującego. |
| CA2249: Rozważ użycie String.Contains zamiast String.IndexOf | Wywołania string.IndexOf, których wynik jest używany do sprawdzania obecności lub braku podciągu, można zastąpić przez string.Contains. |
CA2250: Użyj ThrowIfCancellationRequested |
ThrowIfCancellationRequested automatycznie sprawdza, czy token został anulowany, i zgłasza OperationCanceledException błąd, jeśli został on anulowany. |
CA2251: Użyj String.Equals zamiast String.Compare |
Jest to zarówno czytelniejsze, jak i prawdopodobnie szybsze: użyć String.Equals zamiast porównywać wynik String.Compare z zerem. |
| CA2252: Wyrażanie zgody na funkcje w wersji zapoznawczej | Włącz funkcje w wersji zapoznawczej przed użyciem interfejsów API w wersji zapoznawczej. |
| CA2253: Nazwane symbole zastępcze nie powinny być wartościami liczbowymi | Nazwane symbole zastępcze w szablonie komunikatu rejestrowania nie powinny składać się tylko z znaków liczbowych. |
| CA2254: Szablon powinien być wyrażeniem statycznym | Szablon komunikatu rejestrowania nie powinien różnić się między wywołaniami. |
CA2255: Atrybut ModuleInitializer nie powinien być używany w bibliotekach |
Inicjatory modułów mają być używane przez kod aplikacji, aby upewnić się, że składniki aplikacji są inicjowane przed rozpoczęciem wykonywania kodu aplikacji. |
| CA2256: Wszystkie składowe zadeklarowane w interfejsach bazowych muszą mieć swoją implementację w interfejsie oznaczonym atrybutem DynamicInterfaceCastableImplementation | Typy opatrzone atrybutem DynamicInterfaceCastableImplementationAttribute stanowią implementację interfejsu dla typu implementującego typ IDynamicInterfaceCastable. W związku z tym musi zawierać implementacje wszystkich składowych zdefiniowanych w dziedziczonych interfejsach, ponieważ typ implementujący IDynamicInterfaceCastable w przeciwnym razie ich nie zapewni. |
CA2257: Elementy zdefiniowane w interfejsie DynamicInterfaceCastableImplementationAttribute powinny być static |
Ponieważ typ implementujący IDynamicInterfaceCastable może nie implementować interfejsu dynamicznego w metadanych, wywołanie członka interfejsu instancji, który nie jest jawnie zaimplementowany na tym typie, mogą zakończyć się niepowodzeniem podczas wykonywania. Oznacz nowe elementy członkowskie static interfejsu, aby uniknąć błędów środowiska uruchomieniowego. |
CA2258: Udostępnianie interfejsu DynamicInterfaceCastableImplementation w Visual Basic jest nieobsługiwane |
Aby udostępnić funkcjonalny interfejs z atrybutem DynamicInterfaceCastableImplementationAttribute, wymagana jest funkcja domyślnych składowych interfejsu, która nie jest obsługiwana w języku Visual Basic. |
CA2259: Upewnij się, że ThreadStatic jest używane tylko z polami statycznymi |
ThreadStaticAttribute dotyczy tylko pól static (Shared w Visual Basic). Po zastosowaniu do pól instancji atrybut nie ma wpływu na działanie. |
| CA2260: Poprawnie zaimplementuj ogólne interfejsy matematyczne | Ogólne interfejsy matematyczne wymagają użycia samego typu pochodnego dla parametru typu cyklicznego. |
CA2261: Nie używaj elementu ConfigureAwaitOptions.SuppressThrowing z elementem Task<TResult> |
Opcja ConfigureAwaitOptions.SuppressThrowing nie jest obsługiwana przez ogólny Task<TResult>, ponieważ może to prowadzić do zwrócenia nieprawidłowego TResult. |
CA2262: Ustaw MaxResponseHeadersLength poprawnie |
Upewnij się, że wartość MaxResponseHeadersLength jest podana poprawnie. Ta wartość jest mierzona w kilobajtach. |
| CA2263: Preferuj przeciążenie ogólne, gdy typ jest znany | Użycie przeciążenia generycznego jest lepsze niż przekazywanie argumentu System.Type, gdy typ jest znany, ponieważ pozwala tworzyć czytelniejszy kod o większym bezpieczeństwie typów i zapewnia lepszą weryfikację na etapie kompilacji. |
CA2264: Nie przekazuj wartości innej niż null do ArgumentNullException.ThrowIfNull |
ArgumentNullException.ThrowIfNull zwraca wartość , gdy przekazany argument to null. Niektóre konstrukcje, takie jak struktury nieakceptujące wartości null, oraz wyrażenia nameof() i new są znane z tego, że nigdy nie przyjmują wartości null, więc ArgumentNullException.ThrowIfNull nigdy nie będzie generować wyjątku. |
CA2265: Nie należy porównywać Span<T> z null lub default |
Porównywanie span z null lub default może nie działać tak, jak zamierzasz.
default i literał null są niejawnie konwertowane na Span<T>.Empty. |
CA2266: Punkt wejścia programu oparty na plikach powinien zaczynać się od #! |
Gdy program oparty na plikach składa się z wielu plików, plik punktu wejścia powinien zaczynać się od wiersza shebang (#!), aby wyraźnie odróżnić go od innych dołączonych plików. |
| CA2300: Nie używaj niezabezpieczonego deserializatora BinaryFormatter | Niezabezpieczone deserializatory są podatne na ataki podczas deserializacji niezaufanych danych. Osoba atakująca może zmodyfikować serializowane dane w celu uwzględnienia nieoczekiwanych typów w celu wstrzyknięcia obiektów ze złośliwymi skutkami ubocznymi. |
| CA2301: Nie należy wywoływać metody BinaryFormatter.Deserialize bez wcześniejszego ustawienia BinaryFormatter.Binder | Niezabezpieczone deserializatory są podatne na ataki podczas deserializacji niezaufanych danych. Osoba atakująca może zmodyfikować serializowane dane w celu uwzględnienia nieoczekiwanych typów w celu wstrzyknięcia obiektów ze złośliwymi skutkami ubocznymi. |
| CA2302: Upewnij się, że parametr BinaryFormatter.Binder został ustawiony przed wywołaniem metody BinaryFormatter.Deserialize | Niezabezpieczone deserializatory są podatne na ataki podczas deserializacji niezaufanych danych. Osoba atakująca może zmodyfikować serializowane dane w celu uwzględnienia nieoczekiwanych typów w celu wstrzyknięcia obiektów ze złośliwymi skutkami ubocznymi. |
| CA2305: Nie używaj niezabezpieczonego deserializatora LosFormatter | Niezabezpieczone deserializatory są podatne na ataki podczas deserializacji niezaufanych danych. Osoba atakująca może zmodyfikować serializowane dane w celu uwzględnienia nieoczekiwanych typów w celu wstrzyknięcia obiektów ze złośliwymi skutkami ubocznymi. |
| CA2310: Nie używaj niezabezpieczonego deserializatora NetDataContractSerializer | Niezabezpieczone deserializatory są podatne na ataki podczas deserializacji niezaufanych danych. Osoba atakująca może zmodyfikować serializowane dane w celu uwzględnienia nieoczekiwanych typów w celu wstrzyknięcia obiektów ze złośliwymi skutkami ubocznymi. |
| CA2311: Nie deserializuj bez uprzedniego ustawienia NetDataContractSerializer.Binder | Niezabezpieczone deserializatory są podatne na ataki podczas deserializacji niezaufanych danych. Osoba atakująca może zmodyfikować serializowane dane w celu uwzględnienia nieoczekiwanych typów w celu wstrzyknięcia obiektów ze złośliwymi skutkami ubocznymi. |
| CA2312: Przed deserializacji upewnij się, że parametr NetDataContractSerializer.Binder został ustawiony | Niezabezpieczone deserializatory są podatne na ataki podczas deserializacji niezaufanych danych. Osoba atakująca może zmodyfikować serializowane dane w celu uwzględnienia nieoczekiwanych typów w celu wstrzyknięcia obiektów ze złośliwymi skutkami ubocznymi. |
| CA2315: Nie używaj niezabezpieczonego deserializatora ObjectStateFormatter | Niezabezpieczone deserializatory są podatne na ataki podczas deserializacji niezaufanych danych. Osoba atakująca może zmodyfikować serializowane dane w celu uwzględnienia nieoczekiwanych typów w celu wstrzyknięcia obiektów ze złośliwymi skutkami ubocznymi. |
| CA2321: Nie deserializuj za pomocą klasy JavaScriptSerializer przy użyciu parametru SimpleTypeResolver | Niezabezpieczone deserializatory są podatne na ataki podczas deserializacji niezaufanych danych. Osoba atakująca może zmodyfikować serializowane dane w celu uwzględnienia nieoczekiwanych typów w celu wstrzyknięcia obiektów ze złośliwymi skutkami ubocznymi. |
| CA2322: Przed deserializacją upewnij się, że obiekt JavaScriptSerializer nie został zainicjowany przy użyciu SimpleTypeResolver | Niezabezpieczone deserializatory są podatne na zagrożenia podczas deserializacji niezaufanych danych. Osoba atakująca może zmodyfikować serializowane dane w celu uwzględnienia nieoczekiwanych typów w celu wstrzyknięcia obiektów ze złośliwymi skutkami ubocznymi. |
| CA2326: Nie używaj wartości TypeNameHandling innych niż None | Niezabezpieczone deserializatory są podatne na ataki podczas deserializacji niezaufanych danych. Osoba atakująca może zmodyfikować serializowane dane w celu uwzględnienia nieoczekiwanych typów w celu wstrzyknięcia obiektów ze złośliwymi skutkami ubocznymi. |
| CA2327: Nie używaj niezabezpieczonych ustawień JsonSerializerSettings | Niezabezpieczone deserializatory są podatne na zagrożenia podczas deserializacji niezaufanych danych. Osoba atakująca może zmodyfikować serializowane dane w celu uwzględnienia nieoczekiwanych typów w celu wstrzyknięcia obiektów ze złośliwymi skutkami ubocznymi. |
| CA2328: Upewnij się, że ustawienia JsonSerializerSettings są bezpieczne | Niezabezpieczone deserializatory są podatne na ataki podczas deserializacji niezaufanych danych. Osoba atakująca może zmodyfikować serializowane dane w celu uwzględnienia nieoczekiwanych typów w celu wstrzyknięcia obiektów ze złośliwymi skutkami ubocznymi. |
| CA2329: Nie deserializuj przy użyciu narzędzia JsonSerializer przy użyciu niezabezpieczonej konfiguracji | Niezabezpieczone deserializatory są podatne na ataki podczas deserializacji niezaufanych danych. Osoba atakująca może zmodyfikować serializowane dane w celu uwzględnienia nieoczekiwanych typów w celu wstrzyknięcia obiektów ze złośliwymi skutkami ubocznymi. |
| CA2330: Upewnij się, że program JsonSerializer ma bezpieczną konfigurację podczas deserializacji | Niezabezpieczone mechanizmy deserializacji są podatne na ataki podczas deserializacji niezaufanych danych. Osoba atakująca może zmodyfikować serializowane dane w celu uwzględnienia nieoczekiwanych typów w celu wstrzyknięcia obiektów ze złośliwymi skutkami ubocznymi. |
| CA2350: Upewnij się, że dane wejściowe metody DataTable.ReadXml() są zaufane | W przypadku deserializacji elementu DataTable z niezaufanymi danymi wejściowymi osoba atakująca może utworzyć złośliwe dane wejściowe w celu przeprowadzenia ataku typu "odmowa usługi". Może istnieć nieznana luka w zabezpieczeniach dotycząca zdalnego wykonywania kodu. |
| CA2351: Upewnij się, że dane wejściowe elementu DataSet.ReadXml() są zaufane | W przypadku deserializacji elementu DataSet z niezaufanymi danymi wejściowymi osoba atakująca może utworzyć złośliwe dane wejściowe w celu przeprowadzenia ataku typu "odmowa usługi". Może istnieć nieznana luka w zabezpieczeniach dotycząca zdalnego wykonywania kodu. |
| CA2352: Niezabezpieczone typy DataSet lub DataTable w typie serializowalnym mogą być podatne na ataki polegające na zdalnym wykonywaniu kodu | Klasa lub struktura oznaczona elementem SerializableAttribute zawiera DataSet pole lub DataTable właściwość i nie ma elementu GeneratedCodeAttribute. |
| CA2353: Niebezpieczny zestaw danych lub dataTable w typie z możliwością serializacji | Klasa lub struktura oznaczona atrybutem serializacji XML lub atrybutem kontraktu danych zawiera DataSet pole lub DataTable właściwość. |
| CA2354: Niebezpieczny element DataSet lub DataTable w deserializowanym grafie obiektów może być podatny na atak polegający na zdalnym wykonywaniu kodu | Deserializacja z użyciem zserializowanego System.Runtime.Serialization.IFormatter, a graf obiektów rzutowanego typu może zawierać obiekt DataSet lub DataTable. |
| CA2355: Niebezpieczny element DataSet lub DataTable w grafie deserializowanych obiektów | Deserializowanie, gdy graf obiektu rzutowanego lub określonego typu może zawierać element DataSet lub DataTable. |
| CA2356: Niebezpieczny obiekt DataSet lub DataTable w grafie obiektów deserializowanych z sieci | Metoda z parametrem System.Web.Services.WebMethodAttribute lub System.ServiceModel.OperationContractAttribute , który może odwoływać się do metody DataSet lub DataTable. |
| CA2361: Upewnij się, że automatycznie wygenerowana klasa zawierająca klasę DataSet.ReadXml() nie jest używana z niezaufanymi danymi | W przypadku deserializacji elementu DataSet z niezaufanymi danymi wejściowymi osoba atakująca może utworzyć złośliwe dane wejściowe w celu przeprowadzenia ataku typu "odmowa usługi". Może istnieć nieznana luka w zabezpieczeniach dotycząca zdalnego wykonywania kodu. |
| CA2362: Niebezpieczny obiekt DataSet lub DataTable w typie serializowalnym wygenerowanym automatycznie może być podatny na ataki polegające na zdalnym wykonywaniu kodu | Podczas deserializacji niezaufanych danych wejściowych przy użyciu BinaryFormatter, jeśli deserializowany graf obiektów zawiera element DataSet lub DataTable, osoba atakująca może spreparować złośliwy ładunek w celu przeprowadzenia ataku polegającego na zdalnym wykonaniu kodu. |
| CA3001: Przegląd kodu pod kątem luk w zabezpieczeniach polegających na wstrzyknięciu kodu SQL | Podczas pracy z niezaufanymi danymi wejściowymi oraz poleceniami SQL należy pamiętać o atakach polegających na wstrzykiwaniu kodu SQL. Atak polegający na wstrzyknięciu kodu SQL może wykonywać złośliwe polecenia SQL, co narusza bezpieczeństwo i integralność aplikacji. |
| CA3002: Przegląd kodu pod kątem luk w zabezpieczeniach XSS | Podczas pracy z niezaufanymi danymi wejściowymi z żądań internetowych należy pamiętać o atakach skryptowych między witrynami (XSS). Atak XSS wprowadza niezaufane dane wejściowe do nieprzetworzonych danych wyjściowych HTML, dzięki czemu osoba atakująca może wykonywać złośliwe skrypty lub złośliwie modyfikować zawartość na stronie internetowej. |
| CA3003: Przejrzyj kod pod kątem podatności związanych z wstrzyknięciem ścieżki pliku | Podczas pracy z niezaufanymi danymi wejściowymi z żądań internetowych należy pamiętać o używaniu danych wejściowych kontrolowanych przez użytkownika podczas określania ścieżek do plików. |
| CA3004: Przegląd kodu pod kątem luk w zabezpieczeniach umożliwiających ujawnienie informacji | Ujawnienie informacji o wyjątkach zapewnia osobom atakującym wgląd w wewnętrzne elementy aplikacji, co może pomóc osobom atakującym w znalezieniu innych luk w zabezpieczeniach. |
| CA3005: Przegląd kodu pod kątem luk w zabezpieczeniach polegających na wstrzyknięciu protokołu LDAP | Podczas pracy z niezaufanymi danymi wejściowymi należy pamiętać o atakach polegających na wstrzyknięciu protokołu LDAP (Lightweight Directory Access Protocol). Atakujący może potencjalnie wykonać złośliwe zapytania LDAP w katalogach informacyjnych. Aplikacje korzystające z danych wejściowych użytkownika do konstruowania dynamicznych instrukcji LDAP w celu uzyskania dostępu do usług katalogowych są szczególnie narażone. |
| CA3006: Przegląd kodu pod kątem luk w zabezpieczeniach polegających na wstrzyknięciu poleceń procesu | Podczas pracy z niezaufanymi danymi wejściowymi należy pamiętać o atakach polegających na wstrzyknięciu poleceń. Atak polegający na wstrzyknięciu polecenia może wykonywać złośliwe polecenia w bazowym systemie operacyjnym, co narusza bezpieczeństwo i integralność serwera. |
| CA3007: Przejrzyj kod pod kątem luk w zabezpieczeniach związanych z otwartym przekierowaniem | Podczas pracy z niezaufanymi danymi wejściowymi należy pamiętać o otwartych lukach w zabezpieczeniach przekierowania. Osoba atakująca może wykorzystać podatność na otwarte przekierowanie, aby użyć Twojej witryny internetowej do stworzenia pozoru legalnego adresu URL, a następnie przekierować nieświadomego użytkownika na stronę phishingową lub inną złośliwą stronę internetową. |
| CA3008: Przejrzyj kod pod kątem podatności na iniekcję XPath | Podczas pracy z niezaufanymi danymi wejściowymi należy pamiętać o atakach polegających na wstrzyknięciu kodu XPath. Konstruowanie zapytań XPath przy użyciu niezaufanych danych wejściowych może umożliwić osobie atakującej złośliwe manipulowanie zapytaniem w celu zwrócenia niezamierzonego wyniku i ewentualnie ujawnienie zawartości zapytanego kodu XML. |
| CA3009: Przegląd kodu pod kątem luk w zabezpieczeniach polegających na wstrzyknięciu kodu XML | Podczas pracy z niezaufanymi danymi wejściowymi należy pamiętać o atakach polegających na wstrzyknięciu kodu XML. |
| CA3010: Przegląd kodu pod kątem luk w zabezpieczeniach polegających na wstrzyknięciu kodu XAML | Podczas pracy z niezaufanymi danymi wejściowymi należy pamiętać o atakach polegających na wstrzyknięciu kodu XAML. XAML to język znaczników, w którym bezpośrednio reprezentowane jest tworzenie wystąpień obiektów i ich wykonywanie. Oznacza to, że elementy utworzone w języku XAML mogą współdziałać z zasobami systemowymi (na przykład dostępem do sieci i operacjami we/wy systemu plików). |
| CA3011: Przegląd kodu pod kątem luk w zabezpieczeniach polegających na wstrzyknięciu biblioteki DLL | Podczas pracy z niezaufanymi danymi wejściowymi należy pamiętać o ładowaniu niezaufanego kodu. Jeśli aplikacja internetowa ładuje niezaufany kod, osoba atakująca może wstrzyknąć złośliwe biblioteki DLL do procesu i wykonać złośliwy kod. |
| CA3012: Przeanalizuj kod pod kątem podatności na wstrzyknięcie wyrażeń regularnych | Podczas pracy z niezaufanymi danymi wejściowymi zwracaj uwagę na ataki typu regex injection. Osoba atakująca może wykorzystać podatność typu regex injection do złośliwego zmodyfikowania wyrażenia regularnego, aby dopasowywało niezamierzone wyniki lub zużywało nadmierne zasoby procesora, co prowadzi do ataku typu odmowy usługi. |
| CA3061: Nie dodawaj schematu przy użyciu adresu URL | Nie używaj niebezpiecznego przeciążenia metody Add, ponieważ może ono powodować niebezpieczne referencje zewnętrzne. |
| CA3075: Niezabezpieczone przetwarzanie definicji DTD | Jeśli używasz niezabezpieczonych wystąpień DTDProcessing lub odwołujesz się do źródeł zewnętrznych jednostek, analizator może zaakceptować niezaufane dane wejściowe i ujawnić poufne informacje osobom atakującym. |
| CA3076: Niezabezpieczone wykonywanie skryptu XSLT | Jeśli wykonujesz transformacje Extensible Stylesheet Language Transformations (XSLT) w aplikacjach .NET w niezabezpieczony sposób, procesor może rozwiązywać niezaufane odwołania URI, co może ujawnić atakującym poufne informacje i prowadzić do ataków typu Denial of Service (DoS) oraz Cross-Site. |
| CA3077: Niezabezpieczone przetwarzanie w projektowaniu interfejsu API, dokumencie XML i czytniku tekstu XML | Podczas projektowania API dziedziczącego po klasach XMLDocument i XMLTextReader należy pamiętać o DtdProcessing. Używanie niezabezpieczonych instancji DTDProcessing podczas odwoływania się do źródeł encji zewnętrznych lub ich rozwiązywania bądź ustawianie niezabezpieczonych wartości w XML może prowadzić do ujawnienia informacji. |
| CA3147: Oznacz programy obsługi czasowników za pomocą elementu ValidateAntiForgeryToken | Podczas projektowania kontrolera MVC ASP.NET należy pamiętać o atakach fałszerzowania żądań obejmujących wiele lokacji. Atak polegający na fałszowaniu żądań między witrynami może wysyłać złośliwe żądania w imieniu uwierzytelnionego użytkownika do kontrolera ASP.NET MVC. |
| CA5350: Nie używaj słabych algorytmów kryptograficznych | Słabe algorytmy szyfrowania i funkcje tworzenia skrótów są obecnie używane z wielu powodów, ale nie powinny być używane do zagwarantowania poufności lub integralności chronionych danych. Ta reguła jest wyzwalana w przypadku znalezienia algorytmów TripleDES, SHA1 lub RIPEMD160 w kodzie. |
| CA5351: Nie używaj uszkodzonych algorytmów kryptograficznych | Uszkodzone algorytmy kryptograficzne nie są uważane za bezpieczne, a ich użycie powinno być zdecydowanie zniechęcone. Ta reguła jest wyzwalana w przypadku znalezienia algorytmu skrótu MD5 lub algorytmów szyfrowania DES lub RC2 w kodzie. |
| CA5358: Nie używaj niebezpiecznych trybów szyfrowania | Nie używaj niebezpiecznych trybów szyfrowania |
| CA5359: Nie wyłączaj weryfikacji certyfikatu | Certyfikat może pomóc w uwierzytelnieniu tożsamości serwera. Klienci powinni zweryfikować certyfikat serwera, aby upewnić się, że żądania są wysyłane do zamierzonego serwera. Jeśli funkcja ServerCertificateValidationCallback zawsze zwraca true, każdy certyfikat zostanie zaakceptowany. |
| CA5360: Nie należy wywoływać niebezpiecznych metod podczas deserializacji | Niezabezpieczona deserializacja to luka w zabezpieczeniach, która występuje, gdy niezaufane dane są wykorzystywane do manipulowania logiką aplikacji, przeprowadzenia ataku typu odmowa usługi (DoS), a nawet wykonania dowolnego kodu po zdeserializowaniu takich danych. Złośliwi użytkownicy często mogą nadużywać tych funkcji deserializacji, gdy aplikacja deserializuje niezaufane dane, które są pod ich kontrolą. W szczególności podczas deserializacji dochodzi do wywołania niebezpiecznych metod. Skuteczne ataki wykorzystujące niezabezpieczoną deserializację mogą umożliwić atakującemu przeprowadzenie takich działań jak ataki DoS, obejście mechanizmów uwierzytelniania i zdalne wykonywanie kodu. |
| CA5361: Nie wyłączaj używania silnej kryptografii Schannel | Ustawienie Switch.System.Net.DontEnableSchUseStrongCrypto na true osłabia kryptografię stosowaną w wychodzących połączeniach protokołu TLS (Transport Layer Security). Słabsza kryptografia może naruszyć poufność komunikacji między aplikacją a serwerem, co ułatwia osobom atakującym podsłuchiwanie poufnych danych. |
| CA5362: Potencjalny cykl referencji w zdeserializowanym grafie obiektów | Jeśli deserializowane są niezaufane dane, każdy fragment kodu przetwarzający zdeserializowany graf obiektów musi obsługiwać cykle referencji, nie wpadając przy tym w nieskończone pętle. Obejmuje to zarówno kod, który jest częścią wywołania zwrotnego deserializacji, jak i kodu, który przetwarza graf obiektu po zakończeniu deserializacji. W przeciwnym razie osoba atakująca może wykonać atak typu "odmowa usługi" ze złośliwymi danymi zawierającymi cykl referencyjny. |
| CA5363: Nie wyłączaj walidacji żądania | Walidacja żądań to funkcja w ASP.NET, która analizuje żądania HTTP i określa, czy zawierają potencjalnie niebezpieczną zawartość, która może prowadzić do ataków polegających na wstrzyknięciu, w tym skryptów obejmujących wiele witryn. |
| CA5364: Nie używaj przestarzałych protokołów zabezpieczeń | Transport Layer Security (TLS) zabezpiecza komunikację między komputerami, najczęściej za pomocą protokołu Hypertext Transfer Protocol Secure (HTTPS). Starsze wersje protokołu TLS są mniej bezpieczne niż TLS 1.2 i TLS 1.3 i są bardziej narażone na nowe luki w zabezpieczeniach. Unikaj starszych wersji protokołu, aby zminimalizować ryzyko. |
| CA5365: Nie wyłączaj sprawdzania nagłówka HTTP | Sprawdzanie nagłówków HTTP umożliwia kodowanie znaków powrotu karetki i nowego wiersza, \r i \n, występujących w nagłówkach odpowiedzi. To kodowanie może pomóc uniknąć ataków wstrzyknięcia, które wykorzystują aplikację zwracającą niezaufane dane zawarte w nagłówku. |
| CA5366: Użyj klasy XmlReader dla DataSet.ReadXml | Użycie elementu DataSet do odczytu kodu XML z niezaufanymi danymi może spowodować załadowanie niebezpiecznych odwołań zewnętrznych, które powinny być ograniczone przy użyciu modułu XmlReader z bezpiecznym rozpoznawaniem lub z wyłączonym przetwarzaniem DTD. |
| CA5367: Nie serializuj typów z polami wskaźnikowymi | Ta reguła sprawdza, czy istnieje klasa z możliwością serializacji z polem wskaźnika lub właściwością. Składowe, których nie można serializować, mogą być wskaźnikami, takimi jak składowe statyczne lub pola oznaczone znacznikiem NonSerializedAttribute. |
| CA5368: Ustaw właściwość ViewStateUserKey dla klas pochodnych ze strony | Ustawienie właściwości ViewStateUserKey może pomóc zapobiec atakom na aplikację, umożliwiając przypisanie identyfikatora do zmiennej stanu widoku poszczególnym użytkownikom, aby osoby atakujące nie mogły użyć tej zmiennej do przeprowadzenia ataku. W przeciwnym razie system będzie podatny na ataki polegające na fałszowaniu żądań między witrynami. |
| CA5369: Użyj klasy XmlReader do deserializacji | Przetwarzanie niezaufanych deklaracji DTD i schematów XML może umożliwić ładowanie niebezpiecznych odwołań zewnętrznych, dlatego należy je ograniczyć, używając klasy XmlReader z bezpiecznym mechanizmem rozpoznawania lub z wyłączonym przetwarzaniem DTD i wbudowanych schematów XML. |
| CA5370: Użyj XmlReader dla czytnika walidującego | Przetwarzanie niezaufanych schematów DTD i XML może umożliwić ładowanie niebezpiecznych odwołań zewnętrznych. To niebezpieczne wczytywanie można ograniczyć, używając elementu XmlReader z bezpiecznym mechanizmem rozpoznawania lub z wyłączonym przetwarzaniem DTD i wbudowanego schematu XML. |
| CA5371: Użyj XmlReader do odczytu schematu | Przetwarzanie niezaufanych schematów DTD i XML może umożliwić ładowanie niebezpiecznych odwołań zewnętrznych. Użycie elementu XmlReader z bezpiecznym programem rozpoznawania nazw lub z wyłączonym przetwarzaniem DTD i wbudowanych schematów XML ogranicza to. |
| CA5372: Użyj klasy XmlReader w dokumencie XPathDocument | Przetwarzanie danych XML pochodzących z niezaufanych źródeł może spowodować załadowanie niebezpiecznych odwołań zewnętrznych, co można ograniczyć, używając XmlReader z bezpiecznym mechanizmem rozpoznawania lub z wyłączonym przetwarzaniem DTD. |
| CA5373: Nie używaj przestarzałej funkcji wyprowadzania kluczy | Ta reguła wykrywa wywołanie słabych metod uzyskiwania klucza System.Security.Cryptography.PasswordDeriveBytes i Rfc2898DeriveBytes.CryptDeriveKey.
System.Security.Cryptography.PasswordDeriveBytes użyto słabego algorytmu PBKDF1. |
| CA5374: Nie używaj XslTransform | Ta reguła sprawdza, czy w kodzie tworzona jest instancja System.Xml.Xsl.XslTransform. System.Xml.Xsl.XslTransform jest teraz przestarzały i nie powinien być używany. |
| CA5375: Nie używaj sygnatury dostępu współdzielonego konta | Sygnatura dostępu współdzielonego konta może delegować dostęp do operacji odczytu, zapisu i usuwania w kontenerach obiektów blob, tabelach, kolejkach i udziałach plików, które nie są dozwolone przy użyciu sygnatury dostępu współdzielonego usługi. Nie obsługuje jednak zasad na poziomie kontenera i ma mniejszą elastyczność i kontrolę nad przyznanymi uprawnieniami. Gdy złośliwi użytkownicy je zdobędą, łatwo będzie przejąć twoje konto magazynu danych. |
| CA5376: Użyj funkcji SharedAccessProtocol HttpsOnly | SAS to poufne dane, których nie można przesyłać jawnym tekstem przez HTTP. |
| CA5377: Użyj zasad dostępu na poziomie kontenera | Zasady dostępu na poziomie kontenera można modyfikować lub odwoływać w dowolnym momencie. Zapewnia większą elastyczność i kontrolę nad przyznanymi uprawnieniami. |
| CA5378: Nie wyłączaj ServicePointManagerSecurityProtocols | Ustawienie parametru Switch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols na true ogranicza połączenia Transport Layer Security (TLS) platformy Windows Communication Framework (WCF) do korzystania z protokołu TLS 1.0. Ta wersja protokołu TLS będzie przestarzała. |
| CA5379: Nie używaj słabego algorytmu funkcji wyprowadzania klucza | Klasa Rfc2898DeriveBytes domyślnie używa algorytmu SHA1 . W niektórych przeciążeniach konstruktora dla wartości SHA256 lub wyższych należy określić używany algorytm skrótu. Należy zauważyć, że właściwość HashAlgorithm ma tylko akcesor get i nie ma modyfikatora overridden. |
| CA5380: Nie dodawaj certyfikatów do magazynu głównego | Ta reguła wykrywa kod, który dodaje certyfikat do magazynu certyfikatów zaufanych głównych urzędów certyfikacji. Domyślnie magazyn certyfikatów zaufanych głównych urzędów certyfikacji jest skonfigurowany z zestawem publicznych urzędów certyfikacji, który spełnia wymagania programu certyfikatów głównych firmy Microsoft. |
| CA5381: Upewnij się, że certyfikaty nie są dodawane do magazynu głównego | Ta reguła wykrywa kod, który potencjalnie dodaje certyfikat do magazynu certyfikatów zaufanych głównych urzędów certyfikacji. Domyślnie magazyn certyfikatów zaufanych głównych urzędów certyfikacji jest skonfigurowany z zestawem publicznych urzędów certyfikacji, który spełnia wymagania programu certyfikatów głównych firmy Microsoft. |
| CA5382: Używanie bezpiecznych plików cookie w programie ASP.NET Core | Aplikacje dostępne za pośrednictwem protokołu HTTPS muszą używać bezpiecznych plików cookie, które wskazują przeglądarce, że plik cookie powinien być przesyłany tylko przy użyciu protokołu SSL (Secure Sockets Layer). |
| CA5383: Upewnij się, że używaj bezpiecznych plików cookie w programie ASP.NET Core | Aplikacje dostępne za pośrednictwem protokołu HTTPS muszą używać bezpiecznych plików cookie, które wskazują przeglądarce, że plik cookie powinien być przesyłany tylko przy użyciu protokołu SSL (Secure Sockets Layer). |
| CA5384: Nie używaj algorytmu podpisu cyfrowego (DSA) | DSA to słaby algorytm szyfrowania asymetrycznego. |
| CA5385: Użyj algorytmu Rivest–Shamir-Adleman (RSA) z wystarczającą ilością klucza | Klucz RSA mniejszy niż 2048 bitów jest bardziej podatny na ataki siłowe. |
| CA5386: Unikaj trwałego kodowania wartości SecurityProtocolType | Transport Layer Security (TLS) zabezpiecza komunikację między komputerami, najczęściej za pomocą protokołu Hypertext Transfer Protocol Secure (HTTPS). Wersje protokołu TLS 1.0 i TLS 1.1 są przestarzałe, a protokoły TLS 1.2 i TLS 1.3 są aktualne. W przyszłości protokoły TLS 1.2 i TLS 1.3 mogą być przestarzałe. Aby zapewnić bezpieczeństwo aplikacji, unikaj sztywnego wpisywania wersji protokołu i ustaw jako docelową co najmniej platformę .NET Framework 4.7.1. |
| CA5387: Nie używaj słabej funkcji wyprowadzania klucza z niewystarczającą liczbą powtórzeń | Ta reguła sprawdza, czy klucz kryptograficzny został wygenerowany przez Rfc2898DeriveBytes przy liczbie iteracji mniejszej niż 100 000. Większa liczba iteracji może pomóc w ograniczeniu ataków słownikowych, które próbują odgadnąć wygenerowany klucz kryptograficzny. |
| CA5388: Zapewnij wystarczającą liczbę iteracji podczas używania słabej funkcji wyprowadzania klucza | Ta reguła sprawdza, czy klucz kryptograficzny został wygenerowany za pomocą Rfc2898DeriveBytes przy liczbie iteracji, która może być mniejsza niż 100 000. Większa liczba iteracji może pomóc w ograniczeniu ataków słownikowych, które próbują odgadnąć wygenerowany klucz kryptograficzny. |
| CA5389: Nie dodawaj ścieżki elementu archiwum do docelowej ścieżki systemu plików | Ścieżka pliku może być względna i może prowadzić do dostępu do systemu plików poza oczekiwaną ścieżką docelową systemu plików, co prowadzi do złośliwych zmian konfiguracji i zdalnego wykonywania kodu za pomocą techniki lay-and-wait. |
| CA5390: Nie szyfruj klucza szyfrowania za pomocą kodu twardego | Aby algorytm symetryczny zakończył się pomyślnie, klucz tajny musi być znany tylko nadawcy i odbiorcy. Gdy klucz jest zakodowany na twardo, można go łatwo odnaleźć. Nawet ze skompilowanych plików binarnych złośliwi użytkownicy mogą je łatwo wyodrębnić. Po naruszeniu zabezpieczeń klucza prywatnego tekst szyfrowania można odszyfrować bezpośrednio i nie jest już chroniony. |
| CA5391: Używanie tokenów antyforgeryjnych w kontrolerach ASP.NET Core MVC | Obsługa żądania POST, PUT, PATCH lub DELETE bez sprawdzenia tokenu zabezpieczającego przed fałszowaniem żądań może być podatna na ataki CSRF. Atak typu cross-site request forgery (CSRF) może spowodować wysłanie złośliwych żądań w imieniu uwierzytelnionego użytkownika do kontrolera ASP.NET Core MVC. |
| CA5392: Użyj atrybutu DefaultDllImportSearchPaths dla parametrów P/Invoke | Domyślnie funkcje P/Invoke używające elementu DllImportAttribute przeszukują kilka katalogów, w tym bieżący katalog roboczy, w poszukiwaniu biblioteki do załadowania. Może to być problem z zabezpieczeniami niektórych aplikacji, co prowadzi do porwania bibliotek DLL. |
| CA5393: Nie używaj niebezpiecznej wartości DllImportSearchPath | W domyślnych katalogach wyszukiwania bibliotek DLL i katalogach zestawów może istnieć złośliwa biblioteka DLL. Lub w zależności od tego, skąd jest uruchamiana aplikacja, może istnieć złośliwa biblioteka DLL w katalogu aplikacji. |
| CA5394: Nie używaj niezabezpieczonej losowości | Użycie kryptograficznie słabego generatora liczb pseudolosowych może umożliwić atakującemu przewidywanie, jaka wartość wrażliwa na zabezpieczenia zostanie wygenerowana. |
| CA5395: Brak atrybutu HttpVerb dla metod akcji | Wszystkie metody akcji, które tworzą, edytują, usuwają lub w inny sposób modyfikują dane, muszą być zabezpieczone atrybutem antiforgery przed atakami typu cross-site request forgery (CSRF). Wykonanie operacji GET powinno być bezpieczną operacją, która nie ma skutków ubocznych i nie modyfikuje utrwalone dane. |
| CA5396: Ustaw wartość HttpOnly na wartość true dla elementu HttpCookie | W ramach ochrony w głębi systemu upewnij się, że poufne pliki cookie HTTP są oznaczone jako HttpOnly. Oznacza to, że przeglądarki internetowe nie powinny zezwalać skryptom na dostęp do plików cookie. Wstrzyknięte złośliwe skrypty są typowym sposobem kradzieży plików cookie. |
| CA5397: Nie używaj przestarzałych wartości SslProtocols | Transport Layer Security (TLS) zabezpiecza komunikację między komputerami, najczęściej z użyciem protokołu Hypertext Transfer Protocol Secure (HTTPS). Starsze wersje protokołu TLS są mniej bezpieczne niż TLS 1.2 i TLS 1.3 i są bardziej narażone na nowe luki w zabezpieczeniach. Unikaj starszych wersji protokołu, aby zminimalizować ryzyko. |
| CA5398: Unikaj zakodowanych na stałe wartości SslProtocols | Transport Layer Security (TLS) zabezpiecza komunikację między komputerami, najczęściej za pomocą protokołu Hypertext Transfer Protocol Secure (HTTPS). Wersje protokołu TLS 1.0 i TLS 1.1 są przestarzałe, a protokoły TLS 1.2 i TLS 1.3 są aktualne. W przyszłości protokoły TLS 1.2 i TLS 1.3 mogą być przestarzałe. Aby zapewnić bezpieczeństwo aplikacji, należy unikać trwałego kodowania wersji protokołu. |
| CA5399: Zdecydowanie wyłącz sprawdzanie listy odwołania certyfikatów HttpClient | Odwołany certyfikat nie jest już uznawany za zaufany. Może to być używane przez osoby atakujące przekazujące złośliwe dane lub kradnące poufne dane w komunikacji HTTPS. |
| CA5400: Upewnij się, że sprawdzanie listy odwołania certyfikatów HttpClient nie jest wyłączone | Odwołany certyfikat nie jest już uznawany za zaufany. Może to być używane przez osoby atakujące przekazujące złośliwe dane lub kradnące poufne dane w komunikacji HTTPS. |
| CA5401: Nie używaj metody CreateEncryptor z wektorem inicjalizującym (IV) innym niż domyślny | Szyfrowanie symetryczne powinno zawsze używać nie powtarzalnego wektora inicjalizacji, aby zapobiec atakom słownikowym. |
| CA5402: Użyj metody CreateEncryptor z domyślnym IV | Szyfrowanie symetryczne powinno zawsze używać nie powtarzalnego wektora inicjalizacji, aby zapobiec atakom słownikowym. |
| CA5403: Nie koduj certyfikatu na stałe | Parametr data lub rawData konstruktora X509Certificate lub X509Certificate2 jest zakodowany na stałe. |
| CA5404: Nie wyłączaj sprawdzania poprawności tokenu |
TokenValidationParameters właściwości kontrolujące sprawdzanie poprawności tokenu nie powinny być ustawione na false. |
| CA5405: Nie zawsze pomijaj sprawdzanie poprawności tokenu w delegatach | Funkcja wywołania zwrotnego przypisana do AudienceValidator lub LifetimeValidator zawsze zwraca true. |
| IL3000: Unikaj odwoływania się do ścieżki pliku zestawu Assembly podczas publikowania w formie pojedynczego pliku | Unikaj uzyskiwania dostępu do ścieżki pliku złożenia podczas publikowania w postaci pojedynczego pliku. |
| IL3001: Unikaj odwoływania się do ścieżki pliku zestawu podczas publikowania w postaci pojedynczego pliku | Unikaj odwoływania się do ścieżki pliku zestawu podczas publikowania w postaci pojedynczego pliku. |
IL3002: Unikaj wywoływania elementów członkowskich z adnotacjami RequiresAssemblyFilesAttribute podczas publikowania jako pojedynczego pliku |
Unikaj wywoływania elementów członkowskich z adnotacjami RequiresAssemblyFilesAttribute podczas publikowania w formie pojedynczego pliku |
IL3003: RequiresAssemblyFilesAttribute adnotacje muszą być zgodne ze wszystkimi implementacjami interfejsu lub przesłonięciami. |
RequiresAssemblyFilesAttribute Adnotacje muszą pasować do wszystkich implementacji interfejsu lub nadpisań. |
IL3005: nie można umieścić RequiresAssemblyFilesAttribute bezpośrednio w punkcie wejścia aplikacji. |
RequiresAssemblyFilesAttribute nie można umieścić bezpośrednio w punkcie wejścia aplikacji. |
Legend
W poniższej tabeli przedstawiono typ informacji podanych dla każdej reguły w dokumentacji referencyjnej.
| Item | Description |
|---|---|
| Typ | Nazwa typu reguły. |
| Identyfikator reguły | Unikatowy identyfikator reguły. Elementy RuleId i Category służą do wyłączania ostrzeżenia w kodzie źródłowym. |
| Category | Kategoria reguły, na przykład zabezpieczenia. |
| Poprawka powodująca niekompatybilność lub jej niepowodująca | Czy poprawka naruszenia reguły jest zmianą powodującą niezgodność. Zmiana powodująca niezgodność oznacza, że zestaw, który ma zależność od obiektu docelowego, który spowodował naruszenie, nie zostanie ponownie skompilowany z nową stałą wersją lub może zakończyć się niepowodzeniem w czasie wykonywania z powodu zmiany. Jeśli dostępnych jest wiele poprawek i co najmniej jedna poprawka jest zmianą powodującą niezgodność, a jedna poprawka nie jest określona, określono zarówno wartość "Niezgodność", jak i "Niezgodność". |
| Cause | Określony kod zarządzany, który powoduje wygenerowanie ostrzeżenia przez regułę. |
| Description | Omówienie problemów, które znajdują się za ostrzeżeniem. |
| Jak naprawić naruszenia | Wyjaśnia, jak zmienić kod źródłowy, aby spełnić regułę i uniemożliwić generowanie ostrzeżenia. |
| Kiedy pomijać ostrzeżenia | Opisuje, kiedy można bezpiecznie zignorować ostrzeżenie generowane przez tę regułę. |
| Przykładowy kod | Przykłady naruszające regułę i poprawione przykłady spełniające regułę. |
| Powiązane reguły | Powiązane reguły. |