CA2122: Non esporre in modo indiretto metodi con richieste di collegamento
Articolo | Valore |
---|---|
ID regola | CA2122 |
Category | Microsoft.Security |
Modifica | Nessuna interruzione |
Causa
Un membro pubblico o protetto dispone di richieste di collegamento e viene chiamato da un membro che non esegue alcun controllo di sicurezza.
Nota
Questa regola è stata deprecata. Per altre informazioni, vedere Regole deprecate.
Descrizione regola
Una richiesta di collegamento controlla esclusivamente le autorizzazioni del chiamante immediato. Se un membro X
non richiede la sicurezza dei chiamanti e chiama il codice protetto da una richiesta di collegamento, un chiamante senza l'autorizzazione necessaria può usare X
per accedere al membro protetto.
Come correggere le violazioni
Aggiungere una richiesta di dati di sicurezza e modellazione o collegamento al membro in modo che non fornisca più l'accesso non sicuro al membro protetto dalla richiesta di collegamento.
Quando eliminare gli avvisi
Per eliminare in modo sicuro un avviso da questa regola, è necessario assicurarsi che il codice non conceda ai chiamanti l'accesso alle operazioni o alle risorse che possono essere usate in modo distruttivo.
Esempio 1
Gli esempi seguenti illustrano una libreria che viola la regola e un'applicazione che dimostra la debolezza della libreria. La libreria di esempio fornisce due metodi che insieme violano la regola. Il EnvironmentSetting
metodo è protetto da una richiesta di collegamento per l'accesso senza restrizioni alle variabili di ambiente. Il DomainInformation
metodo non richiede la sicurezza dei chiamanti prima di chiamare EnvironmentSetting
.
using System;
using System.IO;
using System.Security;
using System.Security.Permissions;
namespace SecurityRulesLibrary
{
public class DoNotIndirectlyExposeMethodsWithLinkDemands
{
// Violates rule: DoNotIndirectlyExposeMethodsWithLinkDemands.
public static string DomainInformation()
{
return EnvironmentSetting("USERDNSDOMAIN");
}
// Library method with link demand.
// This method holds its immediate callers responsible for securing the information.
// Because a caller must have unrestricted permission, the method asserts read permission
// in case some caller in the stack does not have this permission.
[EnvironmentPermissionAttribute(SecurityAction.LinkDemand, Unrestricted=true)]
public static string EnvironmentSetting(string environmentVariable)
{
EnvironmentPermission envPermission = new EnvironmentPermission( EnvironmentPermissionAccess.Read,environmentVariable);
envPermission.Assert();
return Environment.GetEnvironmentVariable(environmentVariable);
}
}
}
Esempio 2
L'applicazione seguente chiama il membro della libreria non protetto.
using System;
using SecurityRulesLibrary;
using System.Security;
using System.Security.Permissions;
// You have no permission to access the sensitive information,
// but you will get data from the unprotected method.
[assembly:EnvironmentPermissionAttribute(
SecurityAction.RequestRefuse,Unrestricted=true)]
namespace TestUnsecuredMembers
{
class TestUnsecured
{
[STAThread]
static void Main(string[] args)
{
string value = null;
try
{
value = DoNotIndirectlyExposeMethodsWithLinkDemands.DomainInformation();
}
catch (SecurityException e)
{
Console.WriteLine(
"Call to unsecured member was stopped by code access security! {0}",
e.Message);
throw;
}
if (value != null)
{
Console.WriteLine("Value from unsecured member: {0}", value);
}
}
}
}
Nell'esempio viene prodotto l'output seguente:
*Value from unsecured member: seattle.corp.contoso.com
Vedi anche
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per