安全警告

安全警告支持更安全的库和应用程序。 这些警告帮助防止程序中出现安全漏洞。 如果您禁用其中的某个警告,您应当在代码中清楚标出原因,同时将您的开发项目通知指定的安全负责人。

本节内容

规则

说明

CA2100:检查 SQL 查询中是否有安全漏洞

一个方法使用按该方法的字符串参数生成的字符串设置 System.Data.IDbCommand.CommandText 属性。 此规则假定字符串参数中包含用户输入。 基于用户输入生成的 SQL 命令字符串易于受到 SQL 注入式攻击。

CA2102:在常规处理程序中捕捉非 CLSCompliant 异常

程序集中未标以 RuntimeCompatibilityAttribute 或标以 RuntimeCompatibility(WrapNonExceptionThrows = false) 的某个成员包含一个处理 System.Exception 的 catch 块,而不包含紧跟其后的一般 catch 块。

CA2103:检查命令性安全

某方法使用命令性安全,并且可能正在使用在请求处于活动状态时可以更改的状态信息或返回值来构造权限。 应尽可能使用声明性安全。

CA2104:不要声明只读可变引用类型

外部可见类型包含外部可见的只读字段,该字段为可变的引用类型。 可变类型是实例数据可被修改的类型。

CA2105:数组字段不应为只读

向包含数组的字段应用 readonly(在 Visual Basic 中为 ReadOnly)修饰符时,无法将该字段更改为引用其他数组。 但是,可以更改在只读字段中存储的数组的元素。

CA2106:保护断言

某个方法断言权限,但不对调用方执行任何安全检查。 如果在不执行任何安全检查的情况下断言安全权限,则会在代码中留下可利用的安全漏洞。

CA2107:检查 deny 权限和 permit only 权限的使用情况

PermitOnly 方法和 CodeAccessPermission.Deny 安全操作只应由掌握 .NET Framework 高级安全知识的人员使用。 应当对使用这些安全操作的代码进行安全检查。

CA2108:检查有关值类型的声明性安全

公共或受保护值类型受数据访问或链接要求保护。

CA2109:检查可见的事件处理程序

检测到公共事件处理方法或受保护事件处理方法。 除非绝对必要,否则不应公开事件处理方法。

CA2111:指针应为不可见

指针不是私有、内部或只读指针。 恶意代码可以更改指针的值,这样就有可能访问内存中的任意位置或导致应用程序或系统故障。

CA2112:受保护的类型不应公开字段

一个公共或受保护类型包含公共字段,并受链接要求保护。 如果代码可以访问受链接要求保护的类型的实例,则该代码不必满足此链接要求就可以访问该类型的字段。

CA2114:方法安全性应是类型安全性的超集

一个方法不应同时有同一操作的方法级别和类型级别的声明性安全。

CA2115:使用本机资源时调用 GC.KeepAlive

该规则检测由于在非托管代码仍在使用非托管资源时终止该非托管资源而可能发生的错误。

CA2116:APTCA 方法应只调用 APTCA 方法

在完全受信任的程序集具有 APTCA (AllowPartiallyTrustedCallers) 特性时,如果该程序集执行另一个不允许部分受信任调用方的程序集中的代码,则可能存在安全漏洞。

CA2117:APTCA 类型应只扩展 APTCA 基类型

在完全受信任的程序集具有 APTCA (AllowPartiallyTrustedCallers) 特性时,如果程序集中的某个类型是从不允许部分受信任调用方的类型继承而来,则可能会产生安全漏洞。

CA2118:检查 SuppressUnmanagedCodeSecurityAttribute 用法

SuppressUnmanagedCodeSecurityAttribute 为执行使用 COM 互操作或平台调用的非托管代码的成员更改默认的安全系统行为。 该特性主要用于提高性能;不过,提高性能的同时会显著增加安全风险。

CA2119:密封满足私有接口的方法

可继承的公共类型为 internal(在 Visual Basic 中为 Friend)接口提供可重写的方法实现。 若要修复与此规则的冲突,请禁止方法在程序集外重写。

CA2120:保护序列化构造函数

此类型的构造函数采用了 System.Runtime.Serialization.SerializationInfo 对象和 System.Runtime.Serialization.StreamingContext 对象(序列化构造函数的签名)。 此构造函数不受安全检查的保护,但类型中的一个或多个常规构造函数受保护。

CA2121:静态构造函数应为私有

系统在创建第一个类型实例或引用任何静态成员之前调用静态构造函数。 如果静态构造函数不是私有,则系统以外的代码可以调用它。 根据构造函数中执行的操作,这可能导致意外行为。

CA2122:不要使用链接请求间接公开方法

公共或受保护成员具有链接要求,且由不执行任何安全检查的成员调用。 链接请求仅检查直接调用方的权限。

CA2123:重写的链接请求应与基相同

该规则将一个方法与其基方法(该基方法为另一个类型中的接口或虚方法)相匹配,然后比较两者的链接请求。 如果与此规则冲突,则恶意调用方只需调用不安全的方法,即可跳过该链接要求。

CA2124:在外部 try 块中包装易受攻击的 finally 子句

公共或受保护方法中含有 try/finally 块。 finally 块似乎要重置安全状态,并且自身不包括在某个 finally 块中。

CA2126:类型链接请求需要继承请求

一个公共的非密封类型受链接要求保护,并且具有可重写的方法。 类型和方法都不受继承要求保护。

CA2136:成员不应有相互冲突的透明度注释

在完全透明的程序集中不能出现关键代码。 此规则分析完全透明的程序集在类型、字段和方法级别是否有任何 SecurityCritical 批注。

CA2147:透明方法不得使用安全断言

此规则分析完全透明或混合透明/关键的程序集中的所有方法和类型,并标记 Assert 的任何声明性或命令性用法。

CA2140:透明代码不得引用安全关键项

标有 SecurityTransparentAttribute 的方法调用标为 SecurityCritical 的非公共成员。 此规则分析混合透明/关键的程序集中的所有方法和类型,并标记透明代码中对未标为 SecurityTreatAsSafe 的非公共关键代码的任何调用。

CA2130:安全关键常量应是透明的

未对常数值实施透明强制,因为编译器内联常数值以便在运行时不需要查找。 常数字段应为安全透明的,以便代码评审阅者不会假定透明代码不能访问常数。

CA2131:安全关键类型不能参与类型等效

某个类型参与了类型等效性,该类型本身或该类型的成员或字段用 SecurityCriticalAttribute 特性标记。 对于任何关键的类型或包含参与类型等效的关键方法或字段的类型,将引发此规则。 当 CLR 检测到这样的类型时,在运行时将不会加载它并引发 TypeLoadException。 通常,仅在用户手动实现类型等效而不是通过依赖 tlbimp 和编译器进行类型等效时,才会触发此规则。

CA2132:默认构造函数必须至少与基类型默认构造函数具有同样的关键性

具有 SecurityCriticalAttribute 的类型和成员无法供 Silverlight 应用程序代码使用。 安全关键类型和成员只能供 .NET Framework for Silverlight 类库中的受信任代码使用。 因为派生类中的某个公共或受保护构造必须有与其基类相同或更大的透明度,所以不能从标记为 SecurityCritical 的类派生应用程序中的类。

CA2133:委托必须绑定到具有一致透明度的方法

将对一个具有以下特点的方法引发此警告:该方法将用 SecurityCriticalAttribute 标记的委托绑定到一个透明的或用 SecuritySafeCriticalAttribute 标记的方法。 还会对另一个具有以下特点的方法引发此警告:该方法将透明的或安全关键的委托绑定到一个关键方法。

CA2134:在重写基方法时,方法必须保持一致的透明度

当用 SecurityCriticalAttribute 标记的方法重写一个透明的或用 SecuritySafeCriticalAttribute 标记的方法时,将引发此规则。 当一个透明的或用 SecuritySafeCriticalAttribute 标记的方法重写一个用 SecurityCriticalAttribute 标记的方法时,也会引发此规则。 该规则在重写虚方法或实现接口时应用。

CA2135:级别 2 程序集不应包含 LinkDemand

在级别为 2 的安全规则集中已弃用 LinkDemand。 现在使用 SecurityCriticalAttribute 特性标记方法、类型和字段,而不是使用 LinkDemand 在实时 (JIT) 编译时进行强制安全检查。

CA2136:成员不应有相互冲突的透明度注释

将透明特性从较大作用域的代码元素应用到较小作用域的元素。 具有较大作用域的代码元素的透明特性优于第一个元素中包含的代码元素的透明特性。 例如,用 SecurityCriticalAttribute 特性标记的类不能包含用 SecuritySafeCriticalAttribute 特性标记的方法。

CA2137:透明方法必须仅包含可验证 IL

某个方法包含无法验证的代码或通过引用返回类型。 在尝试通过安全透明代码执行无法验证的 MSIL(Microsoft 中间语言)时将引发此规则。 但是,此规则不包含完整的 IL 验证程序,而是使用试探法来捕捉 MSIL 验证的大部分冲突。

CA2138:透明方法不得调用具有 SuppressUnmanagedCodeSecurity 特性的方法

一个安全透明方法调用使用 SuppressUnmanagedCodeSecurityAttribute 特性标记的方法。

CA2139:透明方法不能使用 HandleProcessCorruptingExceptions 特性

对于任何透明的并尝试通过使用 HandleProcessCorruptedStateExceptionsAttribute 特性处理进程损坏异常的方法,将引发此规则。 进程损坏异常属于异常的 CLR 版本 4.0 异常分类(例如,AccessViolationException)。 HandleProcessCorruptedStateExceptionsAttribute 特性只由安全关键方法使用,并且如果应用于透明的方法,则将被忽略。

CA2140:透明代码不得引用安全关键项

用 SecurityCriticalAttribute 特性标记的代码元素是安全关键的。 透明方法不能使用安全关键元素。 如果透明类型尝试使用安全关键类型,则会引发 TypeAccessException、MethodAccessException 或 FieldAccessException。

CA2141:透明方法不得满足 LinkDemand

安全透明方法调用未用 AllowPartiallyTrustedCallersAttribute (APTCA) 特性标记的程序集中的方法,或者安全透明方法满足某个类型或方法的 LinkDemand。

CA2142:不应使用 LinkDemand 保护透明代码

对于需要 LinkDemand 来访问它们的透明方法,将会引发此规则。 安全透明代码不应负责验证某个操作的安全,因此不应要求权限。

CA2143:透明方法不应使用安全要求

安全透明代码不应负责验证某个操作的安全,因此不应要求权限。 安全透明代码应使用完整的需求来作出安全决策并且安全关键代码不应依赖透明代码以进行完全的请求。

CA2144:透明代码不应从字节数组加载程序集

透明代码安全检查不像关键代码的安全检查一样全面,因为透明代码不能执行安全敏感的操作。 从字节数组中加载的程序集在不透明的代码中可能不会被注意到,并且该字节数组可能包含确实需要审核的关键或更重要的安全关键代码。

CA2145:不应使用 SuppressUnmanagedCodeSecurityAttribute 修饰透明方法

用 SuppressUnmanagedCodeSecurityAttribute 特性修饰的方法有一个隐式的 LinkDemand 作用于调用它的任何方法。 此 LinkDemand 要求调用代码是关键安全的。 用 SecurityCriticalAttribute 特性标记使用 SuppressUnmanagedCodeSecurity 的方法使此要求对方法的调用方更加明显。

CA2146:类型必须至少与其基类型和接口一样关键

当派生类型具有的安全透明特性与其基类型或实现的接口不是同样关键时,将引发此规则。 只有关键类型可以从关键基类型派生或实现关键接口,并且只有关键或关键安全类型可以从安全关键基类型派生或实现关键安全接口。

CA2147:透明方法不得使用安全断言

标记为 SecurityTransparentAttribute 的代码未被授予足够的权限进行断言。

CA2149:透明方法不得调入本机代码

对于直接调用到本机代码中(例如通过使用 P/Invoke)的任何透明方法,将引发此规则。 违反此规则会导致级别 2 透明度模型中的 MethodAccessException,以及级别 1 透明度模型中对 UnmanagedCode 的完全要求。