程式碼品質規則
.NET 程式代碼分析提供旨在改善程式碼質量的規則。 規則會分為幾種領域,例如設計、全球化、效能與安全性。 某些規則專屬於 .NET API 使用方式,而其他規則則與一般程式代碼質量有關。
規則的索引
下表列出程式碼品質分析規則。
規則識別碼和警告 | 描述 |
---|---|
CA1000:不要在泛型類型上宣告靜態成員 | 呼叫泛型類型的靜態成員時,必須為類型指定類型引數。 呼叫不支援介面的泛型執行個體 (Instance) 成員時,必須為成員指定類型引數。 在上述兩種情況下,指定型別引數的語法不同且容易混淆。 |
CA1001:具有可處置欄位的類型應該為可處置 | 類別會宣告及實作類型為 System.IDisposable 的執行個體欄位,且該類別不會實作 IDisposable。 宣告 IDisposable 欄位的類別會間接擁有 Unmanaged 資源,且應實作 IDisposable 介面。 |
CA1002:不要公開泛型清單 | System.Collections.Generic.List<(Of <(T>)>) 是專為效能而非繼承所設計的泛型集合。 因此,List 不包含任何虛擬成員。 應該改為公開專為繼承所設計的泛型集合。 |
CA1003:使用一般事件處理常式執行個體 | 類型包含傳回 void 的委派,其簽章包含兩個參數(第一個是物件,第二個是可指派給 EventArgs 的類型),以及包含的元件目標Microsoft .NET Framework 2.0。 |
CA1005:避免在泛型類型上包含過多參數 | 泛型類型所包含的類型參數越多,就越難了解並記住每個類型參數所代表的含意。 若是只包含一種型別參數 (如 List<T>),以及包含兩個型別參數的某些特定情況 (如 Dictionary<TKey, TValue>),這些通常都清楚易懂。 不過,如果存在兩個以上的類型參數,則對大多數使用者而言都會變得難以理解。 |
CA1008:列舉值中應該要有值為零的成員 | 如同其他實值類型一般,未初始化的列舉其預設值為零。 非旗標屬性的列舉應該要使用零值來定義成員,讓預設值成為列舉的有效值。 如果已套用 FlagsAttribute 屬性的列舉定義零值成員,則其名稱應該是 "None",以表示列舉中未設定任何值。 |
CA1010:集合應該實作泛型介面 | 若要放寬集合的可用性,請實作其中一個泛型集合介面。 接著,使用該集合填入泛型集合類型。 |
CA1012:抽象類型不應該有公用建構函式 | 只有衍生類型 (Derived Type) 可以呼叫抽象類型上的建構函式。 因為公用建構函式會建立類型的執行個體,而且您無法建立抽象類型的執行個體,因此具有公用建構函式的抽象類型設計不正確。 |
CA1014:組件必須標記 CLSCompliantAttribute | Common Language Specification (CLS) 會定義命名限制、資料類型及組件必須遵守的規則 (如果組件會使用於跨程式設計語言時)。 良好的設計會要求所有組件使用 CLSCompliantAttribute 明確表示 CLS 符合性。 如果這個屬性未出現於組件中,則表示組件不符合標準。 |
CA1016:組件必須標記 AssemblyVersionAttribute | .NET 會使用版本號碼來唯一識別元件,並系結至強名稱元件中的類型。 版本號碼會與版本和發行者 (Publisher) 原則一起使用。 應用程式預設只會與建置它們的組件版本一起執行。 |
CA1017:組件必須標記 ComVisibleAttribute | ComVisibleAttribute 會判斷 COM 用戶端如何存取 Managed 程式碼。 良好的設計會要求組件明確表示 COM 的可視性。 COM 的可視性可以針對整個組件進行設定,然後針對個別類型及類型成員進行覆寫。 如果這個屬性不存在,則 COM 用戶端可以看到組件的內容。 |
CA1018:必須以 AttributeUsageAttribute 標記屬性 | 當您定義自訂屬性時,請使用 AttributeUsageAttribute 標記它,以指出可以在原始程式碼的哪個位置套用自訂屬性。 屬性的意義和預期的用法將決定它在程式碼中的有效位置。 |
CA1019:定義屬性引數的存取子 | 屬性可以定義必須在將屬性套用至目標時指定的強制引數。 這些引數也稱為位置引數,因為它們會當做位置參數提供給屬性建構函式。 對於每個強制引數而言,屬性 (Attribute) 還須提供對應的唯讀屬性 (Property),才可以在執行時期擷取引數值。 屬性也可以定義選擇性引數,也稱為具名引數。 這些引數會依照名稱提供給屬性 (Attribute) 建構函式,且必須有對應的讀取/寫入屬性 (Property)。 |
CA1021:避免使用 out 參數 | 以傳址方式傳遞類型時 (使用 out 或 ref),您需要擁有使用指標的經驗、了解實值類型和參考類型之間的差異,並處理具有多個傳回值的方法。 此外,out 和 ref 參數之間的差異一般人不甚了解。 |
CA1024:建議在適當時使用屬性 | 公用或保護的方法具有以 "Get" 開頭的名稱,該名稱不採用任何參數並且會傳回不是陣列的值。 此方法可能是成為屬性的不錯候選者。 |
CA1027:必須以 FlagsAttribute 標記列舉 | 列舉類型是一種實值類型 (Value Type),用以定義一組相關的具名常數。 當列舉的具名常數可以有意義地加以結合時,會將 FlagsAttribute 套用至此列舉。 |
CA1028:列舉儲存區應該是 Int32 | 列舉類型是一種實值類型 (Value Type),用以定義一組相關的具名常數。 根據預設,System.Int32 資料類型會用於儲存常數值。 雖然您可以變更這個基礎類型,但是大多數情節中仍不需要或不建議進行變更。 |
CA1030:建議在適當時使用事件 | 此規則會偵測具有事件常用名稱的方法。 如果方法因回應清楚定義的狀態變更而被呼叫,應該由事件處理常式叫用該方法。 呼叫方法的物件應該要引發事件,而不是直接呼叫方法。 |
CA1031:不要攔截一般例外狀況類型 | 不應該攔截一般例外狀況。 請攔截較明確的例外狀況,或重新擲回一般例外狀況當做 catch 區塊中的最後一個陳述式。 |
CA1032:必須實作標準例外狀況建構函式 | 無法提供整組的建構函式會導致難以正確地處理例外狀況。 |
CA1033:介面方法應該要可以由子類型呼叫 | 非密封外部可見的類型會提供公用介面的明確方法實作,但未提供同名的替代外部可見方法。 |
CA1034:巢狀類型不應該為可見的 | 巢狀類型是在其他類型範圍內宣告的類型。 巢狀類型可用來封裝包含類型 (Containing Type) 私用的 (Private) 實作細節。 因為有這樣的用途,所以巢狀類型不應為外部可見的。 |
CA1036:必須在 Comparable 類型中覆寫方法 | 公用或受保護的類型實作 System.IComparable 介面。 它不會覆寫 Object.Equals,也不會多載等號、不等、小於或大於的語言特定比較運算子。 |
CA1040:避免使用空的介面 | 介面是用來定義一組可提供行為或程式使用合約的成員。 不論類型出現在繼承階層架構 (Inheritance Hierarchy) 中的何處,任何類型都可以採用介面所描述的功能。 類型會實作介面,方法是提供介面成員的實作。 空白介面不會定義任何成員,因此也不會定義能夠實作的合約。 |
CA1041:必須提供 ObsoleteAttribute 訊息 | 類型或成員是使用並未指定其 ObsoleteAttribute.Message 屬性 (Property) 的 System.ObsoleteAttribute 屬性 (Attribute) 來標記。 編譯使用 ObsoleteAttribute 來標記的類型或成員之後,會顯示屬性 (Attribute) 的 Message 屬性 (Property), 以便提供使用者有關過時類型或成員的資訊。 |
CA1043:必須針對索引子使用整數或字串引數 | 索引子 (也就是索引的屬性) 應該使用整數類型或字串類型的索引。 這些類型通常會用於資料結構的索引,可以提升程式庫的可用性。 Object 類型的使用應限制於無法在設計階段指定特定整數類型或字串類型的情況。 |
CA1044:屬性不應該為唯寫的 | 雖然它是可接受並經常需要具有唯讀屬性,設計方針會禁止使用唯寫屬性的屬性。 這是因為讓使用者,設定一個值,然後防止使用者檢視值並不會提供任何安全性。 同時,如果沒有讀取權限,則無法檢視共用物件的狀態,進而限制這些物件的使用性。 |
CA1045:不要以傳址方式傳遞類型 | 以傳址方式傳遞類型時 (使用 out 或 ref),您需要擁有使用指標的經驗、了解實值類型和參考類型之間的差異,並處理具有多個傳回值的方法。 目標為一般使用者的程式庫架構設計人員不應預期使用者會熟練地運用 out 或 ref 參數。 |
CA1046:不要多載參考類型上的等號比較運算子 | 對參考類型而言,等號比較運算子的預設實作 (Implementation) 永遠都是正確的。 根據預設,只有當兩項參考都指向相同物件時才會相等。 |
CA1047:不要在密封類型中宣告 protected 成員 | 類型會宣告 protected 成員,如此繼承的類型即可存取或覆寫成員。 根據定義,密封類型無法被繼承,這表示無法呼叫密封類型上的受保護方法。 |
CA1050:類型必須在命名空間中宣告 | 類型會在命名空間之內宣告以防止名稱衝突,而且可當做組織物件階層架構中相關類型的一種方法。 |
CA1051:不要宣告可見的執行個體欄位 | 欄位的主要用法應該是當做實作詳細資料。 欄位應該是私用或內部的,而且應使用屬性公開。 |
CA1052:靜態預留位置類型應該為密封的 | 公用或受保護的類型只包含靜態成員,因此不會利用 sealed (C# 參考) (NotInheritable) 修飾詞宣告它們。 預定不會繼承的類型應該使用 sealed 修飾詞來標記,以禁止使用它做為基底類型。 |
CA1053:靜態預留位置類型不應該包含建構函式 | 公用或巢狀公用類型只宣告靜態成員,而且具有公用或保護的預設建構函式。 建構函式不是必要的,因為呼叫靜態成員不需類型的執行個體。 為了安全,字串多載應該使用字串引數來呼叫統一資源識別項 (URI) 多載。 |
CA1054:URI 參數不應該為字串 | 如果方法使用 URI 字串表示,應該提供採用 URI 類別的對應多載,這樣就可以透過安全的方式提供這些服務。 |
CA1055:URI 傳回值不應該為字串 | 這項規則假設方法會傳回 URI。 URI 的字串表示方式容易發生剖析和編碼錯誤,並且可能因此產生安全性弱點。 System.Uri 類別以安全的方式提供這些服務。 |
CA1056:URI 屬性不應該為字串 | 此規則假設屬性代表統一資源識別元 (URI)。 URI 的字串表示方式容易發生剖析和編碼錯誤,並且可能因此產生安全性弱點。 System.Uri 類別以安全的方式提供這些服務。 |
CA1058:類型不應該擴充特定基底類型 | 外部可見的類型會延伸某些基底類型 (Base Type)。 請使用其他作法。 |
CA1060:將 P/Invokes 移到 NativeMethods 類別 | 平台叫用方法 (例如使用 System.Runtime.InteropServices.DllImportAttribute 屬性標記的方法,或在 Visual Basic 中使用 Declare 關鍵字定義的方法) 都會存取非受控程式碼。 這些方法應該是 NativeMethods、SafeNativeMethods 或 UnsafeNativeMethods 類別。 |
CA1061:不要隱藏基底類別方法 | 只有在衍生方法的參數簽章因類型衍生時比基底方法參數簽章中的類型還要弱時,基底類型中的方法才會被衍生類型中的相同具名方法所隱藏。 |
CA1062:必須驗證公用方法的引數 | 所有傳遞至外部可見方法的參考引數都應經過 null 檢查。 |
CA1063:必須正確實作 IDisposable | 所有的 IDisposable 類型都需正確地實作 Dispose 模式。 |
CA1064:例外狀況必須是公用 | 內部例外狀況只會在自己的內部範圍內顯示。 當例外狀況超出內部範圍後,只能使用基本例外狀況來攔截例外狀況。 如果內部例外狀況是繼承自 Exception、SystemException 或 ApplicationException,外部程式碼就沒有足夠的資訊可以知道應該如何處理此例外狀況。 |
CA1065:不要在非預期的位置中引發例外狀況 | 不可擲回例外狀況 (Exception) 的方法卻擲回例外狀況。 |
CA1066:覆寫 Equals 時實作 IEquatable | 實值型別會覆寫 Equals 方法,但不會實作 IEquatable<T>。 |
CA1067:實作 IEquatable 時覆寫 Equals | 型別會實作 IEquatable<T>,但不會覆寫 Equals 方法。 |
CA1068:CancellationToken 參數必須位於最後 | 方法具有不是最後一個參數的 CancellationToken 參數。 |
CA1069:列舉不能有重複的值 | 列舉具有多個明確指派相同常數值的成員。 |
CA1070:請勿將事件欄位宣告為 virtual | field-like event 已宣告為虛擬。 |
CA1200:請避免使用具有前置詞的 cref 標記 | 在 XML 文件標籤中的 cref 屬性表示「程式碼參考」。 它會指定標記的內部文字是程式碼項目,例如類型、方法或屬性。 避免搭配前置詞使用 cref 標籤,因為其會讓編譯器無法驗證參考。 其也會讓 Visual Studio 整合式開發環境 (IDE) 無法在重構期間尋找及更新這些符號參考。 |
CA1303:不要將常值當作已當地語系化的參數傳遞 | 外部可見的方法會將字串常值當做參數傳遞至 .NET 建構函式或方法,而且該字串應可當地語系化。 |
CA1304:必須指定 CultureInfo | 方法或建構函式會呼叫具有接受 System.Globalization.CultureInfo 參數之多載的成員,且方法或建構函式未呼叫採用 CultureInfo 參數的多載。 未提供 CultureInfo 或 System.IFormatProvider 物件時,多載成員所提供的預設值可能不會有您希望在所有地區設定中都有的效果。 |
CA1305:必須指定 IFormatProvider | 方法或建構函式所呼叫的一個或多個成員具有可接受 System.IFormatProvider 參數的多載,但該方法或建構函式並未呼叫可接受 IFormatProvider 參數的多載。 未提供 System.Globalization.CultureInfo 或 IFormatProvider 物件時,多載成員所提供的預設值可能不會有您希望在所有地區設定中都有的效果。 |
CA1307:指定 StringComparison 以提升明確性 | 字串比較作業會使用未設定 StringComparison 參數的方法多載。 |
CA1308:必須將字串標準化為大寫字母 | 字串應該標準化為大寫字母。 當一小組的字元轉換成小寫字母時,它們無法構成來回行程。 |
CA1309:使用循序的 StringComparison | 非語言的字串比較作業未將 StringComparison 參數設定為 Ordinal 或 OrdinalIgnoreCase。 藉由明確地將參數設定為 StringComparison.Ordinal 或 StringComparison.OrdinalIgnoreCase,您的程式碼通常可以提升速度、更為正確,也更加可靠。 |
CA1310:指定 StringComparison 以提升正確性 | 字串比較作業會使用未設定 StringComparison 參數的方法多載,並預設使用特定文化特性 (Culture) 字串比較。 |
CA1311:指定文化或使用固定版本 | 指定文化特性 (Culture) 或使用不因文化特性而異,以避免在呼叫 ToUpper 或 ToLower 時隱含與目前文化特性 (Culture) 的相依性。 |
CA1401:不應顯示 P/Invokes | 公用型別中公用或保護的方法具有 System.Runtime.InteropServices.DllImportAttribute 屬性 (也會由 Visual Basic 中的 Declare 關鍵字實作)。 但不得公開 (Expose) 此類方法。 |
CA1416:驗證平台相容性 | 在元件上使用相依於平台的 API,會使程式碼無法繼續在所有平台上運作。 |
CA1417:請勿對 P/Invokes 的字串參數使用 OutAttribute |
使用 OutAttribute 以值方式傳遞的字串參數,可能會使執行階段不穩定 (如果該字串是暫留字串)。 |
CA1418:使用有效的平台字串 | 平台相容性分析器需要有效的平台名稱和版本。 |
CA1419:提供一種無參數的建構函式,與衍生自 'System.Runtime.InteropServices.SafeHandle' 之具體型別的包含型別一樣可見 | 提供一種無參數的建構函式,與衍生自 System.Runtime.InteropServices.SafeHandle 之型別的包含型別一樣可見,使用原始檔產生的 interop 解決方案可提高效能及使用量。 |
CA1420:屬性、型別或屬性需要執行階段封送處理 | 停用執行階段封送處理時,使用需要執行階段封送處理的功能會導致執行階段例外狀況。 |
CA1421:套用 'DisableRuntimeMarshallingAttribute ' 時,方法會使用執行階段封送處理 | 方法會使用執行階段封送處理,而且明確停用執行階段封送處理。 |
CA1422:驗證平台相容性 | 不建議從該 OS (版本) 連線的呼叫網站呼叫在指定 OS (版本) 中過時的 API。 |
CA1501:避免在物件間過度繼承 | 類型在其繼承階層架構 (Inheritance Hierarchy) 中超過四個層級的深度。 太深的巢狀類型階層架構可能會難以依循、了解和維護。 |
CA1502:避免造成過度複雜的方法 | 這個規則會測量整個方法中線性獨立路徑的數目,此數目是由條件分支的數目與複雜度決定。 |
CA1505:應避免撰寫無法維護的程式碼 | 類型或方法的維護性指標值很低。 維護性指標很低代表類型或方法很可能會難以維護,而應該列為需要重新設計的候選目標。 |
CA1506:應避免使用結合過度的類別 | 這個規則會測量類別的耦合,方法是計算類型或方法包含的唯一類型參考數目。 |
CA1507:使用 nameof 取代字串 | 字串常值會當做可使用 nameof 運算式的引數使用。 |
CA1508:避免使用無作用條件式程式碼 | 方法具有條件碼,該條件碼一律會在執行階段評估為 true 或 false 。 這會導致條件 false 分支中的無作用程式碼。 |
CA1509:程式碼度量設定檔中的項目無效 | 程式碼度量規則,例如 CA1501、CA1502、CA1505 和 CA1506,提供名為 CodeMetricsConfig.txt 且具有無效輸入的設定檔。 |
CA1510:使用 ArgumentNullException 擲回協助程式 | 擲回協助程式比 if 建構新例外狀況實例的區塊更簡單且更有效率。 |
CA1511:使用 ArgumentException 擲回協助程式 | 擲回協助程式比 if 建構新例外狀況實例的區塊更簡單且更有效率。 |
CA1512:使用 ArgumentOutOfRangeException 擲回協助程式 | 擲回協助程式比 if 建構新例外狀況實例的區塊更簡單且更有效率。 |
CA1513:使用 ObjectDisposedException 擲回協助程式 | 擲回協助程式比 if 建構新例外狀況實例的區塊更簡單且更有效率。 |
CA1514:避免重複長度自變數 | 當分割至字串或緩衝區結尾時,會使用備援長度自變數。 計算的長度可能會容易出錯,而且不必要。 |
CA1515:考慮讓公用型別成為內部 | 不同於類別庫,應用程式 API 通常不會公開參考,因此類型可以標示為內部。 |
CA1700:不要在列舉值名稱中包含 'Reserved' | 這項規則假設名稱中包含 "reserved" 的列舉成員目前並未使用,但是在未來版本會是重新命名或移除的替代符號 (Placeholder)。 重新命名或移除成員是中斷變更。 |
CA1707:識別項名稱不應該包含底線 | 根據慣例,識別項名稱不包含底線 (_) 字元。 此規則會檢查命名空間、類型、成員和參數。 |
CA1708:識別項名稱不應該只靠大小寫區別 | 因為以通用語言執行平台為目標的語言不需要區分大小寫,因此,命名空間、類型、成員和參數的識別項不能只有大小寫的不同。 |
CA1710:識別項應該使用正確的後置字元 | 依照慣例,擴充某些基底類型或實作某些介面的類型名稱,或從這些類型衍生的類型,都具有與基底類型或介面關聯的後置字元。 |
CA1711:識別項名稱不應該使用不正確的後置字元 | 依照慣例,只有擴充特定基底類型或實作特定介面的類型名稱,或是從這些類型衍生的類型名稱,應以特定保留的後置字元結尾。 其他類型名稱不得使用這些保留的後置字元。 |
CA1712:不要使用類型名稱作為列舉值的前置字元 | 因為開發工具應該提供類型資訊,所以列舉成員的名稱不能以類型名稱做為開頭。 |
CA1713:事件不應該有 before 或 after 前置字元 | 事件的名稱會以 "Before" 或 "After" 為開頭。 若要命名在特定序列 (Sequence) 中引發的相關事件,請使用現在式或過去式表示動作序列相對的位置。 |
CA1714:旗標列舉應該使用複數名稱 | 公用的列舉具有 System.FlagsAttribute 屬性,而且其名稱不能以 "s" 做結尾。 使用 FlagsAttribute 來標記的類型具有複數的名稱,因為這個屬性表示可以指定一個以上的值。 |
CA1715:識別項名稱應該使用正確的前置字元 | 外部可見介面的名稱沒有以大寫 "I" 開頭。 外部可見類型或方法上泛型型別參數的名稱沒有以大寫 "T" 開頭。 |
CA1716:識別項名稱不應該和關鍵字相符 | 命名空間 (Namespace) 名稱或類型名稱符合程式語言中的保留關鍵字。 命名空間和類型的識別項不應該符合語言所定義的關鍵字,而這些語言的目標為 Common Language Runtime。 |
CA1717:只有 FlagsAttribute 列舉應該使用複數名稱 | 依照命名規範的要求,列舉的複數名稱代表可以同時指定多個列舉值。 |
CA1720:識別項名稱不應該包含類型名稱 | 外部可見成員中的參數名稱包含資料類型名稱,或外部可見成員的名稱包含語言特定的資料類型名稱。 |
CA1721:屬性名稱不應該和其中有 get 的方法名稱相符 | 公用或保護之成員的名稱是以 "Get" 開頭,否則需符合公用或保護之屬性的名稱。 "Get" 方法和屬性的名稱應該清楚區別其功能。 |
CA1724:類型名稱不應該和命名空間相符 | 類型名稱不應符合 .NET 命名空間的名稱。 違反此規則會降低程式庫的可用性。 |
CA1725:參數名稱應該符合基底類型的宣告 | 在覆寫階層架構中一致的參數命名方式,會增加方法覆寫的可用性。 與基底宣告中的名稱不同之衍生方法中的參數名稱,可能會造成方法為基底方法的覆寫或為方法的新多載而混淆。 |
CA1727:將 PascalCase 用於已命名的預留位置 | 在記錄訊息範本中為命名的預留位置使用 PascalCase。 |
CA1801:必須檢閱未使用的參數 | 方法簽章包括不用於方法主體中的參數; |
CA1802:建議在適當時使用常值 | 欄位宣告為 static 和 read-only (在 Visual Basic 中為 Shared 和 ReadOnly),並使用編譯時間可計算的值進行初始化。 因為指派給目標欄位的值可在編譯時期進行計算,所以將宣告變更為 const (在 Visual Basic 中為 Const) 欄位,其值便可於編譯時期進行計算,而不是在執行階段計算。 |
CA1805:請勿進行非必要的初始化 | .NET 運行時間在執行建構函式之前,先將參考型別的所有欄位初始化為其預設值。 在大部分情況下,將欄位明確初始化為其預設值是多餘的,這會增加維護成本,並可能會降低效能(例如,隨著元件大小增加)。 |
CA1806:不要忽略方法的結果 | 已建立但從未使用新物件、已呼叫會建立並傳回新字串的方法,而新字串從未使用過,或者 COM 或 P/Invoke 方法傳回從未使用的 HRESULT 或錯誤碼。 |
CA1810:必須將參考類型內部的靜態欄位初始化 | 當類型宣告明確的靜態建構函式時,Just-In-Time (JIT) 編譯器會將檢查加入至類型的每個靜態方法和執行個體建構函式,確保之前已呼叫該靜態建構函式。 靜態建構函式檢查會降低效能。 |
CA1812:避免使用未執行個體化的內部類別 | 組件層級類型的執行個體不是由組件中的程式碼所建立。 |
CA1813:避免使用非密封屬性 | .NET 提供擷取自定義屬性的方法。 根據預設,這些方法會搜尋屬性繼承階層架構。 密封屬性會減少對整個繼承階層架構的搜尋,並且可以改進效能。 |
CA1814:建議使用不規則陣列取代多維陣列 | 不規則陣列是一種陣列,其元素也是陣列。 組成元素的陣列大小可以不相同,對於某些資料集而言較不會浪費空間。 |
CA1815:必須覆寫實值類型上的 Equals 方法和等號比較運算子 | 對於實值類型而言,Equals 的繼承實作會使用 Reflection 程式庫,並比較所有欄位的內容。 但是 Reflection 相當耗費運算資源,而且可能不需要比較每個欄位是否相等。 如果希望使用者比較或排序執行個體,或是使用執行個體做為雜湊資料表索引鍵,則您的實值類型應實作 Equals。 |
CA1816:正確呼叫 GC.SuppressFinalize | 屬於 Dispose 實作的方法不會呼叫 GC.SuppressFinalize,或不屬於 Dispose 實作的方法會呼叫 GC.SuppressFinalize,或呼叫 GC.SuppressFinalize 並傳遞非 this (在 Visual Basic 中為 Me) 的方法。 |
CA1819:屬性不應該傳回陣列 | 即使屬性是唯讀,所傳回的陣列不會是寫入保護。 若要保持陣列為防止遭他人修改,屬性必須傳回陣列複本。 一般而言,使用者不了解呼叫這類屬性所造成的不良效能影響。 |
CA1820:應該使用字串長度測試空白字串 | 使用 String.Length 屬性或 String.IsNullOrEmpty 方法比較字串,明顯地會比使用 Equals 還快。 |
CA1821:必須移除空的完成項 | 請盡可能避免使用完成項,因為追蹤物件存留期 (Lifetime) 時將會產生額外的效能負荷。 空白完成項只會增加額外負荷,而沒有任何好處。 |
CA1822:將成員標記為 static | 可以將不會存取執行個體資料或不會呼叫執行個體方法的成員,標記為 static (在 Visual Basic 中為 Shared)。 將方法標記為 static 之後,編譯器將對這些成員發出非虛擬呼叫位置。 這麼做可以讓重視效能的程式碼獲得可觀的效能。 |
CA1823:避免包含未使用的私用欄位 | 偵測到似乎不能在組件內存取的私用欄位。 |
CA1824:組件必須標記 NeutralResourcesLanguageAttribute | NeutralResourcesLanguage 屬性會告知資源管理員,用來顯示組件之中性文化特性 (Culture) 資源的語言。 這可改善載入第一個資源的查詢效能,而且可以減少您的工作集。 |
CA1825:請避免長度為零的陣列配置 | 初始化長度為零的陣列會導致不必要的記憶體配置。 請改為呼叫 Array.Empty,使用以靜態方式配置的空陣列執行個體。 會在此方法的所有叫用之間共用記憶體配置。 |
CA1826:請使用屬性,不要使用 Linq Enumerable 方法 | Enumerable LINQ 方法用於支援對等、更有效率屬性的型別。 |
CA1827:不要在可使用 Any 時使用 Count/LongCount | Count 或 LongCount 方法用於 Any 方法效率更高的地方。 |
CA1828:不要在可使用 AnyAsync 時使用 CountAsync/LongCountAsync | CountAsync 或 LongCountAsync 方法用於 AnyAsync 方法效率更高的地方。 |
CA1829:請使用 Length/Count 屬性,不要使用 Enumerable.Count 方法 |
Count LINQ 方法用於支援對等、更有效率 Length 或 Count 屬性的型別。 |
CA1830:建議在 StringBuilder 上使用強型別 Append 及 Insert 方法多載 | Append 和 Insert 會為 String 以外的多個型別提供多載。 可能的話,請使用強型別多載,而非使用 ToString () 和以字串為基礎的多載。 |
CA1831:在適用情況下,請使用 AsSpan 做為字串,不要使用範圍型的索引子 | 在字串上使用 range-indexer 並將值隱含指派給 ReadOnlySpan<char> 型別時,會使用方法 Substring,而不是 Slice,這會產生字串要求部分的複本。 |
CA1832:請使用 AsSpan 或 AsMemory 來取得陣列的 ReadOnlySpan 或 ReadOnlyMemory 部分,不要使用範圍型的索引子 | 在陣列上使用 range-indexer 並將值隱含指派給 ReadOnlySpan<T> 或 ReadOnlyMemory<T> 型別時,會使用方法 GetSubArray,而不是 Slice,這會產生陣列要求部分的複本。 |
CA1833:請使用 AsSpan 或 AsMemory 取得陣列的 Span 或 Memory 部分,不要使用範圍型的索引子 | 在陣列上使用 range-indexer 並將值隱含指派給 Span<T> 或 Memory<T> 型別時,會使用方法 GetSubArray,而不是 Slice,這會產生陣列要求部分的複本。 |
CA1834:針對單一字元字串使用 StringBuilder.Append(char) |
StringBuilder 具有接受 Append 做為其引數的 char 多載。 基於效能考量,建議呼叫 char 多載。 |
CA1835:建議針對 'ReadAsync' 和 'WriteAsync' 使用採用 'Memory' 的多載 | 'Stream' 的 'ReadAsync' 多載採用 'Memory<Byte>' 作為第一個引數,而 'WriteAsync' 多載則採用 'ReadOnlyMemory<Byte>' 做為第一個引數。 建議呼叫記憶體型多載,如此效率更高。 |
IsEmpty 可用時,建議使用 Count 而不是 |
建議使用比 IsEmpty 、Count 、Length 或 Count<TSource>(IEnumerable<TSource>) 更有效率的 LongCount<TSource>(IEnumerable<TSource>) 屬性來判斷物件是否包含任何項目。 |
CA1837:使用 Environment.ProcessId 而非 Process.GetCurrentProcess().Id |
Environment.ProcessId 比 Process.GetCurrentProcess().Id 更簡單快速。 |
CA1838:請避免對 P/Invoke 使用 StringBuilder 參數 |
封送處理 'StringBuilder' 一律都會建立原生緩衝區複本,因而導致單一封送處理作業出現多重配置。 |
CA1839:使用 'Environment.ProcessPath' 而非 'Process.GetCurrentProcess().MainModule.FileName |
Environment.ProcessPath 比 Process.GetCurrentProcess().MainModule.FileName 更簡單快速。 |
CA1840:使用 'Environment.CurrentManagedThreadId' 而非 'Thread.CurrentThread.ManagedThreadId |
Environment.CurrentManagedThreadId 比 Thread.CurrentThread.ManagedThreadId 更精簡有效率。 |
CA1841:建議使用 Dictionary.Contains 方法 | 在或集合上Contains 呼叫 Keys 可能會比呼叫 Values 或 ContainsKey ContainsValue 字典本身更昂貴。 |
CA1842:不要對單一工作使用 'WhenAll' | 搭配單一工作使用 WhenAll 可能會導致效能遺失。 請改為等候或傳回工作。 |
CA1843:不要對單一工作使用 'WaitAll' | 搭配單一工作使用 WaitAll 可能會導致效能遺失。 請改為等候或傳回工作。 |
CA1844:加入子類別 'Stream' 時,提供非同步方法的記憶體型覆寫 | 若要改善效能,請在加入子類別 'Stream' 時覆寫記憶體型的非同步方法。 然後,根據記憶體型方法實作陣列型方法。 |
CA1845:請使用範圍型的 'string.Concat' | 使用 AsSpan 和 string.Concat (而不是 Substring 和串連運算子) 的效率更高。 |
CA1846:建議使用 AsSpan ,而不是 Substring |
AsSpan 的效率比 Substring 更高。
Substring 會執行 O (n) 字串複製,而 AsSpan 不會執行且具有固定成本。
AsSpan 也不會執行任何堆積配置。 |
CA1847:請為單一字元查閱使用字元常值 | 搜尋單一字元時,請使用 String.Contains(char) 而不是 String.Contains(string) 。 |
CA1848:請使用 LoggerMessage 委派 | 為了提升效能,請使用 LoggerMessage 委派。 |
CA1849:在使用非同步方法時呼叫非同步方法 | 在已經非同步的方法中,對其他方法的呼叫應該是其非同步版本 (如果存在的話)。 |
CA1850:建議使用靜態 HashData 方法,而不是 ComputeHash |
使用靜態 HashData 方法比建立和管理 HashAlgorithm 執行個體來呼叫 ComputeHash 的效率更高。 |
CA1851:IEnumerable 集合的可能多個列舉 |
IEnumerable 集合的可能多個列舉。 請考慮使用可避免多個列舉的實作。 |
CA1852:密封內部型別 | 無法在組件外部存取,而且在內含組件內沒有子型別的型別則不會密封。 |
CA1853:不需要呼叫 'Dictionary.ContainsKey(key)' | 不需要使用 Dictionary.Remove(key) 來保護 Dictionary.ContainsKey(key) 。
Dictionary<TKey,TValue>.Remove(TKey) 已經檢查索引鍵是否存在,如果索引鍵不存在,則不會擲回。 |
CA1854:建議使用 'IDictionary.TryGetValue(TKey, out TValue)' 方法 | 建議使用 'TryGetValue' 而非受 'ContainsKey' 檢查所保護的字典索引子存取。 'ContainsKey' 和索引子都會查閱索引鍵,因此使用 'TryGetValue' 可避免額外的查閱。 |
CA1855:使用 Span<T>.Clear() 而非 Span<T>.Fill() | 呼叫 Span<T>.Clear() 比呼叫 Span<T>.Fill(T),以預設值填滿範圍元素的效率更高。 |
CA1856:ConstantExpected 屬性的用法不正確 | 屬性 ConstantExpectedAttribute 未正確套用至參數。 |
CA1857:此參數預計為常數以獲得最佳效能 | 無效的自變數會傳遞至以 ConstantExpectedAttribute標註的參數。 |
CA1858:使用 StartsWith 代替 IndexOf | 呼叫 String.StartsWith 比呼叫 String.IndexOf 以檢查字串是否以指定的前置詞開頭的效率更高。 |
CA1859:盡可能使用具體類型以改善效能 | 程序代碼會使用介面類型或抽象類型,導致不必要的介面呼叫或虛擬呼叫。 |
CA1860:避免使用 'Enumerable.Any ()' 擴充方法 | 使用 Length 、Count 或 IsEmpty (如果可能) 比呼叫 Enumerable.Any 來判斷集合型別是否有任何元素的效率更高且更清楚。 |
CA1861:避免常數數位作為自變數 | 傳遞為自變數的常數數位不會重複使用,這表示效能額外負荷。 請考慮將它們擷取至「靜態只讀」字段,以改善效能。 |
CA1862:使用 'StringComparison' 方法多載來執行不區分大小寫的字串比較 | 當程式代碼呼叫 ToLower() 或 ToUpper() 來執行不區分大小寫的字串比較時,會執行不必要的配置。 |
CA1863:使用 'CompositeFormat' | 若要降低格式設定成本,請快取 並使用 CompositeFormat 實例作為 或String.Format 的自變數StringBuilder.AppendFormat 。 |
CA1864:偏好 'IDictionary.TryAdd(TKey, TValue)' 方法 | 和 Dictionary<TKey,TValue>.ContainsKey(TKey) 都會Dictionary<TKey,TValue>.Add執行重複的查閱。 呼叫 會更有效率地呼叫 Dictionary<TKey,TValue>.TryAdd,它會傳回 bool ,指出是否新增值。
TryAdd 如果索引鍵已經存在,則不會覆寫索引鍵的值。 |
CA1865-CA1867:使用 char 多載 | char 多載是具有單一 char 之字串的較佳效能多載。 |
CA1868:對集合不必要呼叫 'Contains' | 和 ISet<T>.Add(T) 都會ICollection<T>.Remove(T)執行查閱,讓其事先呼叫ICollection<T>.Contains(T)變得備援。 呼叫或Add(T)直接呼叫Remove(T)會更有效率,它會傳回 Boolean 值,指出專案是否已新增或移除。 |
CA1869:快取並重複使用 'JsonSerializerOptions' 實例 | 如果您的程式代碼執行多次,使用的 JsonSerializerOptions 本機實例進行串行化或還原串行化,可能會大幅降低應用程式的效能,因為 System.Text.Json 會在內部將串行化相關元數據快取至提供的實例。 |
CA1870:使用快取的 'SearchValues' 實例 | 使用快取 SearchValues<T> 實例比直接將值傳遞至 'IndexOfAny' 或 'ContainsAny' 更有效率。 |
CA1871:請勿將可為 Null 的結構傳遞至 'ArgumentNullException.ThrowIfNull' | 'ArgumentNullException.ThrowIfNull' 接受 'object',因此傳遞可為 Null 的結構可能會導致 Boxed 值。 |
CA1872: 偏好 'Convert.ToHexString' 和 'Convert.ToHexStringLower',而不是以 'BitConverter.ToString' 為基礎的呼叫鏈 | 將位元組編碼為十六進位字串表示法時,請使用 Convert.ToHexString 或 Convert.ToHexStringLower 。 這些方法比搭配 使用 BitConverter.ToString 取代 String.Replace 破折號 和 String.ToLower更有效率且配置易用。 |
CA2000:必須在超出範圍前處置物件 | 因為可能會發生例外事件以防止執行物件的完成項,所以應在物件的所有參考都超出範圍之前,明確處置物件。 |
CA2002:不要鎖定具有弱式識別的物件 | 可以跨應用程式定義域範圍直接存取的物件,即所謂具有弱式識別的物件。 嘗試取得具有弱式識別之物件鎖定的執行緒,可以被不同應用程式定義域中具有相同物件鎖定的第二個執行緒所封鎖。 |
CA2007:不直接等候工作 | 非同步方法會直接等候Task。 當非同步方法直接等候 Task 時,接續會在建立工作的相同執行緒中發生。 此行為在效能方面的成本可能很高,而且可能會導致 UI 執行緒上的死結。 請考慮呼叫 Task.ConfigureAwait(Boolean) 以發出接續意圖的訊號。 |
CA2008:建立工作時請務必傳遞 TaskScheduler | 工作建立或接續作業會使用未指定 TaskScheduler 參數的方法多載。 |
CA2009:請勿對 ImmutableCollection 值呼叫 TolmmutableCollection | 在 ToImmutable 命名空間中不可變的集合上非必要地呼叫 System.Collections.Immutable 方法。 |
CA2011:請勿在屬性 setter 中指派屬性 | 不小心在自己的 set 存取子內為屬性指派值。 |
CA2012:必須正確使用 ValueTasks | 從成員叫用傳回的 ValueTasks 預計會直接等候。 嘗試多次取用 ValueTask,或在已知完成之前直接存取其結果,可能會導致例外狀況或損毀。 忽略這類 ValueTask 可能是功能 Bug 的指示,而且可能會降低效能。 |
CA2013:請勿使用具有值類型的 ReferenceEquals | 使用 System.Object.ReferenceEquals 比較值時,如果 objA 和 objB 是實值型別,則會在傳遞給 ReferenceEquals 方法之前進行 Box 處理。 這表示即使 objA 和 objB 都代表實值型別的相同執行個體,ReferenceEquals 方法仍會傳回 false。 |
CA2014:請勿在迴圈中使用 stackalloc。 | stackalloc 所配置的堆疊空間只會在目前方法叫用的結尾釋放。 在迴圈中使用可能會導致未繫結的堆疊成長和最終堆疊溢位狀況。 |
CA2015:請勿針對衍生自 MemoryManager<T> 的型別定義完成項 | 將完成項新增至衍生自 MemoryManager<T> 的類型,可能會允許在記憶體仍由 使用 Span<T>時釋放記憶體。 |
CA2016:將 CancellationToken 參數傳遞給使用該參數的方法 | 將 CancellationToken 參數轉送給方法,以確保作業取消通知能正確地散佈,或明確地傳入 CancellationToken.None ,以表示刻意不散佈權杖。 |
CA2017:參數計數不符 | 記錄訊息範本中提供的參數數目不符合具名預留位置的數目。 |
CA2018:count 的引數 Buffer.BlockCopy 應指定要複製的位元組數目 |
使用 Buffer.BlockCopy 時,count 引數會指定要複製的位元組數目。 您應只在元素的大小剛好是一個位元組的陣列上將 Array.Length 用於該 count 引數。
byte 、sbyte 和 bool 陣列具有大小為一個位元組的元素。 |
CA2019:ThreadStatic 欄位不應該使用內嵌初始化 |
標註 ThreadStaticAttribute 的欄位會以內嵌或明確的方式在 static (Visual Basic 中的 Shared ) 建構函式中初始化。 |
CA2020:防止 IntPtr/UIntPtr 內建運算子所造成的行為變更 | .NET 7 中新增的一些內建運算符的行為與 .NET 6 和舊版中的使用者定義運算符不同。 除非包裝在核取的內容中,否則某些在未核取內容中擲回的運算子,在溢位時不會再擲回。 除非包裝在未核取的內容中,否則某些先前未在核取內容中擲回的運算子現在會擲回。 |
CA2021:請勿呼叫具不相容類型的 Enumerable.Cast<T> 或 Enumerable.OfType<T> | 呼叫 Enumerable.Cast<TResult>(IEnumerable) 或 Enumerable.OfType<TResult>(IEnumerable) 指定與輸入集合類型不相容的類型參數。 |
CA2022:避免使用 Stream.Read 不發生讀取 | 對的呼叫 Stream.Read 可能會傳回比要求的位元組少,如果未檢查傳回值,則會導致不可靠的程序代碼。 |
CA2100:必須檢閱 SQL 查詢中是否有安全性弱點 | 方法會使用透過字串引數所建置的字串,將 System.Data.IDbCommand.CommandText 屬性設定為方法。 這項規則假設字串引數包含使用者輸入。 從使用者輸入所建置的 SQL 命令字串很容易遭到 SQL 插入 (SQL Injection) 攻擊。 |
CA2101:指定 P/Invoke 字串引數的封送處理 | 平台叫用成員允許部分信任的呼叫端、具有字串參數,並且未明確封送處理字串。 這樣會造成安全性弱點。 |
CA2109:必須檢閱可見的事件處理常式 | 偵測到公用或保護的事件處理方法。 除非有絕對的必要性,否則不應該公開事件處理方法。 |
CA2119:密封方法以滿足私用介面的要求 | 可繼承的公用類型會提供內部 (在 Visual Basic 中為 Friend) 介面的可覆寫方法實作。 若要修正此規則的違規情形,請避免在組件外覆寫方法。 |
CA2153:避免處理損毀狀態例外 | 損毀狀態例外 (CSE) 指出處理序中有記憶體損毀的狀況。 如果攻擊者將攻擊放入損毀的記憶體區域,則攔截這些處理序而非讓它們損毀,會導致安全性弱點。 |
CA2200:必須重新擲回以保存堆疊詳細資料 | 例外狀況遭到重新擲回,而且已在 throw 陳述式中明確指定此例外狀況。 如果例外狀況是透過在陳述式中指定例外狀況而重新擲回,則會遺失在擲回例外狀況之原始方法和目前方法之間呼叫的方法清單。 |
CA2201:不要引發保留的例外狀況類型 | 這將使原始錯誤變得難以偵測及偵錯。 |
CA2207:必須將實值類型的靜態欄位內嵌初始化 | 實值類型會宣告明確的靜態建構函式。 若要修正此規則的違規情形,請在宣告所有靜態資料時將靜態資料初始化,並移除靜態建構函式。 |
CA2208:必須正確執行個體化引數例外狀況 | 對例外狀況類型的預設 (無參數) 建構函式進行呼叫,該建構函式是或衍生自 ArgumentException 的例外狀況類型,或是將不正確的字串自變數傳遞至例外狀況類型的參數化建構函式,或衍生自 ArgumentException 。 |
CA2211:非常數欄位不應該為可見的 | 既非常數,亦非唯讀的靜態欄位不是安全執行緒。 必須小心控制對這類欄位的存取,而且需要進階的程式設計技巧來同步處理對類別物件的存取。 |
CA2213:可處置的欄位應該受到處置 | 實作 System.IDisposable 的類型宣告了也實作 IDisposable 之類型的欄位。 宣告類型的 Dispose 方法不會呼叫欄位的 Dispose 方法。 |
CA2214:不要呼叫建構函式中的可覆寫方法 | 當建構函式呼叫虛擬方法時,叫用方法之實例的建構函式可能尚未執行。 |
CA2215:Dispose 方法應該呼叫基底類別處置 | 如果類型會繼承自可處置的類型,則必須從本身的 Dispose 方法呼叫基底類型的 Dispose 方法。 |
CA2216:可處置的類型應該宣告完成項 | 實作 System.IDisposable 且具有建議 Unmanaged 資源用法之欄位的類型,未實作如 Object.Finalize 所述的完成項。 |
CA2217:不要以 FlagsAttribute 標記列舉 | 從外部可見的列舉會使用 FlagsAttribute 來標記,並且有一個或多個不是二的次方,或組合列舉上其他定義值之次方的值。 |
CA2218:覆寫 Equals 時必須一併覆寫 GetHashCode | 公用型別會覆寫 System.Object.Equals,但不會覆寫 System.Object.GetHashCode。 |
CA2219:不要在 exception 子句中引發例外狀況 | 在 finally 或 fault 子句中引發例外狀況時,新的例外狀況會隱藏作用中的例外狀況。 在篩選子句中引發例外狀況時,運行時間會以無訊息方式擷取例外狀況。 這將使原始錯誤變得難以偵測及偵錯。 |
CA2224:多載等號比較運算子時必須一併覆寫 Equals | 公用型別會實作等號運算子,但不會覆寫 System.Object.Equals。 |
CA2225:運算子多載必須有具名的替代方法 | 偵測到運算子多載,且找不到預期的具名替代方法。 具名的替代成員會提供與運算子相同的功能存取,並且可供以不支援多載運算子 (Overloaded Operator) 的語言設計程式的開發人員使用。 |
CA2226:運算子應該有對稱的多載 | 類型實作等號比較運算子或不等比較運算子,但未實作相反的運算子。 |
CA2227:集合屬性應該為唯讀 | 可寫入的集合屬性允許使用者以不同的集合來取代該集合。 唯讀屬性會從取代過程中停止集合,但是仍然允許設定個別成員。 |
CA2229:必須實作序列化建構函式 | 若要修正此規則的違規情形,請實作序列化建構函式。 針對密封類別,讓建構函式成為 private,否則為 protected。 |
CA2231:在覆寫 ValueType.Equals 上多載等號運算子 | 實值類型會覆寫 Object.Equals,但不會實作等號比較運算子。 |
CA2234:必須傳遞 System.Uri 物件而非字串 | 呼叫字串參數名稱包含 "uri"、"URI"、"urn"、"URN"、"url" 或 "URL", 而且此方法的宣告類型會包含具有 System.Uri 參數的對應方法多載。 |
CA2235:必須標記所有不可序列化的欄位 | 可序列化之類型中所宣告之類型的執行個體 (Instance) 欄位是不可序列化的。 |
CA2237:ISerializable 類型必須標記 SerializableAttribute | 若要讓通用語言執行平台辨認為可序列化,即使類型透過 ISerializable 介面的實作使用自訂序列化常式,類型仍必須使用 SerializableAttribute 屬性來標記。 |
CA2241:必須提供格式化方法的正確引數 | 傳遞至 System.String.Format 的格式引數不包含對應至每個物件引數的格式項目,反之亦然。 |
CA2242:必須正確測試 NaN | 此運算式針對 Single.Nan 或 Double.Nan 測試值。 使用 Single.IsNan(Single) 或 Double.IsNan(Double) 即可測試值。 |
CA2243:屬性字串常值必須正確剖析 | 屬性的字串常值參數未針對 URL、GUID 或版本進行正確剖析。 |
CA2244:請勿複製索引元素初始化 | 物件初始設定式有多個具有相同常數索引的索引項目初始設定式。 除了最後一個初始設定式,其他全都是不必要的。 |
CA2245:請勿將屬性指派給屬性自身 | 不小心將屬性指派給本身。 |
CA2246:請勿在相同的陳述式中指派符號及其成員 | 不建議在相同的陳述式中指派符號及其成員,也就是欄位或屬性。 目前不清楚成員存取是在要使用在指派之前的符號舊值,還是在此陳述式中指派的新值。 |
CA2247:傳遞到 TaskCompletionSource 建構函式的引數應為 TaskCreationOptions 列舉,而非 TaskContinuationOptions 列舉 | TaskCompletionSource 具有採用 TaskCreationOptions 來控制基礎工作的建構函式,以及採用在工作中儲存之物件狀態的建構函式。 不小心傳遞 TaskContinuationOptions (而不是 TaskCreationOptions) 會導致呼叫將選項視為狀態。 |
CA2248:請提供正確的列舉引數給 Enum.HasFlag | 傳遞為 HasFlag 方法呼叫引數的列舉類型與呼叫列舉類型不同。 |
CA2249:請考慮使用 String.Contains 而非 String.IndexOf | 呼叫 string.IndexOf 的結果,將用於確認有無子字串可由 string.Contains 取代。 |
CA2250:使用 ThrowIfCancellationRequested |
ThrowIfCancellationRequested 會自動檢查權杖是否已取消,如果已取消,則會擲回 OperationCanceledException 。 |
CA2251:使用 String.Equals (而不是 String.Compare ) |
使用 String.Equals (而不是比較 String.Compare 結果為零) 不僅較清楚且可能更快。 |
CA2252:選擇加入預覽功能 | 選擇加入預覽功能,再使用預覽 API。 |
CA2253:具名預留位置不應為數值 | 記錄訊息範本中的具名預留位置不能只包含數值字元。 |
CA2254:範本應該是靜態運算式 | 記錄訊息範本在不同呼叫之間不應有異。 |
CA2255:ModuleInitializer 屬性不應該用於程式庫 |
模組初始設定式旨在供應用程式程式碼使用,以確保應用程式元件會在應用程式程式碼開始執行之前初始化。 |
CA2256:在父介面中宣告的所有成員,在 DynamicInterfaceCastableImplementation 屬性介面中都必須有一個實作 | 屬性為 DynamicInterfaceCastableImplementationAttribute 的型別,會做為實作 IDynamicInterfaceCastable 型別的型別介面實作。 因此,其必須提供繼承介面中定義之所有成員的實作,因為實作 IDynamicInterfaceCastable 的型別不會以別種方式提供這些實作。 |
CA2257:在有 'DynamicInterfaceCastableImplementationAttribute' 介面上定義的成員應為 'static' | 由於實作 IDynamicInterfaceCastable 的類型可能不會在元數據中實作動態介面,因此對實例介面成員的呼叫,此類型上定義的明確實作可能會在運行時間失敗。 標示新的介面成員 static 以避免執行階段錯誤。 |
CA2258:不支援在 Visual Basic 中提供 'DynamicInterfaceCastableImplementation' 介面 | 提供功能 DynamicInterfaceCastableImplementationAttribute 屬性化介面需要在 Visual Basic 不支援的預設介面成員功能。 |
CA2259:確保 ThreadStatic 只與靜態欄位搭配使用 |
ThreadStaticAttribute 只會影響 static (Visual Basic 中的 Shared ) 欄位。 套用至執行個體欄位時,屬性不會影響行為。 |
CA2260:正確實作泛型數學介面 | 泛型數學介面需要衍生型別本身,才能用於自發型別參數。 |
CA2261:請勿使用 ConfigureAwaitOptions.SuppressThrowing 搭配 Task<TResult> |
泛 ConfigureAwaitOptions.SuppressThrowing 型 Task<TResult> 不支援 這個選項,因為這可能會導致傳回無效 TResult 的 。 |
CA2262:正確設定MaxResponseHeadersLength |
請確定 MaxResponseHeadersLength 已正確提供值。 此值是以 KB 為單位來測量。 |
CA2263:當型別已知時偏好泛型多載 | 當已知型別時,最好使用泛型多載傳遞 System.Type 自變數,因為它們會提升更簡潔且更安全的型別程序代碼,並透過改良的編譯時間檢查。 |
CA2264:請勿將不可為 Null 的值傳遞至 'ArgumentNullException.ThrowIfNull' | 當傳遞的自變數為 'null' 時,'ArgumentNullException.ThrowIfNull' 會擲回。 某些建構,例如不可為 Null 的結構,以及 'nameof()' 和 'new' 表達式已知永遠不會是 Null,因此 'ArgumentNullException.ThrowIfNull' 永遠不會擲回。 |
CA2265:不要與 或 比較Span<T> null default |
比較範圍與 null 或 default 可能不會執行您想要的內容。
default 與常 null 值會隱含地轉換成 Span<T>.Empty 。 |
CA2300:請勿使用不安全的還原序列化程式 BinaryFormatter | 還原序列化未受信任資料時,不安全的還原序列化程式會易受攻擊。 攻擊者可以修改序列化的資料,以包含非預期的型別,以插入具有惡意副作用的物件。 |
CA2301:未先設定 BinaryFormatter.Binder 之前,請勿呼叫 BinaryFormatter.Deserialize | 還原序列化未受信任資料時,不安全的還原序列化程式會易受攻擊。 攻擊者可以修改序列化的資料,以包含非預期的型別,以插入具有惡意副作用的物件。 |
CA2302:呼叫 BinaryFormatter.Deserialize 之前,請務必先設定 BinaryFormatter.Binder | 還原序列化未受信任資料時,不安全的還原序列化程式會易受攻擊。 攻擊者可以修改序列化的資料,以包含非預期的型別,以插入具有惡意副作用的物件。 |
CA2305:請勿使用不安全的還原序列化程式 LosFormatter | 還原序列化未受信任資料時,不安全的還原序列化程式會易受攻擊。 攻擊者可以修改序列化的資料,以包含非預期的型別,以插入具有惡意副作用的物件。 |
CA2310:請勿使用不安全的還原序列化程式 NetDataContractSerializer | 還原序列化未受信任資料時,不安全的還原序列化程式會易受攻擊。 攻擊者可以修改序列化的資料,以包含非預期的型別,以插入具有惡意副作用的物件。 |
CA2311:未先設定 NetDataContractSerializer.Binder 之前,請勿還原序列化 | 還原序列化未受信任資料時,不安全的還原序列化程式會易受攻擊。 攻擊者可以修改序列化的資料,以包含非預期的型別,以插入具有惡意副作用的物件。 |
CA2312:還原序列化之前,請務必先設定 NetDataContractSerializer.Binder | 還原序列化未受信任資料時,不安全的還原序列化程式會易受攻擊。 攻擊者可以修改序列化的資料,以包含非預期的型別,以插入具有惡意副作用的物件。 |
CA2315:請勿使用不安全的還原序列化程式 ObjectStateFormatter | 還原序列化未受信任資料時,不安全的還原序列化程式會易受攻擊。 攻擊者可以修改序列化的資料,以包含非預期的型別,以插入具有惡意副作用的物件。 |
CA2321:請勿使用 SimpleTypeResolver 搭配 JavaScriptSerializer 來還原序列化 | 還原序列化未受信任資料時,不安全的還原序列化程式會易受攻擊。 攻擊者可以修改序列化的資料,以包含非預期的型別,以插入具有惡意副作用的物件。 |
CA2322:還原序列化之前,請確定不會使用 SimpleTypeResolver 來將 JavaScriptSerializer 初始化 | 還原序列化未受信任資料時,不安全的還原序列化程式會易受攻擊。 攻擊者可以修改序列化的資料,以包含非預期的型別,以插入具有惡意副作用的物件。 |
CA2326:請勿使用「無」以外的 TypeNameHandling 值 | 還原序列化未受信任資料時,不安全的還原序列化程式會易受攻擊。 攻擊者可以修改序列化的資料,以包含非預期的型別,以插入具有惡意副作用的物件。 |
CA2327:請勿使用不安全的 JsonSerializerSettings | 還原序列化未受信任資料時,不安全的還原序列化程式會易受攻擊。 攻擊者可以修改序列化的資料,以包含非預期的型別,以插入具有惡意副作用的物件。 |
CA2328:確定 JsonSerializerSettings 安全 | 還原序列化未受信任資料時,不安全的還原序列化程式會易受攻擊。 攻擊者可以修改序列化的資料,以包含非預期的型別,以插入具有惡意副作用的物件。 |
CA2329:請勿使用不安全的組態來還原序列化 JsonSerializer | 還原序列化未受信任資料時,不安全的還原序列化程式會易受攻擊。 攻擊者可以修改序列化的資料,以包含非預期的型別,以插入具有惡意副作用的物件。 |
CA2330:在還原序列化時,請確認 JsonSerializer 有安全的組態 | 還原序列化未受信任資料時,不安全的還原序列化程式會易受攻擊。 攻擊者可以修改序列化的資料,以包含非預期的型別,以插入具有惡意副作用的物件。 |
CA2350:請確認 DataTable.ReadXml() 的輸入是受信任的 | 使用不受信任的輸入還原序列化 DataTable 時,攻擊者可以製作惡意輸入來執行拒絕服務的攻擊。 可能有未知的遠端程式代碼執行弱點。 |
CA2351:請確認 DataSet.ReadXml() 的輸入是受信任的 | 使用不受信任的輸入還原序列化 DataSet 時,攻擊者可以製作惡意輸入來執行拒絕服務的攻擊。 可能有未知的遠端程式代碼執行弱點。 |
CA2352:可序列化類型中的不安全 DataSet 或 DataTable 可能容易受到遠端程式碼執行攻擊 | 標示為 SerializableAttribute 的類別或結構包含 DataSet 或 DataTable 欄位或屬性,而且沒有 GeneratedCodeAttribute。 |
CA2353:可序列化類型中的不安全 DataSet 或 DataTable | 標示為 XML 序列化屬性或資料合約屬性的類別或結構包含 DataSet 或 DataTable 欄位或屬性。 |
CA2354:還原序列化物件圖中的不安全 DataSet 或 DataTable 可能容易受到遠端程式碼執行攻擊 | 使用 System.Runtime.Serialization.IFormatter 序列化還原序列化,而轉換型別的物件圖形可以包含 DataSet 或 DataTable。 |
CA2355:還原序列化物件圖中的不安全 DataSet 或 DataTable | 在轉換或指定型別的物件圖形可以包含 DataSet 或 DataTable 時還原序列化。 |
CA2356:Web 還原序列化物件圖中的不安全 DataSet 或 DataTable | 具有 System.Web.Services.WebMethodAttribute 或 System.ServiceModel.OperationContractAttribute 的方法具有可能參考 DataSet 或 DataTable的參數。 |
CA2361:確認不會搭配不受信任的資料使用包含 DataSet.ReadXml() 的自動產生類別 | 使用不受信任的輸入還原序列化 DataSet 時,攻擊者可以製作惡意輸入來執行拒絕服務的攻擊。 可能有未知的遠端程式代碼執行弱點。 |
CA2362:自動產生之可序列化型別中不安全的 DataSet 或 DataTable,容易受到遠端程式碼執行攻擊 | 使用 BinaryFormatter 還原序列化未受信任的輸入,且還原序列化的物件圖形包含 DataSet 或 DataTable 時,攻擊者可以製作惡意承載來執行遠端程式碼執行攻擊。 |
CA3001:檢閱程式碼是否有 SQL 插入式攻擊弱點 | 使用不受信任的輸入和 SQL 命令時,請留意 SQL 插入式攻擊。 SQL 插入式攻擊可以執行惡意 SQL 命令,進而危害應用程式的安全性和完整性。 |
CA3002:檢閱程式碼是否有 XSS 弱點 | 處理來自 Web 要求的不受信任輸入時,請留意跨網站指令碼 (XSS) 攻擊。 XSS 攻擊會將不受信任的輸入插入原始 HTML 輸出中,讓攻擊者執行惡意指令碼或惡意修改網頁中的內容。 |
CA3003:檢閱程式碼是否有檔案路徑插入式攻擊弱點 | 使用來自 Web 要求的不受信任輸入時,請留意在指定檔案路徑時使用使用者控制的輸入。 |
CA3004:檢閱程式碼是否有資訊洩漏弱點 | 洩漏例外狀況資訊可讓攻擊者深入了解應用程式內部,這有助於攻擊者找出其他弱點來進行惡意探索。 |
CA3005:檢閱程式碼是否有 LDAP 插入式攻擊弱點 | 使用不受信任的輸入時,請留意輕量型目錄存取通訊協定 (LDAP) 插入式攻擊。 攻擊者可能會對資訊目錄執行惡意 LDAP 陳述式。 使用使用者輸入來建構動態 LDAP 陳述式來存取目錄服務的應用程式特別容易受攻擊。 |
CA3006:檢閱程式碼是否有處理序命令插入式攻擊弱點 | 使用不受信任的輸入時,請留意命令插入式攻擊。 命令插入式攻擊可以在基礎作業系統上執行惡意命令,進而危害伺服器的安全性和完整性。 |
CA3007:檢閱程式碼是否有開放式重新導向弱點 | 使用不受信任的輸入時,請留意開放式重新導向弱點。 攻擊者可以利用開放式重新導向弱點,使用網站來提供合法 URL 的外觀,但將無防備的訪客重新導向至網路釣魚或其他惡意網頁。 |
CA3008:檢閱程式碼是否有 XPath 插入式攻擊弱點 | 使用不受信任的輸入時,請留意 XPath 插入式攻擊。 使用不受信任的輸入建構 XPath 查詢可能會讓攻擊者惡意操作查詢以傳回非預期的結果,並可能揭露查詢 XML 的內容。 |
CA3009:檢閱程式碼是否有 XML 插入式攻擊弱點 | 使用不受信任的輸入時,請留意 XML 插入式攻擊。 |
CA3010:檢閱程式碼是否有 XAML 插入式攻擊弱點 | 使用不受信任的輸入時,請留意 XAML 插入式攻擊。 XAML 是直接表示物件執行個體化和執行的標記語言。 這表示在 XAML 中建立的元素可以與系統資源互動 (例如網路存取和檔案系統 IO)。 |
CA3011:檢閱程式碼是否有 DLL 插入式攻擊弱點 | 使用不受信任的輸入時,請留意是否載入不受信任的程式碼。 如果您的 Web 應用程式載入不受信任的程式代碼,攻擊者可能會將惡意 DLL 插入您的進程並執行惡意代碼。 |
CA3012:檢閱程式碼是否有 regex 插入式攻擊弱點 | 使用不受信任的輸入時,請留意 regex 插入式攻擊。 攻擊者可以使用 RegEx 插入來惡意修改規則運算式、使 RegEx 符合非預期的結果,或讓 RegEx 耗用過多的 CPU 而導致拒絕服務的攻擊。 |
CA3061:請勿透過 URL 新增結構描述 | 請勿使用 Add 方法的不安全多載,因為它可能會導致危險的外部參考。 |
CA3075:不安全的 DTD 處理 | 如果您使用不安全的 DTDProcessing 實例或參考外部實體來源,剖析器可能會接受不受信任的輸入,並將敏感性資訊揭露給攻擊者。 |
CA3076:不安全的 XSLT 指令碼執行 | 如果您不安全地在 .NET 應用程式中執行 Extensible Stylesheet Language Transformations (XSLT),處理器可能會解析不受信任的 URI 參考,這些參考可能會向攻擊者揭露敏感性資訊,導致拒絕服務和跨網站攻擊。 |
CA3077:API 設計、XML 文件和 XML 文字讀取器中的不安全處理 | 針對衍生自 XMLDocument 和 XMLTextReader 的 API 進行設計時,請留意 DtdProcessing。 在參考或解析外部實體來源或設定 XML 中的不安全值時,使用不安全的 DTDProcessing 實例可能會導致資訊洩漏。 |
CA3147:使用 ValidateAntiForgeryToken 標示動詞處理常式 | 設計 ASP.NET MVC 控制器時,請注意跨網站要求偽造攻擊。 跨網站要求偽造攻擊可以將來自已驗證用戶的惡意要求傳送至您的 ASP.NET MVC 控制器。 |
CA5350:請勿使用弱式密碼編譯演算法 | 現今,弱式加密演算法和雜湊函式用於多種原因,但它們不應該用來保證所保護資料的機密性或完整性。 此規則會在它在程式碼中發現 TripleDES、SHA1 或 RIPEMD160 演算法時觸發。 |
CA5351:不要使用中斷的密碼編譯演算法 | 中斷的密碼編譯演算法較不安全,強烈建議您不要使用它們。 此規則會在它在程式碼中發現 MD5 雜湊演算法或 DES 或 RC2 加密演算法時觸發。 |
CA5358:不要使用不安全的 Cipher 模式 | 不要使用不安全的 Cipher 模式 |
CA5359:請勿停用憑證驗證 | 憑證可協助驗證伺服器的身分識別。 用戶端應該驗證伺服器憑證,以確保要求會傳送至預定的伺服器。 如果 ServerCertificateValidationCallback 一律傳回 true ,則任何憑證都會通過驗證。 |
CA5360:請勿在還原序列化時呼叫危險的方法 | 不安全的還原序列化是一個弱點,會在未受信任的資料用來濫用應用程式的邏輯、造成拒絕服務 (DoS) 攻擊,或甚至於還原序列化時執行任意程式碼時發生。 當應用程式還原序列化受到控制的不受信任資料時,惡意使用者可能會經常濫用這些還原序列化功能。 具體而言,在還原序列化過程中叫用危險方法。 成功的不安全還原序列化攻擊可讓攻擊者執行 DoS 攻擊、驗證略過和遠端程式碼執行等攻擊。 |
CA5361:請勿停用安全通道的強式密碼編譯 | 將 Switch.System.Net.DontEnableSchUseStrongCrypto 設定為 true 會弱化在傳出傳輸層安全性 (TLS) 連線中使用的密碼編譯。 較弱的密碼編譯可能會危害應用程式與伺服器之間通訊的機密性,讓攻擊者更輕鬆地竊聽敏感性資料。 |
CA5362:還原序列化物件圖中的可能參考循環 | 如果還原序列化未受信任的資料,那麼處理還原序列化物件圖形的任何程式碼都需要處理參考循環,而不必進入無限迴圈。 這包括還原序列化回撥流程的部分程式碼,以及還原序列化完成後,負責處理物件圖的程式碼。 否則,攻擊者便可使用包含參考循環的惡意資料來執行拒絕服務攻擊。 |
CA5363:請勿停用要求驗證 | 要求驗證是 ASP.NET 中的一項功能,會檢查 HTTP 要求,並判斷它們是否包含可能導致插入式攻擊的潛在危險內容,包括跨網站腳本處理。 |
CA5364:請勿使用已取代的安全性通訊協定 | 傳輸層安全性 (TLS) 最常使用超文字傳輸通訊協定安全 (HTTPS) 保護電腦之間的通訊。 較舊的 TLS 通訊協定版本的安全性比 TLS 1.2 和 TLS 1.3 更低,而且較可能有新的弱點。 避免舊版通訊協定,以將風險降到最低。 |
CA5365:請勿停用 HTTP 標頭檢查 | HTTP 標頭檢查可讓您對回應標頭中找到的歸位字元和換行字元 \r 和\n 進行編碼。 此編碼有助於避免插入式攻擊,這些攻擊會利用標頭所包含不受信任資料的應用程式。 |
CA5366:請使用 XmlReader 為 DataSet 讀取 XML | DataSet使用 以不受信任的數據讀取 XML 可能會載入危險的外部參考,這應該透過使用XmlReader具有安全解析程式或停用 DTD 處理的 來限制。 |
CA5367:請勿將具有指標欄位的類型序列化 | 此規則會檢查是否有具有指標欄位或屬性的可序列化類別。 無法序列化的成員可以是指標,例如以 NonSerializedAttribute 標示的靜態成員或欄位。 |
CA5368:為衍生自頁面的類別設定 ViewStateUserKey | 設定 ViewStateUserKey 屬性可協助您防止對應用程式的攻擊,方法是讓您將識別碼指派給個別使用者的檢視狀態變數,讓攻擊者無法使用變數來產生攻擊。 否則,跨網站要求偽造將會有弱點。 |
CA5369:請使用 XmlReader 進行還原序列化 | 處理不受信任的 DTD 和 XML 架構可能會啟用載入危險的外部參考,這應該受限於使用具有安全解析程式的 XmlReader,或停用 DTD 和 XML 內嵌架構處理。 |
CA5370:請使用 XmlReader 驗證讀取器 | 處理不受信任的 DTD 和 XML 架構可能會啟用載入危險的外部參考。 使用具有安全解析程式或已停用 DTD 和 XML 內嵌結構描述處理的 XmlReader,即可限制這種危險載入。 |
CA5371:請使用 XmlReader 讀取結構描述 | 處理不受信任的 DTD 和 XML 架構可能會啟用載入危險的外部參考。 使用具有安全解析程式或已停用 DTD 和 XML 內嵌結構描述處理的 XmlReader 會限制此功能。 |
CA5372:請為 XPathDocument 使用 XmlReader | 從不受信任的數據處理 XML 可能會載入危險的外部參考,這可以透過使用 XmlReader 搭配安全解析程式或停用 DTD 處理來限制。 |
CA5373:不使用已過時的金鑰衍生函式 | 此規則會偵測弱式金鑰衍生方法和 System.Security.Cryptography.PasswordDeriveBytesRfc2898DeriveBytes.CryptDeriveKey 的叫用。
System.Security.Cryptography.PasswordDeriveBytes 使用弱式演算法 PBKDF1。 |
CA5374:請勿使用 XslTransform | 此規則會檢查是否已在程式碼中將 System.Xml.Xsl.XslTransform 具現化。 System.Xml.Xsl.XslTransform 現在已過時,不應使用。 |
CA5375:請勿使用帳戶共用存取簽章 | 帳戶 SAS 可以將 Blob 容器、資料表、佇列和檔案共用的讀取、寫入和刪除作業的存取權限,委派給本無權限的服務 SAS。 不過,其不支援容器層級原則,而且對於授與的權限具有較少的彈性和控制。 惡意使用者取得此權限之後,儲存體帳戶將會很容易遭到入侵。 |
CA5376:請使用 SharedAccessProtocol HttpsOnly | SAS 是敏感性資料,無法在 HTTP 上以純文字傳輸。 |
CA5377:請使用容器層級存取原則 | 容器層級存取原則可以隨時修改或撤銷。 其提供更大的彈性,並可控制授與的權限。 |
CA5378:請勿停用 ServicePointManagerSecurityProtocols | 將 Switch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols 設定為 true 會將 Windows Communication Framework (WCF) 傳輸層安全性 (TLS) 連線限制為使用 TLS 1.0。 該版本的 TLS 將會遭到取代。 |
CA5379:請勿使用弱式金鑰衍生函數 (Key Derivation Function) 演算法 |
Rfc2898DeriveBytes 類別預設為使用 SHA1 演算法。 您應該指定要在具有 SHA256 或更新版本的某些建構函式多載中使用的雜湊演算法。 請注意,HashAlgorithm 屬性只有 get 存取子,而且沒有 overridden 修飾元。 |
CA5380:不新增憑證至根存放區 | 此規則會偵測將憑證新增至信任根憑證授權單位憑證存放區的程式碼。 根據預設,信任的根憑證授權單位憑證存放區會設定一組符合 Microsoft 根憑證計畫需求的公用 CA。 |
CA5381:確保憑證不新增至根存放區 | 此規則會偵測可能將憑證新增至信任根憑證授權單位憑證存放區的程式碼。 根據預設,信任的根憑證授權單位憑證存放區會設定一組符合 Microsoft 根憑證計畫需求的公用憑證授權單位 (CA)。 |
CA5382:在 ASP.NET Core 中使用安全 Cookie | 透過 HTTPS 提供的應用程式必須使用安全 Cookie,這會向瀏覽器表示 Cookie 應該只使用安全通訊端層 (SSL) 傳輸。 |
CA5383:確定在 ASP.NET Core 中使用安全 Cookie | 透過 HTTPS 提供的應用程式必須使用安全 Cookie,這會向瀏覽器表示 Cookie 應該只使用安全通訊端層 (SSL) 傳輸。 |
CA5384:請勿使用數位簽章演算法 (DSA) | DSA 是弱式非對稱加密演算法。 |
CA5385:使用有足夠金鑰大小的 Rivest–Shamir–Adleman (RSA) 加密演算法 | 小於 2048 位元的 RSA 金鑰較容易遭受暴力密碼破解攻擊。 |
CA5386:避免將 SecurityProtocolType 值寫入程式碼 | 傳輸層安全性 (TLS) 最常使用超文字傳輸通訊協定安全 (HTTPS) 保護電腦之間的通訊。 通訊協定版本 TLS 1.0 和 TLS 1.1 已遭取代,而 TLS 1.2 和 TLS 1.3 是最新版本。 未來,TLS 1.2 和 TLS 1.3 可能已被取代。 為了確保您的應用程式保持安全,請避免硬式編碼通訊協定版本,並至少以 .NET Framework v4.7.1 為目標。 |
CA5387:請勿使用反覆項目數不足的弱式金鑰衍生函數 (Key Derivation Function) | 此規則會檢查密碼編譯金鑰是否由 Rfc2898DeriveBytes 產生,且反覆運算計數小於 100,000。 較高的反覆運算計數有助於減輕嘗試猜測所產生密碼編譯金鑰的字典攻擊。 |
CA5388:使用弱式金鑰衍生函數 (Key Derivation Function) 時,請確保反覆項目數足夠 | 此規則會檢查密碼編譯密鑰是否由 Rfc2898DeriveBytes 具有可能小於 100,000 的反覆項目計數所產生。 較高的反覆運算計數有助於減輕嘗試猜測所產生密碼編譯金鑰的字典攻擊。 |
CA5389:不將封存項目路徑新增至目標檔案系統路徑 | 檔案路徑可以是相對的,而且可能會導致檔案系統存取超出預期的檔案系統目標路徑,進而透過配置和等候技術導致惡意設定變更和遠端程式碼執行。 |
CA5390:請勿使用硬式編碼加密金鑰 | 為了確保對稱演算法成功,只有傳送者和接收者才知道祕密金鑰。 當金鑰是硬式編碼時,您就可以輕鬆地探索到此金鑰。 即使使用編譯的二進位檔,惡意使用者也很容易加以擷取。 私密金鑰遭到入侵之後,加密文字可以直接解密,且不再受到保護。 |
CA5391:在 ASP.NET Core MVC 控制器中使用反forgery 令牌 |
POST 處理 、PUT 、 PATCH 或 DELETE 要求而不驗證反forgery 令牌,可能會容易受到跨網站要求偽造攻擊的影響。 跨網站要求偽造攻擊可以將來自已驗證用戶的惡意要求傳送至您的 ASP.NET Core MVC 控制器。 |
CA5392:請對 P/Invokes 使用 DefaultDllImportSearchPaths 屬性 | 根據預設,P/Invoke 函式會使用 DllImportAttribute 探查數個目錄,包括程式庫要載入的目前工作目錄。 這可以是特定應用程式的安全性問題,進而導致 DLL 攔截。 |
CA5393:請勿使用不安全的 DllImportSearchPath 值 | 預設 DLL 搜尋目錄和組件目錄中可能有惡意 DLL。 或者,視應用程式執行位置而定,應用程式目錄中可能有惡意 DLL。 |
CA5394:請勿使用不安全的隨機性 | 使用密碼編譯弱式虛擬隨機數產生器,可能會讓攻擊者預測將產生哪些安全性敏感性值。 |
CA5395:遺漏動作方法的 HttpVerb 屬性 | 建立、編輯、刪除或修改資料的所有動作方法,都必須受到防偽屬性的保護,以防止跨網站偽造要求攻擊。 執行 GET 作業應該是安全的作業,沒有任何副作用,而且不會修改您的保存資料。 |
CA5396:將 HttpCookie 的 HttpOnly 設為 true | 作為深度防禦措施,請確定將安全性敏感性 HTTP Cookie 標示為 HttpOnly。 這表示網頁瀏覽器應該不允許指令碼存取 Cookie。 插入的惡意指令碼是竊取 Cookie 的常見方式。 |
CA5397:請勿使用已過時的 SslProtocols 通訊協定 | 傳輸層安全性 (TLS) 最常使用超文字傳輸通訊協定安全 (HTTPS) 保護電腦之間的通訊。 較舊的 TLS 通訊協定版本的安全性比 TLS 1.2 和 TLS 1.3 更低,而且較可能有新的弱點。 避免舊版通訊協定,以將風險降到最低。 |
CA5398:避免以硬式編碼方式寫入 SslProtocols 值 | 傳輸層安全性 (TLS) 最常使用超文字傳輸通訊協定安全 (HTTPS) 保護電腦之間的通訊。 通訊協定版本 TLS 1.0 和 TLS 1.1 已遭取代,而 TLS 1.2 和 TLS 1.3 是最新版本。 未來,TLS 1.2 和 TLS 1.3 可能已被取代。 若要確保應用程式保持安全,請避免將通訊協定版本硬式編碼。 |
CA5399:確認停用 HttpClient 憑證撤銷清單檢查 | 已撤銷的憑證不再受信任。 攻擊者可以使用此憑證來傳遞某些惡意資料,或在 HTTPS 通訊中竊取敏感性資料。 |
CA5400:確認未停用 HttpClient 憑證撤銷清單檢查 | 已撤銷的憑證不再受信任。 攻擊者可以使用此憑證來傳遞某些惡意資料,或在 HTTPS 通訊中竊取敏感性資料。 |
CA5401:請勿使用具有非預設 IV 的 CreateEncryptor | 對稱式加密應一律使用不可重複的初始化向量來防止字典攻擊。 |
CA5402:使用具有預設 IV 的 CreateEncryptor | 對稱式加密應一律使用不可重複的初始化向量來防止字典攻擊。 |
CA5403:不要硬式編碼憑證 |
data 或 rawData 或 X509Certificate 建構函式的 X509Certificate2 參數會受到硬式編碼。 |
CA5404:請勿停用權杖驗證檢查 | 不應將控制權杖驗證的 TokenValidationParameters 屬性設定為 false 。 |
CA5405:永遠不要在委派中略過權杖驗證 | 指派給 AudienceValidator 或 LifetimeValidator 的回撥一律會傳回 true 。 |
IL3000:以單一檔案形式發佈時,避免存取組件檔路徑 | 以單一檔案形式發佈時,避免存取組件檔路徑。 |
IL3001:以單一檔案形式發佈時,避免存取組件檔路徑 | 以單一檔案形式發佈時,避免存取組件檔路徑。 |
IL3002:以單一檔案形式發佈時,避免呼叫標示有 'RequiresAssemblyFilesAttribute' 的成員 | 以單一檔案形式發佈時,避免呼叫標示有 'RequiresAssemblyFilesAttribute' 的成員 |
IL3003:'RequiresAssemblyFilesAttribute' 註釋必須符合所有介面實作或覆寫 | 'RequiresAssemblyFilesAttribute' 註釋必須符合所有介面實作或覆寫。 |
IL3005:無法直接將 RequiresAssemblyFilesAttribute 放在應用程式進入點上。 |
RequiresAssemblyFilesAttribute 無法直接放在應用程式進入點上。 |
圖例
下表顯示針對參考文件中每個規則所提供的資訊型別。
項目 | 描述 |
---|---|
類型 | 規則的 TypeName。 |
規則識別碼 | 規則的唯一識別碼。 RuleId 與 Category 是用於原始程式檔內的警告隱藏。 |
類別 | 規則的類別,例如安全性。 |
修正程式是中斷或非中斷 | 此規則的違規修正是否為中斷變更。 中斷變更表示組件在造成違規的目標上具相依性,且該組件不會使用新的固定版本進行重新編譯,或可能由於此項變更而在執行階段失敗。 當有多項修正程式可用,且至少有一個是中斷變更而有一個不是時,便會指定「中斷」與「非中斷」。 |
原因 | 此特定的 Managed 程式碼讓規則產生警告。 |
描述 | 討論警告背後的問題。 |
如何修正違規 | 說明如何變更原始程式碼,以符合規則並避免其產生警告。 |
隱藏警告的時機 | 描述何時可安全地隱藏此規則的警告。 |
程式碼範例 | 違反規則的範例與經過更正且符合規則的範例。 |
相關規則 | 相關規則。 |