Reguły jakości kodu
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 | opis |
---|---|
CA1000: Nie deklaruj składowych statycznych w typach ogólnych | Po wywołaniu statycznego elementu członkowskiego typu ogólnego dla typu trzeba określić argument typu. Po wywołaniu wystąpienia ogólnego elementu członkowskiego, które nie obsługuje wnioskowania, dla elementu członkowskiego musi zostać określony argument typu. W tych dwóch przypadkach składnia określająca argument typu jest różna i łatwo o pomyłkę. |
CA1001: Typy z polami możliwymi do likwidacji powinny być możliwe do likwidacji | Klasa deklaruje i implementuje pole wystąpienia typu System.IDisposable, ale 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 też lista nie zawiera wirtualnych elementów członkowskich. Zamiast powyższych powinny zostać zastosowane kolekcje ogólne, zaprojektowane do obsługi dziedziczenia. |
CA1003: Użyj wystąpień ogólnej procedury obsługi zdarzeń | Typ zawiera delegata, który zwraca wartość void, którego podpis zawiera dwa parametry (pierwszy obiekt i drugi typ, który można przypisać do klasy EventArgs) oraz zawierające obiekty docelowe zestawu 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 z jednym parametrem typu, jak na liście<T>, a w niektórych przypadkach, które mają dwa parametry typu, jak w słowniku<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, aby wypełnić typy generyczne kolekcji. |
CA1012: Typy abstrakcyjne nie powinny mieć publicznych konstruktorów | Konstruktory dla typów abstrakcyjnych mogą być wywoływane tylko przez typy pochodne. Ze względu na to, że publiczne konstruktory tworzą wystąpienia typu, a nie można utworzyć wystąpienia typu abstrakcyjnego, publiczny konstruktor typu abstrakcyjnego został niepoprawnie 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. Dobry projekt określa, że wszystkie zestawy jawnie wskazują zgodność środowiska CLS przy użyciu polecenia 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 tylko z wersji zestawu, z którego zostały zbudowane. |
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. Widoczność COM można ustawić dla całego zestawu, a następnie zastąpić dla poszczególnych typów i elementów członkowskich typu. 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ą. Metoda ta może być dobrym kandydatem na właściwość. |
CA1027: Oznacz typy wyliczeniowe atrybutem Flags | Wyliczenie to typ wartości, który definiuje zestaw powiązanych, nazwanych stałych. Zastosuj atrybut FlagsAttribute do wyliczenia, gdy jego stałe nazwane mogą zostać sensownie połączone. |
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ń wszędzie tam, gdzie jest to odpowiednie | Ta reguła wykrywa metody o nazwach, które normalnie mogą być używane dla 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. Przechwytuj wyjątek bardziej precyzyjny lub zgłoś ponownie 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 móc wywoływać metody 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 w przypadku hermetyzacji szczegółów implementacji prywatnej typu zawierającego. Używane w tym celu typy zagnieżdżone nie powinny być widoczne na zewnątrz. |
CA1036: Przesłoń metody dla typów obsługujących porównywanie | 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ą elementy członkowskie, które zapewniają zachowanie lub użycie kontraktu. 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 dla jego elementów członkowskich. 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 elementu członkowskiego, który jest oznaczony za pomocą ObsoleteAttribute, wyświetlana jest właściwość Wiadomość atrybutu. Dostarcza to informacje użytkownika o przestarzałym typie lub elemencie członkowskim. |
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 zostać ograniczone do przypadków, w których nie może zostać określony typ całkowity lub ciąg w czasie projektowania. |
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 odwołanie | 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 równości w typach referencyjnych | Dla typów odwołań 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 składowych chronionych w typach zapieczętowanych | Chronione elementy członkowskie są zadeklarowane w typach tak, aby typy dziedziczące miały dostęp do elementu członkowskiego i mogły go zastąpić. Z definicji po typach zapieczętowanych nie można dziedziczyć, co oznacza, że nie można wywołać metody chronionej na typach zapieczętowanych. |
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 widocznych pól wystąpienia | Głównym zastosowaniem pola powinno być to, co szczegółowo opisuje implementacja. Pola powinny być prywatne lub wewnętrzne i dostępne przy użyciu właściwości. |
CA1052: Statyczne typy przechowujące powinny być zapieczętowane | Typ publiczny lub chroniony zawiera tylko statyczne elementy członkowskie i nie jest zadeklarowany za pomocą modyfikatora sealed (C# Reference) (NotInheritable). Typ, po którym nie będzie dziedziczenia, powinien być oznakowany przy użyciu modyfikatora sealed, aby zapobiec użyciu go jako typu podstawowego. |
CA1053: Statyczne typy przechowujące nie powinny mieć konstruktorów | Typ publiczny lub publiczny zagnieżdżony deklaruje tylko statyczne elementy członkowskie i ma publiczny lub chroniony konstruktor domyślny. Konstruktor jest zbędny, ponieważ wywołanie statycznego elementu członkowskiego nie wymaga wystąpienia 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 pobiera reprezentację ciągu identyfikatora URI, powinno zostać dostarczone odpowiadające przeciążenie, pobierające wystąpienie klasy URI, które dostarcza te usługi w bezpieczny sposób. |
CA1055: Wartości zwracane identyfikatora URI nie powinny być ciągami | Reguła ta zakłada, że metoda zwraca identyfikator URI. Reprezentacja ciągu identyfikatora URI jest podatna na analizowanie i kodowanie błędów i może prowadzić do powstawania 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. Reprezentacja ciągu identyfikatora URI jest podatna na analizowanie i kodowanie błędów i może prowadzić do powstawania 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 za pomocą atrybutu System.Runtime.InteropServices.DllImportAttribute lub metody zdefiniowane za pomocą słowa kluczowego Declare w języku Visual Basic, uzyskują dostęp do kodu niezarządzanych. 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 odwołania, które są przekazywane do metody widocznej na zewnątrz, powinny być sprawdzane 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: Zastępowanie równości podczas implementowania funkcji IEquatable | Typ implementuje metodę IEquatable<T>, ale nie zastępuje Equals metody. |
CA1068: Parametry CancellationToken muszą być ostatnie | Metoda ma parametr CancellationToken, który nie jest ostatnim parametrem. |
CA1069: Wyliczenia nie powinny mieć zduplikowanych wartości | Wyliczenie ma wiele elementów członkowskich, które są jawnie przypisane do tej samej wartości stałej. |
CA1070: Nie deklaruj pól zdarzeń jako wirtualne | Zdarzenie podobne do 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ń. Zapobiega to również znajdowaniu i aktualizowaniu odwołań do symboli podczas refaktoryzacji zintegrowanego środowiska projektowego (IDE) programu Visual Studio. |
CA1303: Nie przekazuj literałów jako parametrów zlokalizowanych | 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 klasę CultureInfo | Metoda lub konstruktor wywołuje członka mającego przeciążenie, które akceptuje parametr System.Globalization.CultureInfo i metodę lub konstruktor niewywołujący przeciążenia, które wymaga parametru 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 interfejs IFormatProvider | Metoda lub konstruktor wywołują jednego lub kilku członków, którzy mają przeciążenia akceptujące parametr System.IFormatProvider, i metody lub konstruktora, który 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 ciągu używa przeciążenia metody, które nie ustawia parametru StringComparison. |
CA1308: Normalizuj ciągi do postaci zapisanej wielkimi literami | Ciągi powinny być znormalizowane do użycia wielkich liter. Małe grupy znaków nie mogą wykonywać rund, gdy są one konwertowane 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ównania ciągów używa przeciążenia metody, które nie ustawia parametru StringComparison i domyślnie używa porównania ciągów specyficznych dla kultury. |
CA1311: Określ kulturę lub użyj niezmiennej wersji | Określ kulturę lub użyj niezmiennej kultury, aby uniknąć niejawnej zależności od bieżącej kultury podczas wywoływania ToUpper metody 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 parametrów ciągu dla parametrów P/Invoke |
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 jest tak widoczny, jak typ zawierający dla konkretnych typów pochodzących z "System.Runtime.InteropServices.SafeHandle" | Zapewnienie konstruktora bez parametrów, który jest tak widoczny, jak typ zawierający dla typu pochodzącego z System.Runtime.InteropServices.SafeHandle , umożliwia lepszą wydajność i użycie z rozwiązaniami międzyoperacyjności generowanymi przez źródło. |
CA1420: Właściwość, typ lub atrybut wymagają marshalingu środowiska uruchomieniowego | Korzystanie z funkcji wymagających marshalingu środowiska uruchomieniowego po wyłączeniu marshalingu środowiska uruchomieniowego spowoduje wyjątki czasu wykonywania. |
CA1421: Metoda używa marshalingu środowiska uruchomieniowego podczas stosowania elementu DisableRuntimeMarshallingAttribute | Metoda używa marshalingu środowiska uruchomieniowego, a marshalling środowiska uruchomieniowego jest jawnie wyłączony. |
CA1422: Weryfikowanie zgodności platformy | Wywoływanie interfejsu API, który jest przestarzały w danym systemie operacyjnym (wersja) z witryny wywołania dostępnej z tego systemu operacyjnego (wersja) nie jest zalecane. |
CA1501: Unikaj nadmiernego dziedziczenia | Typ jest głęboki na więcej niż cztery poziomy w hierarchii dziedziczenia. Hierarchie typów głęboko zagnieżdżonych 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 przez liczenie unikatowych odwołań typów, które zawiera typ lub metoda. |
CA1507: Użyj nazwy zamiast ciągu | Literał ciągu jest używany jako argument, w którym nameof można użyć wyrażenia. |
CA1508: Unikaj martwego kodu warunkowego | Metoda ma kod warunkowy, który zawsze oblicza wartość true lub false w czasie wykonywania. Prowadzi to do martwych kodu w false gałęzi warunku. |
CA1509: Nieprawidłowy wpis w pliku konfiguracji metryk kodu | Reguły metryk kodu, takie jak CA1501CodeMetricsConfig.txt . |
CA1510: Użyj pomocnika throw ArgumentNullException | Pomocnicy zgłaszania są prostsze i bardziej wydajne niż if bloki tworzące nowe wystąpienie wyjątku. |
CA1511: Użyj pomocnika throw ArgumentException | Pomocnicy zgłaszania są prostsze i bardziej wydajne niż if bloki tworzące nowe wystąpienie wyjątku. |
CA1512: Użyj pomocnika throw ArgumentOutOfRangeException | Pomocnicy zgłaszania są prostsze i bardziej wydajne niż if bloki tworzące nowe wystąpienie wyjątku. |
CA1513: Użyj pomocnika objectDisposedException | Pomocnicy zgłaszania są prostsze i bardziej wydajne niż if bloki tworzące nowe wystąpienie wyjątku. |
CA1514: Unikaj argumentu nadmiarowej długości | Argument nadmiarowej długości jest używany podczas fragmentowania na końcu ciągu lub buforu. Długość obliczeniowa może być podatna na błędy i jest również niepotrzebna. |
CA1515: Rozważ wprowadzenie typów publicznych wewnętrznych | W przeciwieństwie do biblioteki klas interfejs API aplikacji nie jest zwykle publicznie przywołyny, więc typy mogą być oznaczone wewnętrznie. |
CA1700: Nie nadawaj wartościom wyliczenia nazwy „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, elementów członkowskich i parametry nie mogą się różnić jedynie wielkością liter, ponieważ języki dla środowiska uruchomieniowego języka wspólnego 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 elementów członkowskich wyliczenia nie mają prefiksu od nazwy typu, ponieważ narzędzia programistyczne dostarczają informacje na temat typu. |
CA1713 Zdarzenia nie powinny mieć prefiksu Before ani After | Nazwa zdarzenia rozpoczyna się od „Before” lub „After”. Nazwa powiązanych zdarzeń, które są wywoływane w określonej kolejności, używa czasu teraźniejszego lub przeszłego, aby wskazać względne położenie akcji w sekwencji. |
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 być zgodne ze słowami kluczowymi, które są definiowane przez języki dla środowiska uruchomieniowego języka wspólnego. |
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 wyraźnie odróżniają ich funkcje. |
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 nazywanie parametrów w zastąpieniu hierarchii zwiększa użyteczność zastąpienia metody. 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 (udostępnione i tylko do odczytu w języku Visual Basic) i jest inicjowane przy użyciu wartości, która jest kompilowana 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 odwołań do ich wartości domyślnych przed uruchomieniem 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 pola statyczne typu referencyjnego śródwierszowo | Podczas gdy typ deklaruje jawny, statyczny konstruktor, kompilator just in time (JIT) do każdej metody statycznej dodaje sprawdzenie i konstruktora wystąpienia, aby upewnić się, że konstruktor statyczny został wcześniej wywołany. Sprawdzenia konstruktora statycznego mogą obniżyć wydajność. |
CA1812: Unikaj klas wewnętrznych bez wystąpień | Wystąpienie typu na poziomie zestawu nie jest tworzone przez kod 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. Plombowanie atrybutu eliminuje wyszukiwanie przez hierarchię dziedziczenia i może zwiększyć wydajność. |
CA1814: Wybieraj tablice nieregularne zamiast wielowymiarowych | Nieregularna tablica to ta, której elementy są tablicami. 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łoń metodę equals i operator równości dla typów wartości | Dla typów wartości dziedziczona implementacja operatora Equas wykorzystuje bibliotekę odbić i porównuje zawartość wszystkich pól. Odbicie jest obliczeniowo kosztowne, a porównanie równości każdego pola 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 GC. SuppressFinalize; lub metoda, która nie jest implementacją wywołań Dispose GC. SuppressFinalize; lub metoda wywołuje GC. SuppressFinalize i przekazuje coś innego niż (Me w Visual Basic). |
CA1819: Właściwości nie powinny zwracać tablic | Tablice zwracane przez właściwości nie są zabezpieczone przed zapisem, nawet gdy mają właściwość tylko do odczytu. Aby zachować tablicę odporną na manipulacje, właściwość musi zwracać kopię tablicy. Zwykle użytkownicy nie rozumieją, jakie niekorzystne następstwa dla wydajności 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: Usuwaj puste finalizatory | Jeśli to tylko możliwe, należy unikać finalizatorów ze względu na dodatkowe obciążenie, które bierze udział w śledzeniu okresu istnienia obiektu. Pusty finalizator powoduje dodatkowe obciążenie i nie zapewnia żadnych korzyści. |
CA1822: Oznaczaj składowe jako statyczne | Elementy członkowskie, które nie uzyskują dostępu do danych wystąpienia lub wywołają metody wystąpienia, mogą być oznaczone jako statyczne (udostępnione w Visual Basic). Po oznaczeniu metod jako statyczne kompilator wygeneruje niewirtualne wywołania do tych członków. To może dać wymierny zysk wydajnościowy dla kodu wrażliwego na wydajność. |
CA1823: Unikaj nieużywanych pól prywatnych | Zostały wykryte pola prywatne, które w zestawie nie są widoczne jako dostępne. |
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. To zwiększa wydajność wyszukiwania dla pierwszego zasobu, który się ładuje i może zmniejszyć zestaw roboczy. |
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 przydzielonego pustego wystąpienia tablicy, wywołując metodę 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 funkcji Count/LongCount, gdy można użyć dowolnego | 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 przy użyciu metody ToString() i przeciążenia opartego na ciągach. |
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 | W przypadku używania indeksatora zakresu w tablicy i niejawnego przypisywania wartości do ReadOnlySpan<T> typu lub ReadOnlyMemory<T> metoda GetSubArray zostanie użyta zamiast Slice, co spowoduje utworzenie kopii żądanej części tablicy. |
CA1833: Użyj klasy AsSpan lub AsMemory zamiast indeksatorów opartych na zakresie do pobierania części span lub pamięci tablicy | W przypadku używania indeksatora zakresu w tablicy i niejawnego przypisywania wartości do Span<T> typu lub Memory<T> metoda GetSubArray zostanie użyta zamiast Slice, co spowoduje utworzenie kopii żądanej części tablicy. |
CA1834: Użyj ciąguBuilder.Append(char) dla ciągów jednoznakowych |
StringBuilder
Append ma przeciążenie, które przyjmuje char jako argument. Preferuj wywoływanie char przeciążenia ze względów wydajności. |
CA1835: Preferuj przeciążenia oparte na pamięci dla poleceń "ReadAsync" i "WriteAsync" | Element "Stream" ma przeciążenie "ReadAsync", które przyjmuje wartość "Bajt pamięci<>" jako pierwszy argument, a przeciążenie "WriteAsync", które przyjmuje argument "ReadOnlyMemory<Byte>". Preferuj wywoływanie przeciążeń opartych na pamięci, które są bardziej wydajne. |
CA1836: Preferuj IsEmpty Count w przypadku dostępności |
Preferuj IsEmpty właściwość, która jest wydajniejsza niż Count , Length lub Count<TSource>(IEnumerable<TSource>)LongCount<TSource>(IEnumerable<TSource>) określić, czy obiekt zawiera, czy nie żadnych elementów. |
CA1837: Użyj Environment.ProcessId zamiast Process.GetCurrentProcess().Id |
Environment.ProcessId jest prostsza i szybsza niż Process.GetCurrentProcess().Id . |
CA1838: Unikaj StringBuilder parametrów dla parametrów P/Invoke |
Marshalling elementu "StringBuilder" zawsze tworzy natywną kopię buforu, co powoduje wiele alokacji dla jednej operacji marshallingu. |
CA1839: Użyj elementu Environment.ProcessPath zamiast Process.GetCurrentProcess(). MainModule.FileName |
Environment.ProcessPath jest prostsza i szybsza niż Process.GetCurrentProcess().MainModule.FileName . |
CA1840: Użyj wartości Environment.CurrentManagedThreadId zamiast Thread.CurrentThread.ManagedThreadId |
Environment.CurrentManagedThreadId jest bardziej kompaktowy i wydajny niż Thread.CurrentThread.ManagedThreadId . |
CA1841: Preferuj słownik zawiera metody | 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 elementu "WhenAll" z pojedynczym 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 funkcji "WaitAll" z jednym zadaniem | Użycie WaitAll z jednym zadaniem może spowodować utratę wydajności. Zamiast tego zaczekaj na zadanie lub zwróć je. |
CA1844: Podaj zastąpienia oparte na pamięci metod asynchronicznych podczas podklasowania "Stream" | Aby zwiększyć wydajność, zastąp metody asynchroniczne oparte na pamięci podczas podklasowania "Stream". Następnie zaimplementuj metody oparte na tablicy pod względem metod opartych na pamięci. |
CA1845: Użyj ciągu opartego na span. Concat' | Bardziej wydajne jest użycie AsSpan operatorów string.Concat i , Substring a nie i operator łączenia. |
CA1846: Preferuj AsSpan ponad Substring |
AsSpan jest wydajniejszy niż Substring .
Substring Wykonuje kopię ciągu O(n), a nie AsSpan i nie ma stałego kosztu.
AsSpan nie wykonuje również żadnych alokacji sterty. |
CA1847: Użyj literału znaków dla 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 metodę statyczną HashData za pośrednictwem ComputeHash |
Wydajniejsze jest użycie metody statycznej HashData w celu utworzenia HashAlgorithm wystąpienia i zarządzania nim w celu wywołania metody ComputeHash . |
CA1851: Możliwe wiele wyliczeń kolekcji IEnumerable |
Możliwe wiele wyliczeń kolekcji IEnumerable . Rozważ użycie implementacji, która pozwala uniknąć wielu wyliczeń. |
CA1852: Uszczelnij typy wewnętrzne | Typ, który nie jest dostępny poza zestawem i nie ma podtypów w ramach zestawu zawierającego zestaw, nie jest zapieczętowany. |
CA1853: Niepotrzebne wywołanie elementu "Dictionary.ContainsKey(key)" | Nie ma potrzeby ochrony Dictionary.Remove(key) za pomocą polecenia 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 element "TryGetValue" za pośrednictwem indeksatora słownika chronionego przez sprawdzanie "ContainsKey". Element "ContainsKey" i indeksator wyszukują klucz, więc użycie polecenia "TryGetValue" pozwala uniknąć dodatkowego wyszukiwania. |
CA1855: Użyj opcji Span<T>. Clear() zamiast Span<T>. Fill() | Bardziej wydajne jest wywołanie Span<T>.Clear() metody niż wywołanie Span<T>.Fill(T) w celu wypełnienia elementów zakresu 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 | Wywołanie metody jest bardziej wydajne niż wywołanie String.StartsWithString.IndexOf w celu sprawdzenia, czy ciąg zaczyna się od danego prefiksu. |
CA1859: Używaj typów, gdy jest to możliwe w celu zwiększenia wydajności | 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 metody rozszerzenia "Enumerable.Any()" | Bardziej wydajne i jaśniejsze jest użycie Length elementów , Count lub IsEmpty (jeśli jest to możliwe) niż wywołanie Enumerable.Any metody w celu określenia, czy typ kolekcji ma 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 "statycznych do odczytu" w celu zwiększenia wydajności. |
CA1862: Użyj przeciążeń metody "StringComparison", aby wykonać porównania ciągów bez uwzględniania wielkości liter | Gdy wywołania ToLower() kodu lub ToUpper() wykonanie porównania ciągu bez uwzględniania wielkości liter, wykonywana jest niepotrzebna alokacja. |
CA1863: Użyj formatu złożonego | Aby zmniejszyć koszt formatowania, buforuj i użyj CompositeFormat wystąpienia jako argumentu do 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 wykonaj wyszukiwanie, które jest nadmiarowe. Bardziej wydajne jest wywołanie Dictionary<TKey,TValue>.TryAddmetody , która zwraca wartość wskazującą bool , 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 char | Przeciążenie znaków jest lepszym przeciążeniem dla ciągu z pojedynczym znakiem. |
CA1868: Niepotrzebne wywołanie funkcji "Contains" dla zestawów | Zarówno ISet<T>.Add(T) , jak i ICollection<T>.Remove(T) wykonaj wyszukiwanie, co sprawia, że jest ono nadmiarowe do wywołania ICollection<T>.Contains(T) wcześniej. Bardziej wydajne jest wywołanie Add(T) lub Remove(T) bezpośrednie zwrócenie wartości logicznej wskazującej, czy element został dodany, czy usunięty. |
CA1869: Buforowanie i ponowne używanie wystąpień "JsonSerializerOptions" | Użycie lokalnego JsonSerializerOptions wystąpienia programu do serializacji lub deserializacji może znacznie obniżyć wydajność aplikacji, jeśli kod jest wykonywany wiele razy, ponieważ plik System.Text.Json wewnętrznie buforuje metadane związane z serializacji do podanego wystąpienia. |
CA1870: Użyj buforowanego wystąpienia "SearchValues" | Użycie buforowanego SearchValues<T> wystąpienia jest bardziej wydajne niż przekazywanie wartości bezpośrednio do "IndexOfAny" lub "ContainsAny". |
CA1871: Nie przekazuj struktury dopuszczalnej wartości null do klasy "ArgumentNullException.ThrowIfNull" | Wyrażenie "ArgumentNullException.ThrowIfNull" akceptuje obiekt "object", więc przekazanie struktury dopuszczających wartość null może spowodować, że wartość zostanie w polu. |
CA1872: Preferuj metodę "Convert.ToHexString" i "Convert.ToHexStringLower" za pośrednictwem łańcuchów wywołań opartych na metodzie "BitConverter.ToString" | Użyj Convert.ToHexString lub Convert.ToHexStringLower podczas kodowania bajtów do reprezentacji ciągu szesnastkowego. Te metody są bardziej wydajne i przyjazne alokacji niż w BitConverter.ToString połączeniu z String.Replace w celu zastąpienia kreski i String.ToLower. |
CA2000: Likwiduj obiekty przed utratą zakresu | 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 domenie innej aplikacji, która ma blokady dla tego samego obiektu. |
CA2007: Nie czekaj bezpośrednio na zadanie | Metoda asynchroniczna oczekujeTask bezpośrednio. Gdy metoda asynchroniczna oczekuje Task bezpośrednio, kontynuacja występuje w tym samym wątku, który utworzył zadanie. Takie zachowanie może być kosztowne pod względem wydajności i może spowodować zakleszczenie wątku interfejsu użytkownika. Rozważ wywołanie Task.ConfigureAwait(Boolean) sygnału o zamiarze kontynuacji. |
CA2008: Nie twórz zadań bez przekazywania elementu TaskScheduler | Operacja tworzenia lub kontynuacji zadania używa przeciążenia metody, które nie określa parametru TaskScheduler . |
CA2009: Nie należy wywoływać metody ToImmutableCollection na wartości ImmutableCollection |
ToImmutable metoda została niepotrzebnie wywołana w niezmiennej kolekcji z System.Collections.Immutable przestrzeni nazw. |
CA2011: Nie przypisuj właściwości w jej ustawieniu | Właściwość została przypadkowo przypisana wartość w ramach własnego zestawu dostępu. |
CA2012: Poprawnie użyj wartościTasks | WartościZadania zwracane z wywołań składowych mają być bezpośrednio oczekiwane. Próby wielokrotnego korzystania z elementu ValueTask lub bezpośredniego uzyskania dostępu do wyniku, zanim wiadomo, że zostanie ukończone, mogą spowodować wyjątek lub uszkodzenie. 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 przy użyciu metody System.Object.ReferenceEquals, jeśli objA i objB są typami wartości, są one w polu przed przekazaniem ReferenceEquals ich do metody . 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 pętli stackalloc w pętlach. | Miejsce na stos przydzielone przez stosalloc jest zwalniane tylko na końcu wywołania bieżącej metody. Użycie go w pętli może spowodować niezwiązane wzrost stosu i ostateczne warunki przepełnienia stosu. |
CA2015: Nie należy definiować finalizatorów dla typów pochodzących z klasy MemoryManager<T> | Dodanie finalizatora do typu pochodzącego z MemoryManager<T> klasy może pozwolić na zwolnienie pamięci, gdy jest ona nadal używana przez Span<T>element . |
CA2016: Przekaż parametr CancellationToken do metod, które przyjmują jeden |
CancellationToken Przekaż parametr do metod, które przyjmują jeden, aby upewnić się, że powiadomienia anulowania operacji są prawidłowo propagowane lub przekazywane CancellationToken.None jawnie, aby wskazać celowo nie propagację tokenu. |
CA2017: Niezgodność liczby parametrów | Liczba parametrów podanych w szablonie komunikatu rejestrowania nie jest zgodna z liczbą nazwanych symboli zastępczych. |
CA2018: count Argument, który Buffer.BlockCopy ma określać liczbę bajtów do skopiowania |
W przypadku używania Buffer.BlockCopy count argument określa liczbę bajtów do skopiowania. Argumentu należy używać Array.Length count tylko w przypadku tablic, których elementy są dokładnie jednym bajtem rozmiaru.
byte , sbyte i bool tablice mają elementy o rozmiarze jednego bajtu. |
CA2019: ThreadStatic pola nie powinny używać inline initialization |
Pole z adnotacjami ThreadStaticAttribute jest inicjowane w tekście lub jawnie w konstruktorze static (Shared w Visual Basic). |
CA2020: Zapobieganie zmianom behawioralnym spowodowanym 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ływanie funkcji Enumerable.Cast<T> lub 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 nieistniejącego odczytu za pomocą funkcji 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. |
CA2100: Sprawdź zapytania SQL pod kątem luk w zabezpieczeniach | Metoda ustawia właściwość System.Data.IDbCommand.CommandText przez użycie ciągu, który jest zbudowany z argumentem ciągu 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 marshalling dla argumentów ciągu P/Invoke | Element członkowski wywołania platformy zezwala na dostęp częściowo zaufanych wywołań, ma parametr ciągu i nie kieruje jawnie tego ciągu. Może to spowodować potencjalne luki w zabezpieczeniach. |
CA2109: Przejrzyj 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: Pieczętuj metody, które spełniają wymagania interfejsów prywatnych | Typ publiczny, który można dziedziczyć, zapewnia zastępowalną implementację metody wewnętrznego (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 | Uszkodzone wyjątki stanu (CSE) wskazują, że uszkodzenie pamięci istnieje w procesie. Przechwycenie tych elementów zamiast zezwalania na awarię procesu może prowadzić do luk w zabezpieczeniach, jeśli osoba atakująca może umieścić luki w zabezpieczeniach w uszkodzonym regionie pamięci. |
CA2200: Zgłoś ponownie wyjątek, aby zachować szczegóły stosu | 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: Pola statyczne typu wartości inicjuj bezpośrednio | Typ wartości deklaruje jawny, statyczny konstruktor. Aby naprawić naruszenie tej zasady, zainicjuj wszystkie dane statyczne, gdy jest on zadeklarowany, i usuń konstruktor statyczny. |
CA2208: Poprawnie twórz wystąpienia wyjątków 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 obsługują wielowątkowości. 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 pola nie jest wywoływana przez metodę Dispose typu deklarującego. |
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ę Dispose klasy podstawowej | 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 | Widoczne na zewnątrz wyliczenie jest oznaczone przy użyciu FlagsAttribute i ma jedną lub więcej wartości, które nie są potęgami dwójki lub kombinacji innych zdefiniowanych wartości z wyliczenia. |
CA2218: Przesłoń metodę GetHashCode przy przesłanianiu metody Equals | Przesłonięć System.Object.Equals typu publicznego, ale nie zastępuje System.Object.GetHashCodeelementu . |
CA2219: Nie zgłaszaj wyjątków w klauzulach wyjątku | Kiedy wyjątek jest zgłaszany w klauzuli „finally” lub „fault”, nowy wyjątek ukrywa aktywny 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łaniaj metodę Equals w przypadku przeciążania operacji równości operatorów | Typ publiczny implementuje operator równości, ale nie zastępuje System.Object.Equalselementu . |
CA2225: Przeciążenia operatora mają nazwane alternatywy | Wykryto przeciążony operator i nie znaleziono metody alternatywnej o oczekiwanej 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ępowanie kolekcji, ale nadal umożliwia ustawienie poszczególnych członkó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ążaj operator równości w przypadku 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 | Pola wystąpienia typu, który nie może być serializowany, jest zadeklarowany w typie, który jest możliwy do serializacji. |
CA2237: Oznacz typy 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 formatu, który jest przekazany do elementu System.String.Format, nie zawiera elementu format, który odpowiada każdemu obiektowi argumentu lub odwrotnie. |
CA2242: Poprawnie testuj nie-liczby (NaN) | To wyrażenie sprawdza, czy wartość to 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 ma więcej niż jeden indeksowany inicjator elementu z tym samym indeksem stałej. Wszystkie oprócz ostatniego inicjatora są nadmiarowe. |
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 elementu członkowskiego w tej samej instrukcji | Przypisywanie symbolu i jego elementu członkowskiego, czyli pola lub właściwości, w tej samej instrukcji nie jest zalecane. Nie jest jasne, czy dostęp do elementu członkowskiego miał używać starej wartości symbolu przed przypisaniem lub nowej wartości z przypisania w tej instrukcji. |
CA2247: Argument przekazany do konstruktora TaskCompletionSource powinien mieć wyliczenie TaskCreationOptions zamiast wyliczenia TaskContinuationOptions. | Element TaskCompletionSource zawiera konstruktory, które przyjmują obiekty TaskCreationOptions kontrolujące bazowe zadanie, oraz konstruktory, które przyjmują stan obiektu przechowywany w zadaniu. Przypadkowe przekazanie elementu TaskContinuationOptions zamiast taskCreationOptions spowoduje wywołanie traktujące opcje jako stan. |
CA2248: Podaj poprawny argument wyliczenia do enum.HasFlag | Typ wyliczenia przekazany jako argument do HasFlag wywołania metody różni się od typu wyliczenia wywołującego. |
CA2249: Rozważ użycie ciągu.Contains zamiast String.IndexOf | Wywołania metody , w string.IndexOf której wynik jest używany do sprawdzania obecności/braku podciągów, można zastąpić ciągiem 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 za pośrednictwem String.Equals String.Compare |
Jest to zarówno jaśniejsze, jak i prawdopodobnie szybsze, String.Equals zamiast porównywać wynik z String.Compare zera. |
CA2252: Wyrażanie zgody na funkcje w wersji zapoznawczej | Wybierz 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 elementy członkowskie zadeklarowane w interfejsach nadrzędnych muszą mieć implementację w interfejsie atrybutu DynamicInterfaceCastableImplementation | Typy przypisywane za pomocą DynamicInterfaceCastableImplementationAttribute funkcji działają jako implementacja interfejsu dla typu, który implementuje IDynamicInterfaceCastable typ. W związku z tym musi zapewnić implementację wszystkich elementów członkowskich zdefiniowanych w odziedziczonych interfejsach, ponieważ typ implementujący IDynamicInterfaceCastable nie dostarczy ich w przeciwnym razie. |
CA2257: Składowe zdefiniowane w interfejsie z elementem "DynamicInterfaceCastableImplementationAttribute" powinny być "statyczne" | Ponieważ typ implementujący IDynamicInterfaceCastable może nie implementować interfejsu dynamicznego w metadanych, wywołania elementu członkowskiego interfejsu wystąpienia, który nie jest jawną implementacją zdefiniowaną na tym typie, mogą zakończyć się niepowodzeniem w czasie wykonywania. Oznacz nowe elementy członkowskie static interfejsu, aby uniknąć błędów czasu wykonywania. |
CA2258: Udostępnianie interfejsu "DynamicInterfaceCastableImplementation" w Visual Basic nie jest obsługiwane | Zapewnienie funkcjonalnego DynamicInterfaceCastableImplementationAttribute interfejsu przypisywanego wymaga funkcji Domyślne elementy członkowskie interfejsu, która nie jest obsługiwana w języku Visual Basic. |
CA2259: Upewnij się ThreadStatic , że jest używana tylko z polami statycznymi |
ThreadStaticAttribute dotyczy static tylko pól (Shared w Visual Basic). Po zastosowaniu do pól wystąpienia atrybut nie ma wpływu na zachowanie. |
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 z ConfigureAwaitOptions.SuppressThrowing Task<TResult> |
Ta ConfigureAwaitOptions.SuppressThrowing opcja nie jest obsługiwana przez ogólny Task<TResult> element , ponieważ może to prowadzić do zwrócenia nieprawidłowego TResult elementu . |
CA2262: Ustaw MaxResponseHeadersLength poprawnie |
Upewnij się, że wartość jest podana MaxResponseHeadersLength poprawnie. Ta wartość jest mierzona w kilobajtach. |
CA2263: Preferuj przeciążenie ogólne, gdy typ jest znany | Użycie przeciążenia ogólnego jest preferowane, aby przekazać System.Type argument, gdy typ jest znany, ponieważ promują czystszy i bardziej bezpieczny kod z ulepszonym sprawdzaniem czasu kompilacji. |
CA2264: Nie przekazuj wartości innej niż null do wartości "ArgumentNullException.ThrowIfNull" | Błąd "ArgumentNullException.ThrowIfNull" zgłasza, gdy przekazany argument ma wartość null. Niektóre konstrukcje, takie jak struktury niepuste, a wyrażenia "nameof()" i "new" nigdy nie mają wartości null, więc wyrażenie "ArgumentNullException.ThrowIfNull" nigdy nie zostanie rzucone. |
CA2265: Nie należy porównywać Span<T> z null lub default |
Porównywanie zakresu z null lub default może nie robić tego, co zamierzasz.
default
null literał jest niejawnie konwertowany na Span<T>.Empty . |
CA2300: Nie używaj niezabezpieczonego deserializatora BinaryFormatter | Niezabezpieczone deserializatory są podatne na 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 uprzedniego ustawienia BinaryFormatter.Binder | Niezabezpieczone deserializatory są podatne na 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 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 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 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 pierwszego ustawienia NetDataContractSerializer.Binder | Niezabezpieczone deserializatory są podatne na 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 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 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 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 deserializacji upewnij się, że parametr JavaScriptSerializer nie został zainicjowany za pomocą parametru SimpleTypeResolver | Niezabezpieczone deserializatory są podatne na 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 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 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 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 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 deserializatory są podatne na 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 elementu 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: Niebezpieczny element DataSet lub DataTable w typie z możliwością serializacji może być narażony na ataki zdalnego wykonywania 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 obiektu może być narażony na atak zdalnego wykonywania kodu | Deserializowanie za pomocą serializowanego System.Runtime.Serialization.IFormatter , a graf obiektu typu rzutowanego może zawierać element DataSet lub DataTable. |
CA2355: Niebezpieczny element DataSet lub DataTable w deserializowanym grafie obiektu | Deserializowanie, gdy graf obiektu rzutowanego lub określonego typu może zawierać element DataSet lub DataTable. |
CA2356: Niebezpieczny element DataSet lub DataTable w internetowym deserializowanym grafie obiektów | 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 element DataSet lub DataTable w automatycznie wygenerowanym typie serializowalnym może być narażony na ataki zdalnego wykonywania kodu | W przypadku deserializacji niezaufanych danych wejściowych za pomocą BinaryFormatter polecenia , a deserializowany graf obiektu zawiera DataSet element lub DataTable, osoba atakująca może utworzyć złośliwy ładunek w celu przeprowadzenia zdalnego ataku na wykonywanie kodu. |
CA3001: Przegląd kodu pod kątem luk w zabezpieczeniach polegających na wstrzyknięciu kodu SQL | Podczas pracy z niezaufanymi poleceniami wejściowymi i sql należy pamiętać o atakach polegających na wstrzyknięciu 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: Przegląd kodu pod kątem luk w zabezpieczeniach polegających na wstrzyknięciu ś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). Osoba atakująca może potencjalnie uruchamiać złośliwe instrukcje LDAP względem katalogów informacji. 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: Przegląd kodu pod kątem luk w zabezpieczeniach otwierania przekierowania | Podczas pracy z niezaufanymi danymi wejściowymi należy pamiętać o otwartych lukach w zabezpieczeniach przekierowania. Osoba atakująca może wykorzystać otwartą lukę w zabezpieczeniach przekierowania, aby użyć witryny internetowej w celu utworzenia prawidłowego adresu URL, ale przekierowuje nie podejrzewającego gościa do wyłudzania informacji lub innej złośliwej strony internetowej. |
CA3008: Przegląd kodu pod kątem luk w zabezpieczeniach polegających na wstrzyknięciu kodu 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: Przegląd kodu pod kątem luk w zabezpieczeniach polegających na wstrzyknięciu wyrażeń regularnych | Podczas pracy z niezaufanymi danymi wejściowymi należy pamiętać o atakach polegających na wstrzyknięciu wyrażeń regularnych. Osoba atakująca może użyć iniekcji wyrażeń regularnych w celu złośliwego zmodyfikowania wyrażenia regularnego w celu dopasowania wyrażenia regularnego do niezamierzonych wyników lub nadmiernego użycia wyrażeń regularnych przez wyrażenie regularne, co spowoduje atak typu "odmowa usługi". |
CA3061: Nie dodawaj schematu według adresu URL | Nie używaj niebezpiecznego przeciążenia metody Add, ponieważ może to spowodować niebezpieczne odwołania 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 | W przypadku wykonywania rozszerzalnych przekształceń języka arkusza stylów (XSLT) w aplikacjach platformy .NET niezabezpieczony procesor może rozpoznać niezaufane odwołania identyfikatora URI, które mogą ujawnić poufne informacje osobom atakującym, co prowadzi do ataków typu "odmowa usługi" i "między witrynami". |
CA3077: Niezabezpieczone przetwarzanie w elemencie Design interfejsu API, dokumencie XML i czytniku tekstu dla kodu XML | Podczas projektowania interfejsu API pochodzącego z elementów XMLDocument i XMLTextReader należy pamiętać o przetwarzaniu dtdprocessingu. Używanie niezabezpieczonych wystąpień DTDProcessing podczas odwoływania się do źródeł jednostki zewnętrznej lub określania niezabezpieczonych wartości w kodzie 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 z żądaniem fałszerzowania między witrynami może wysyłać złośliwe żądania od uwierzytelnionego użytkownika do kontrolera MVC ASP.NET. |
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 serverCertificateValidationCallback zawsze zwraca true wartość , każdy certyfikat przejdzie walidację. |
CA5360: Nie należy wywoływać niebezpiecznych metod w deserializacji | Niezabezpieczona deserializacji jest luką w zabezpieczeniach, która występuje, gdy niezaufane dane są używane do nadużywania logiki aplikacji, spowodowania ataku typu "odmowa usługi" (DoS), a nawet wykonania dowolnego kodu podczas deserializacji. 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 należy wywołać niebezpieczne metody w procesie deserializacji. Pomyślne niezabezpieczone ataki deserializacji mogą umożliwić atakującemu przeprowadzenie ataków, takich jak ataki DoS, obejścia uwierzytelniania i zdalne wykonywanie kodu. |
CA5361: Nie wyłączaj używania silnej kryptografii Schannel | Ustawienie Switch.System.Net.DontEnableSchUseStrongCrypto w celu true osłabienia kryptografii używanej w wychodzących połączeniach protokołu Transport Layer Security (TLS). Słabsza kryptografia może naruszyć poufność komunikacji między aplikacją a serwerem, co ułatwia osobom atakującym podsłuchiwanie poufnych danych. |
CA5362: Potencjalny cykl odniesienia w deserializowanym grafie obiektu | Jeśli deserializowanie niezaufanych danych, każdy kod przetwarzający deserializowany graf obiektu musi obsługiwać cykle odwołań bez przechodzenia do nieskończonych pętli. 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ń | Protokół TRANSPORT Layer Security (TLS) zabezpiecza komunikację między komputerami, najczęściej z protokołem Secure (HTTPS) funkcji Hypertext Transfer Protocol. 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łówka HTTP umożliwia kodowanie znaków powrotu karetki i znaków nowego wiersza, \r i \n, które znajdują się w nagłówkach odpowiedzi. To kodowanie może pomóc uniknąć ataków polegających na wstrzyknięciu, które wykorzystują aplikację, która echem niezaufanych danych zawartych w nagłówku. |
CA5366: Użyj elementu XmlReader dla elementu DataSet Read XML | 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źnika | Ta reguła sprawdza, czy istnieje klasa z możliwością serializacji z polem wskaźnika lub właściwością. Elementy członkowskie, których nie można serializować, mogą być wskaźnikiem, takim jak statyczne elementy członkowskie lub pola oznaczone znakiem NonSerializedAttribute. |
CA5368: Ustaw właściwość ViewStateUserKey dla klas pochodnych ze strony | Ustawienie właściwości może pomóc w zapobieganiu ViewStateUserKey atakom na aplikację, umożliwiając przypisanie identyfikatora do zmiennej stanu widoku dla poszczególnych użytkowników, aby osoby atakujące nie mogły użyć zmiennej do wygenerowania ataku. W przeciwnym razie wystąpią luki w zabezpieczeniach fałszerzowania żądań między witrynami. |
CA5369: Użyj elementu XmlReader do deserializacji | Przetwarzanie niezaufanych schematów DTD i XML może umożliwić ładowanie niebezpiecznych odwołań zewnętrznych, które powinny być ograniczone przy użyciu klasy XmlReader z bezpiecznym rozpoznawaniem lub z wyłączonym przetwarzaniem schematu wbudowanego DTD i XML. |
CA5370: Użyj elementu XmlReader do sprawdzania poprawności czytnika | Przetwarzanie niezaufanych schematów DTD i XML może umożliwić ładowanie niebezpiecznych odwołań zewnętrznych. To niebezpieczne ładowanie może być ograniczone przy użyciu elementu XmlReader z bezpiecznym rozpoznawaniem nazw lub z wyłączonym przetwarzaniem schematu wbudowanego DTD i XML. |
CA5371: Odczyt schematu przy użyciu elementu XmlReader | Przetwarzanie niezaufanych schematów DTD i XML może umożliwić ładowanie niebezpiecznych odwołań zewnętrznych. Użycie elementu XmlReader z bezpiecznym modułem rozpoznawania nazw lub z wyłączonym przetwarzaniem schematu wbudowanego DTD i XML ogranicza to. |
CA5372: Użyj elementu XmlReader dla elementu XPathDocument | Przetwarzanie kodu XML z niezaufanych danych może ładować niebezpieczne odwołania zewnętrzne, które można ograniczyć przy użyciu elementu XmlReader z bezpiecznym modułem rozpoznawania lub wyłączonym przetwarzaniem DTD. |
CA5373: Nie używaj przestarzałej funkcji wyprowadzania kluczy | Ta reguła wykrywa wywołanie metod wyprowadzania System.Security.Cryptography.PasswordDeriveBytes słabych kluczy i Rfc2898DeriveBytes.CryptDeriveKey .
System.Security.Cryptography.PasswordDeriveBytes użyto słabego algorytmu PBKDF1. |
CA5374: Nie używaj XslTransform | Ta reguła sprawdza, czy System.Xml.Xsl.XslTransform wystąpienie jest tworzone w kodzie. 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 go otrzymają, twoje konto magazynu zostanie łatwo naruszone. |
CA5376: Użyj funkcji SharedAccessProtocol HttpsOnly | Sygnatura dostępu współdzielonego to poufne dane, których nie można transportować w postaci zwykłego tekstu w protokole 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 elementu ServicePointManagerSecurityProtocols | Ustawienie Switch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols w celu true ograniczenia połączeń protokołu Transport Layer Security (TLS) programu Windows Communication Framework (WCF) z użyciem 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 . Należy określić algorytm skrótu do użycia w niektórych przeciążeniach konstruktora z SHA256 lub wyższym. Należy pamiętać, że HashAlgorithm właściwość ma tylko metodę get dostępu i nie ma overridden modyfikatora. |
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 | Protokół TRANSPORT Layer Security (TLS) zabezpiecza komunikację między komputerami, najczęściej z protokołem Secure (HTTPS) funkcji Hypertext Transfer Protocol. 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 upewnić się, że aplikacja pozostaje bezpieczna, należy unikać kodowania wersji protokołu i docelowej co najmniej programu .NET Framework w wersji 4.7.1. |
CA5387: Nie używaj funkcji wyprowadzania słabego klucza z niewystarczającą liczbą iteracji | Ta reguła sprawdza, czy klucz kryptograficzny został wygenerowany za pomocą Rfc2898DeriveBytes liczby 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 funkcji wyprowadzania słabego klucza | Ta reguła sprawdza, czy klucz kryptograficzny został wygenerowany za pomocą Rfc2898DeriveBytes liczby 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 w przypadku skompilowanych plików binarnych można łatwo wyodrębnić złośliwych użytkowników. 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 POST żądania , PUT , PATCH lub DELETE bez weryfikowania tokenu chroniącego przed fałszowaniem może być podatna na ataki fałszerskie żądania obejmujące wiele witryn. Atak z żądaniem fałszerzowania między witrynami może wysyłać złośliwe żądania od uwierzytelnionego użytkownika do kontrolera MVC platformy ASP.NET Core. |
CA5392: Użyj atrybutu DefaultDllImportSearchPaths dla parametrów P/Invoke | Domyślnie funkcje P/Invoke korzystające z DllImportAttribute sondowania wielu katalogów, w tym bieżącego katalogu roboczego do załadowania biblioteki. 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: Miss HttpVerb atrybut dla metod akcji | Wszystkie metody akcji, które tworzą, edytują, usuwają lub w inny sposób modyfikują dane, muszą być chronione za pomocą atrybutu ochrony przed fałszerzacją żądania między witrynami. 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 | Protokół TRANSPORT Layer Security (TLS) zabezpiecza komunikację między komputerami, najczęściej z protokołem Secure (HTTPS) funkcji Hypertext Transfer Protocol. 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 | Protokół TRANSPORT Layer Security (TLS) zabezpiecza komunikację między komputerami, najczęściej z protokołem Secure (HTTPS) funkcji Hypertext Transfer Protocol. 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ż 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ż 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 polecenia CreateEncryptor z inną niż domyślną IV | Szyfrowanie symetryczne powinno zawsze używać nie powtarzalnego wektora inicjalizacji, aby zapobiec atakom słownikowym. |
CA5402: Użyj polecenia CreateEncryptor z domyślnym iv | Szyfrowanie symetryczne powinno zawsze używać nie powtarzalnego wektora inicjalizacji, aby zapobiec atakom słownikowym. |
CA5403: Nie należy kodzie certyfikatu | Parametr data lub rawData X509CertificateX509Certificate2 konstruktora jest zakodowany w kodzie twardym. |
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 walidację tokenu w delegatach | Wywołanie zwrotne przypisane do metody AudienceValidator lub LifetimeValidator zawsze zwraca wartość true . |
IL3000: Unikaj uzyskiwania dostępu do ścieżki pliku zestawu podczas publikowania jako pojedynczego pliku | Unikaj uzyskiwania dostępu do ścieżki pliku zestawu podczas publikowania jako pojedynczego pliku. |
IL3001: Unikaj uzyskiwania dostępu do ścieżki pliku zestawu podczas publikowania jako pojedynczego pliku | Unikaj uzyskiwania dostępu do ścieżki pliku zestawu podczas publikowania jako 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 jako pojedynczego pliku |
IL3003: adnotacje "RequiresAssemblyFilesAttribute" muszą być zgodne ze wszystkimi implementacjami interfejsu lub przesłonięciami. | Adnotacje "RequiresAssemblyFilesAttribute" muszą być zgodne ze wszystkimi implementacjami interfejsu lub przesłonięciami. |
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. |
Legenda
W poniższej tabeli przedstawiono typ informacji podanych dla każdej reguły w dokumentacji referencyjnej.
Produkt | opis |
---|---|
Type | TypeName reguły. |
Identyfikator reguły | Unikatowy identyfikator reguły. RuleId i Category są używane do pomijania w źródle ostrzeżenia. |
Kategoria | Kategoria reguły, na przykład zabezpieczenia. |
Poprawka powodująca niezgodność lub niezgodność | 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ść". |
Przyczyna | Określony kod zarządzany, który powoduje wygenerowanie ostrzeżenia przez regułę. |
opis | 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 bezpieczne jest pomijanie ostrzeżenia z reguły. |
Przykładowy kod | Przykłady naruszające regułę i poprawione przykłady spełniające regułę. |
Powiązane reguły | Powiązane reguły. |
Współpracuj z nami w serwisie GitHub
Źródło tej zawartości można znaleźć w witrynie GitHub, gdzie można również tworzyć i przeglądać problemy i żądania ściągnięcia. Więcej informacji znajdziesz w naszym przewodniku dla współtwórców.