Tipos protegidos não devem expor campos
TypeName |
SecuredTypesShouldNotExposeFields |
CheckId |
CA2112 |
Category (Categoria) |
Microsoft.segurança |
Quebrando alterar |
Quebrando |
Causa
Um tipo público ou protegido contém campos públicos e é protegido por um Demandas de link.
Descrição da regra
Se o código tiver acesso a uma instância de um tipo que é protegido por uma demanda de link, o código não tem que atender à demanda de link para acessar os campos do tipo.
Como corrigir violações
Para corrigir uma violação dessa regra, tornar os campos confidenciais e adicionar propriedades públicas ou métodos que retornam os dados do campo.LinkDemand verificações de segurança em tipos de protegem o acesso a propriedades e métodos do tipo.No entanto, a segurança de acesso do código não se aplica a campos.
Quando suprimir avisos
Para questões de segurança e para um mercadoria design, você deve corrigir violações fazendo nonpublic campos públicos.Você pode suprimir um aviso da regra, se o campo não contém informações que devem permanecer protegidas e não dependem do Sumário do campo.
Exemplo
O exemplo a seguir é composto de um tipo de biblioteca (SecuredTypeWithFields) com campos não seguras, um tipo (Distributor) que pode criar instâncias do tipo de biblioteca e instâncias de passagens incorreta para tipos não tem permissão para criar o código-las e aplicativo que pode ler campos uma ocorrência de, mesmo que ele não tenha a permissão que protege o tipo.
O seguinte código de biblioteca viola a regra.
using System;
using System.Reflection;
using System.Security;
using System.Security.Permissions;
namespace SecurityRulesLibrary
{
// This code requires immediate callers to have full trust.
[System.Security.Permissions.PermissionSetAttribute(
System.Security.Permissions.SecurityAction.LinkDemand,
Name="FullTrust")]
public class SecuredTypeWithFields
{
// Even though the type is secured, these fields are not.
// Violates rule: SecuredTypesShouldNotExposeFields.
public double xValue;
public double yValue;
public SecuredTypeWithFields (double x, double y)
{
xValue = x;
yValue = y;
Console.WriteLine(
"Creating an instance of SecuredTypeWithFields.");
}
public override string ToString()
{
return String.Format (
"SecuredTypeWithFields {0} {1}", xValue, yValue);
}
}
}
O aplicativo não é possível criar uma instância devido a demanda de link que protege o tipo de seguro.A classe a seguir habilita o aplicativo obter uma instância de tipo seguro.
using System;
using System.Reflection;
using System.Security;
using System.Security.Permissions;
// This assembly executes with full trust.
namespace SecurityRulesLibrary
{
// This type creates and returns instances of the secured type.
// The GetAnInstance method incorrectly gives the instance
// to a type that does not have the link demanded permission.
public class Distributor
{
static SecuredTypeWithFields s = new SecuredTypeWithFields(22,33);
public static SecuredTypeWithFields GetAnInstance ()
{
return s;
}
public static void DisplayCachedObject ()
{
Console.WriteLine(
"Cached Object fields: {0}, {1}", s.xValue , s.yValue);
}
}
}
O aplicativo a seguir ilustra como sem permissão para acesso métodos do tipo protegido, o código pode acesso seus campos.
using System;
using System.Security;
using System.Security.Permissions;
using SecurityRulesLibrary;
// This code executes with partial trust.
[assembly: System.Security.Permissions.PermissionSetAttribute(
System.Security.Permissions.SecurityAction.RequestRefuse,
Name = "FullTrust")]
namespace TestSecurityExamples
{
public class TestLinkDemandOnField
{
[STAThread]
public static void Main()
{
// Get an instance of the protected object.
SecuredTypeWithFields secureType = Distributor.GetAnInstance();
// Even though this type does not have full trust,
// it can directly access the secured type's fields.
Console.WriteLine(
"Secured type fields: {0}, {1}",
secureType.xValue,
secureType.yValue);
Console.WriteLine("Changing secured type's field...");
secureType.xValue = 99;
// Distributor must call ToString on the secured object.
Distributor.DisplayCachedObject();
// If the following line is uncommented, a security
// exception is thrown at JIT-compilation time because
// of the link demand for full trust that protects
// SecuredTypeWithFields.ToString().
// Console.WriteLine("Secured type {0}",secureType.ToString());
}
}
}
O exemplo produz a seguinte saída.
Creating an instance of SecuredTypeWithFields. Secured type fields: 22, 33 Changing secured type's field... Cached Object fields: 99, 33
Regras relacionadas
Não declarará campos de instância visível