安全警告
安全警告支持更安全的库和应用程序。 这些警告帮助防止程序中出现安全漏洞。 如果您禁用其中的某个警告,您应当在代码中清楚标出原因,同时将您的开发项目通知指定的安全负责人。
本节内容
规则 |
说明 |
---|---|
一个方法使用按该方法的字符串参数生成的字符串设置 System.Data.IDbCommand.CommandText 属性。 此规则假定字符串参数中包含用户输入。 基于用户输入生成的 SQL 命令字符串易于受到 SQL 注入式攻击。 |
|
程序集中未标以 RuntimeCompatibilityAttribute 或标以 RuntimeCompatibility(WrapNonExceptionThrows = false) 的某个成员包含一个处理 System.Exception 的 catch 块,而不包含紧跟其后的一般 catch 块。 |
|
某方法使用命令性安全,并且可能正在使用在请求处于活动状态时可以更改的状态信息或返回值来构造权限。 应尽可能使用声明性安全。 |
|
外部可见类型包含外部可见的只读字段,该字段为可变的引用类型。 可变类型是实例数据可被修改的类型。 |
|
向包含数组的字段应用 readonly(在 Visual Basic 中为 ReadOnly)修饰符时,无法将该字段更改为引用其他数组。 但是,可以更改在只读字段中存储的数组的元素。 |
|
某个方法断言权限,但不对调用方执行任何安全检查。 如果在不执行任何安全检查的情况下断言安全权限,则会在代码中留下可利用的安全漏洞。 |
|
PermitOnly 方法和 CodeAccessPermission.Deny 安全操作只应由掌握 .NET Framework 高级安全知识的人员使用。 应当对使用这些安全操作的代码进行安全检查。 |
|
公共或受保护值类型受数据访问或链接要求保护。 |
|
检测到公共事件处理方法或受保护事件处理方法。 除非绝对必要,否则不应公开事件处理方法。 |
|
指针不是私有、内部或只读指针。 恶意代码可以更改指针的值,这样就有可能访问内存中的任意位置或导致应用程序或系统故障。 |
|
一个公共或受保护类型包含公共字段,并受链接要求保护。 如果代码可以访问受链接要求保护的类型的实例,则该代码不必满足此链接要求就可以访问该类型的字段。 |
|
一个方法不应同时有同一操作的方法级别和类型级别的声明性安全。 |
|
该规则检测由于在非托管代码仍在使用非托管资源时终止该非托管资源而可能发生的错误。 |
|
在完全受信任的程序集具有 APTCA (AllowPartiallyTrustedCallers) 特性时,如果该程序集执行另一个不允许部分受信任调用方的程序集中的代码,则可能存在安全漏洞。 |
|
在完全受信任的程序集具有 APTCA (AllowPartiallyTrustedCallers) 特性时,如果程序集中的某个类型是从不允许部分受信任调用方的类型继承而来,则可能会产生安全漏洞。 |
|
SuppressUnmanagedCodeSecurityAttribute 为执行使用 COM 互操作或平台调用的非托管代码的成员更改默认的安全系统行为。 该特性主要用于提高性能;不过,提高性能的同时会显著增加安全风险。 |
|
可继承的公共类型为 internal(在 Visual Basic 中为 Friend)接口提供可重写的方法实现。 若要修复与此规则的冲突,请禁止方法在程序集外重写。 |
|
此类型的构造函数采用了 System.Runtime.Serialization.SerializationInfo 对象和 System.Runtime.Serialization.StreamingContext 对象(序列化构造函数的签名)。 此构造函数不受安全检查的保护,但类型中的一个或多个常规构造函数受保护。 |
|
系统在创建第一个类型实例或引用任何静态成员之前调用静态构造函数。 如果静态构造函数不是私有,则系统以外的代码可以调用它。 根据构造函数中执行的操作,这可能导致意外行为。 |
|
公共或受保护成员具有链接要求,且由不执行任何安全检查的成员调用。 链接请求仅检查直接调用方的权限。 |
|
该规则将一个方法与其基方法(该基方法为另一个类型中的接口或虚方法)相匹配,然后比较两者的链接请求。 如果与此规则冲突,则恶意调用方只需调用不安全的方法,即可跳过该链接要求。 |
|
公共或受保护方法中含有 try/finally 块。 finally 块似乎要重置安全状态,并且自身不包括在某个 finally 块中。 |
|
一个公共的非密封类型受链接要求保护,并且具有可重写的方法。 类型和方法都不受继承要求保护。 |
|
在完全透明的程序集中不能出现关键代码。 此规则分析完全透明的程序集在类型、字段和方法级别是否有任何 SecurityCritical 批注。 |
|
此规则分析完全透明或混合透明/关键的程序集中的所有方法和类型,并标记 Assert 的任何声明性或命令性用法。 |
|
标有 SecurityTransparentAttribute 的方法调用标为 SecurityCritical 的非公共成员。 此规则分析混合透明/关键的程序集中的所有方法和类型,并标记透明代码中对未标为 SecurityTreatAsSafe 的非公共关键代码的任何调用。 |
未对常数值实施透明强制,因为编译器内联常数值以便在运行时不需要查找。 常数字段应为安全透明的,以便代码评审阅者不会假定透明代码不能访问常数。 |
|
---|---|
某个类型参与了类型等效性,该类型本身或该类型的成员或字段用 SecurityCriticalAttribute 特性标记。 对于任何关键的类型或包含参与类型等效的关键方法或字段的类型,将引发此规则。 当 CLR 检测到这样的类型时,在运行时将不会加载它并引发 TypeLoadException。 通常,仅在用户手动实现类型等效而不是通过依赖 tlbimp 和编译器进行类型等效时,才会触发此规则。 |
|
具有 SecurityCriticalAttribute 的类型和成员无法供 Silverlight 应用程序代码使用。 安全关键类型和成员只能供 .NET Framework for Silverlight 类库中的受信任代码使用。 因为派生类中的某个公共或受保护构造必须有与其基类相同或更大的透明度,所以不能从标记为 SecurityCritical 的类派生应用程序中的类。 |
|
将对一个具有以下特点的方法引发此警告:该方法将用 SecurityCriticalAttribute 标记的委托绑定到一个透明的或用 SecuritySafeCriticalAttribute 标记的方法。 还会对另一个具有以下特点的方法引发此警告:该方法将透明的或安全关键的委托绑定到一个关键方法。 |
|
当用 SecurityCriticalAttribute 标记的方法重写一个透明的或用 SecuritySafeCriticalAttribute 标记的方法时,将引发此规则。 当一个透明的或用 SecuritySafeCriticalAttribute 标记的方法重写一个用 SecurityCriticalAttribute 标记的方法时,也会引发此规则。 该规则在重写虚方法或实现接口时应用。 |
|
在级别为 2 的安全规则集中已弃用 LinkDemand。 现在使用 SecurityCriticalAttribute 特性标记方法、类型和字段,而不是使用 LinkDemand 在实时 (JIT) 编译时进行强制安全检查。 |
|
将透明特性从较大作用域的代码元素应用到较小作用域的元素。 具有较大作用域的代码元素的透明特性优于第一个元素中包含的代码元素的透明特性。 例如,用 SecurityCriticalAttribute 特性标记的类不能包含用 SecuritySafeCriticalAttribute 特性标记的方法。 |
|
某个方法包含无法验证的代码或通过引用返回类型。 在尝试通过安全透明代码执行无法验证的 MSIL(Microsoft 中间语言)时将引发此规则。 但是,此规则不包含完整的 IL 验证程序,而是使用试探法来捕捉 MSIL 验证的大部分冲突。 |
|
一个安全透明方法调用使用 SuppressUnmanagedCodeSecurityAttribute 特性标记的方法。 |
|
对于任何透明的并尝试通过使用 HandleProcessCorruptedStateExceptionsAttribute 特性处理进程损坏异常的方法,将引发此规则。 进程损坏异常属于异常的 CLR 版本 4.0 异常分类(例如,AccessViolationException)。 HandleProcessCorruptedStateExceptionsAttribute 特性只由安全关键方法使用,并且如果应用于透明的方法,则将被忽略。 |
|
用 SecurityCriticalAttribute 特性标记的代码元素是安全关键的。 透明方法不能使用安全关键元素。 如果透明类型尝试使用安全关键类型,则会引发 TypeAccessException、MethodAccessException 或 FieldAccessException。 |
|
安全透明方法调用未用 AllowPartiallyTrustedCallersAttribute (APTCA) 特性标记的程序集中的方法,或者安全透明方法满足某个类型或方法的 LinkDemand。 |
|
对于需要 LinkDemand 来访问它们的透明方法,将会引发此规则。 安全透明代码不应负责验证某个操作的安全,因此不应要求权限。 |
|
安全透明代码不应负责验证某个操作的安全,因此不应要求权限。 安全透明代码应使用完整的需求来作出安全决策并且安全关键代码不应依赖透明代码以进行完全的请求。 |
|
透明代码安全检查不像关键代码的安全检查一样全面,因为透明代码不能执行安全敏感的操作。 从字节数组中加载的程序集在不透明的代码中可能不会被注意到,并且该字节数组可能包含确实需要审核的关键或更重要的安全关键代码。 |
|
用 SuppressUnmanagedCodeSecurityAttribute 特性修饰的方法有一个隐式的 LinkDemand 作用于调用它的任何方法。 此 LinkDemand 要求调用代码是关键安全的。 用 SecurityCriticalAttribute 特性标记使用 SuppressUnmanagedCodeSecurity 的方法使此要求对方法的调用方更加明显。 |
|
当派生类型具有的安全透明特性与其基类型或实现的接口不是同样关键时,将引发此规则。 只有关键类型可以从关键基类型派生或实现关键接口,并且只有关键或关键安全类型可以从安全关键基类型派生或实现关键安全接口。 |
|
标记为 SecurityTransparentAttribute 的代码未被授予足够的权限进行断言。 |
|
对于直接调用到本机代码中(例如通过使用 P/Invoke)的任何透明方法,将引发此规则。 违反此规则会导致级别 2 透明度模型中的 MethodAccessException,以及级别 1 透明度模型中对 UnmanagedCode 的完全要求。 |