Configurazione della visibilità dei metadatiMetadata Visibility Configuration

La visibilità dei metadati è limitata alle entità a protezione diretta di cui l'utente è proprietario o per le quali dispone di autorizzazioni.The visibility of metadata is limited to securables that a user either owns or on which the user has been granted some permission. Ad esempio, la query seguente restituisce una riga se all'utente è stata concessa un'autorizzazione SELECT o INSERT per la tabella myTable.For example, the following query returns a row if the user has been granted a permission such as SELECT or INSERT on the table myTable.

SELECT name, object_id  
FROM sys.tables  
WHERE name = 'myTable';  
GO  

Se invece l'utente non dispone di alcuna autorizzazione per myTable, la query restituisce un set di risultati vuoto.However, if the user does not have any permission on myTable, the query returns an empty result set.

Ambito e impatto della configurazione della visibilità dei metadatiScope and Impact of Metadata Visibility Configuration

È possibile configurare la visibilità dei metadati unicamente per le entità a protezione diretta seguenti:Metadata visibility configuration only applies to the following securables.

Viste del catalogoCatalog views Stored procedure Motore di databaseDatabase Engine sp_help sp_help stored procedures
Metadati che espongono funzioni predefiniteMetadata exposing built-in functions Viste degli schemi delle informazioniInformation schema views
Viste di compatibilitàCompatibility views Proprietà esteseExtended properties

Non è possibile configurare la visibilità dei metadati per le entità a protezione diretta seguenti:Metadata visibility configuration does not apply to the following securables.

Tabelle di sistema per il log shippingLog shipping system tables SQL ServerSQL Server Tabelle di sistema dell'agente Agent system tables
Tabelle di sistema del piano di manutenzione databaseDatabase maintenance plan system tables Tabelle di sistema di backupBackup system tables
Tabelle di sistema di replicaReplication system tables Replica e stored procedure SQL ServerSQL Server sp_help dell'agente Replication and SQL ServerSQL Server Agent sp_help stored procedures

Un'accessibilità limitata ai metadati comporta quanto segue:Limited metadata accessibility means the following:

  • Le applicazioni per cui è impostato l'accesso pubblico ai metadati verranno interrotte.Applications that assume public metadata access will break.

  • È possibile che le query eseguite su viste di sistema restituiscano solo un subset di righe o a volte un set di risultati vuoto.Queries on system views might only return a subset of rows, or sometimes an empty result set.

  • È possibile che le funzioni predefinite per la creazione di metadati quali OBJECTPROPERTYEX restituiscano NULL.Metadata-emitting, built-in functions such as OBJECTPROPERTYEX may return NULL.

  • È possibile che le stored procedure Motore di databaseDatabase Engine sp_help restituiscano solo un subset di righe o NULL.The Motore di databaseDatabase Engine sp_help stored procedures might return only a subset of rows, or NULL.

    I moduli SQL, ad esempio le stored procedure e i trigger, vengono eseguiti nel contesto di sicurezza del chiamante e pertanto la relativa accessibilità ai metadati è limitata.SQL modules, such as stored procedures and triggers, run under the security context of the caller and, therefore, have limited metadata accessibility. Nel codice di esempio seguente, quando la stored procedure tenta di accedere ai metadati relativi alla tabella myTable per la quale il chiamante non dispone di alcun diritto, viene restituito un set di risultati vuoto.For example, in the following code, when the stored procedure tries to access metadata for the table myTable on which the caller has no rights, an empty result set is returned. Nelle versioni precedenti di SQL ServerSQL Server, viene invece restituita una riga.In earlier releases of SQL ServerSQL Server, a row is returned.

CREATE PROCEDURE assumes_caller_can_access_metadata  
BEGIN  
SELECT name, id   
FROM sysobjects   
WHERE name = 'myTable';  
END;  
GO  

Per consentire ai chiamanti di visualizzare i metadati, è possibile concedere loro l'autorizzazione VIEW DEFINITION in un ambito appropriato, che può essere a livello di oggetto, di database o di server.To allow callers to view metadata, you can grant the callers VIEW DEFINITION permission at an appropriate scope: object level, database level or server level. Nell'esempio precedente, se il chiamante dispone dell'autorizzazione VIEW DEFINITION per myTable, la stored procedure restituisce pertanto una riga.Therefore, in the previous example, if the caller has VIEW DEFINITION permission on myTable, the stored procedure returns a row. Per altre informazioni, vedere GRANT (Transact-SQL) e Autorizzazioni di database GRANT (Transact-SQL).For more information, see GRANT (Transact-SQL) and GRANT Database Permissions (Transact-SQL).

È inoltre possibile modificare la stored procedure in modo che venga eseguita con le credenziali del proprietario.You can also modify the stored procedure so that it executes under the credentials of the owner. Se il proprietario della stored procedure è anche proprietario della tabella, verrà applicata la concatenazione della proprietà e il contesto di sicurezza del proprietario della procedura consentirà di accedere ai metadati relativi a myTable.When the procedure owner and the table owner are the same owner, ownership chaining applies, and the security context of the procedure owner enables access to the metadata for myTable. In questo scenario, il codice seguente restituisce una riga di metadati al chiamante.Under this scenario, the following code returns a row of metadata to the caller.

Nota

Nell'esempio seguente viene usata la vista del catalogo sys.objects anziché la vista di compatibilità sys.sysobjects .The following example uses the sys.objects catalog view instead of the sys.sysobjects compatibility view.

CREATE PROCEDURE does_not_assume_caller_can_access_metadata  
WITH EXECUTE AS OWNER  
AS  
BEGIN  
SELECT name, id  
FROM sys.objects   
WHERE name = 'myTable'   
END;  
GO  

Nota

Per passare temporaneamente al contesto di sicurezza del chiamante, è possibile utilizzare EXECUTE AS.You can use EXECUTE AS to temporarily switch to the security context of the caller. Per altre informazioni, vedere EXECUTE AS (Transact-SQL).For more information, see EXECUTE AS (Transact-SQL).

Vantaggi e limiti della configurazione della visibilità dei metadatiBenefits and Limits of Metadata Visibility Configuration

La configurazione della visibilità dei metadati svolge un ruolo importante per il piano di sicurezza globale.Metadata visibility configuration can play an important role in your overall security plan. In alcuni casi, tuttavia, un utente esperto potrebbe essere in grado di forzare la diffusione di alcuni metadati.However, there are cases in which a skilled and determined user can force the disclosure of some metadata. È pertanto consigliabile prevedere un ulteriore livello di protezione tramite l'implementazione di autorizzazioni per i metadati.We recommend that you deploy metadata permissions as one of many defenses-in-depth.

In teoria, è possibile forzare la creazione di metadati nei messaggi di errore modificando l'ordine di valutazione del predicato nelle query.It is theoretically possible to force the emission of metadata in error messages by manipulating the order of predicate evaluation in queries. La possibilità di attacchi trial-and-error di questo tipo non è specifica di SQL ServerSQL Server,The possibility of such trial-and-error attacks is not specific to SQL ServerSQL Server. ma è implicita nelle trasformazioni associative e commutative consentite nell'algebra relazionale.It is implied by the associative and commutative transformations permitted in relational algebra. È possibile ridurre questo rischio limitando le informazioni restituite nei messaggi di errore.You can mitigate this risk by limiting the information returned in error messages. Per limitare ulteriormente la visibilità dei metadati in questo modo, è possibile avviare il server con il flag di traccia 3625,To further restrict the visibility of metadata in this way, you can start the server with trace flag 3625. che limita la quantità di informazioni visualizzate nei messaggi di errore.This trace flag limits the amount of information shown in error messages. Questa soluzione contribuisce a limitare la diffusione forzata di informazioni,In turn, this helps to prevent forced disclosures. ma è controbilanciata dal fatto che i messaggi di errore saranno concisi e potrebbero essere difficili da utilizzare a scopi di debug.The tradeoff is that error messages will be terse and might be difficult to use for debugging purposes. Per altre informazioni, vedere Opzioni di avvio del servizio del motore di database e Flag di traccia (Transact-SQL).For more information, see Database Engine Service Startup Options and Trace Flags (Transact-SQL).

I metadati seguenti non sono soggetti alla diffusione forzata:The following metadata is not subject to forced disclosure:

  • Valore archiviato nella colonna provider_string di sys.servers.The value stored in the provider_string column of sys.servers. Un utente che non dispone dell'autorizzazione ALTER ANY LINKED SERVER sarà in grado di visualizzare unicamente un valore NULL in questa colonna.A user that does not have ALTER ANY LINKED SERVER permission will see a NULL value in this column.

  • La definizione dell'origine di un oggetto definito dall'utente, ad esempio una stored procedure o un trigger.Source definition of a user-defined object such as a stored procedure or trigger. Il codice sorgente è visibile solo se è vera una delle condizioni seguenti:The source code is visible only when one of the following is true:

    • L'utente dispone dell'autorizzazione VIEW DEFINITION per l'oggetto.The user has VIEW DEFINITION permission on the object.

    • All'utente non è stata negata l'autorizzazione VIEW DEFINITION per l'oggetto ed è stata concessa l'autorizzazione CONTROL, ALTER o TAKE OWNERSHIP per l'oggetto.The user has not been denied VIEW DEFINITION permission on the object and has CONTROL, ALTER, or TAKE OWNERSHIP permission on the object. Per tutti gli altri utenti verranno visualizzati valori NULL.All other users will see NULL.

  • Le colonne di definizione delle viste del catalogo seguenti:The definition columns found in the following catalog views:

    sys.all_sql_modulessys.all_sql_modules sys.sql_modulessys.sql_modules
    sys.server_sql_modulessys.server_sql_modules sys.check_constraintssys.check_constraints
    sys.default_constraintssys.default_constraints sys.computed_columnssys.computed_columns
    sys.numbered_proceduressys.numbered_procedures
  • Colonna ctext nella vista di compatibilità syscomments .The ctext column in the syscomments compatibility view.

  • Output della procedura sp_helptext .The output of the sp_helptext procedure.

  • Le colonne seguenti nelle viste degli schemi delle informazioni:The following columns in the information schema views:

    INFORMATION_SCHEMA.CHECK_CONSTRAINTS.CHECK_CLAUSEINFORMATION_SCHEMA.CHECK_CONSTRAINTS.CHECK_CLAUSE INFORMATION_SCHEMA.COLUMNS.COLUMN_DEFAULTINFORMATION_SCHEMA.COLUMNS.COLUMN_DEFAULT
    INFORMATION_SCHEMA.DOMAINS.DOMAIN_DEFAULTINFORMATION_SCHEMA.DOMAINS.DOMAIN_DEFAULT INFORMATION_SCHEMA.ROUTINE_COLUMNS.COLUMN_DEFAULTINFORMATION_SCHEMA.ROUTINE_COLUMNS.COLUMN_DEFAULT
    INFORMATION_SCHEMA.ROUTINES.ROUTINE_DEFINITIONINFORMATION_SCHEMA.ROUTINES.ROUTINE_DEFINITION INFORMATION_SCHEMA.VIEWS.VIEW_DEFINITIONINFORMATION_SCHEMA.VIEWS.VIEW_DEFINITION
  • La funzione OBJECT_DEFINITION()OBJECT_DEFINITION() function

  • Valore archiviato nella colonna password_hash di sys.sql_logins.The value stored in the password_hash column of sys.sql_logins. Un utente che non dispone dell'autorizzazione CONTROL SERVER sarà in grado di visualizzare unicamente un valore NULL in questa colonna.A user that does not have CONTROL SERVER permission will see a NULL value in this column.

Nota

Le definizioni SQL delle procedure e delle funzioni di sistema predefinite sono visibili a livello pubblico tramite la vista del catalogo sys.system_sql_modules , la stored procedure sp_helptext e la funzione OBJECT_DEFINITION().The SQL definitions of built-in system procedures and functions are publicly visible through the sys.system_sql_modules catalog view, the sp_helptext stored procedure, and the OBJECT_DEFINITION() function.

Principi generali della visibilità dei metadatiGeneral Principles of Metadata Visibility

Di seguito sono illustrati alcuni principi generali da tenere in considerazione per la visibilità dei metadati:The following are some general principles to consider regarding metadata visibility:

  • Autorizzazioni implicite dei ruoli predefinitiFixed roles implicit permissions

  • Ambito delle autorizzazioniScope of permissions

  • Precedenza di DENYPrecedence of DENY

  • Visibilità dei metadati dei sottocomponentiVisibility of subcomponent metadata

Autorizzazioni implicite dei ruoli predefinitiFixed Roles and Implicit Permissions

I metadati accessibili ai ruoli predefiniti variano in base alle autorizzazioni implicite corrispondenti.Metadata that can be accessed by fixed roles depends upon their corresponding implicit permissions.

Ambito delle autorizzazioniScope of Permissions

Le autorizzazioni valide in un ambito implicano la possibilità di visualizzare i metadati dell'ambito specifico e di tutti gli ambiti dipendenti.Permissions at one scope imply the ability to see metadata at that scope and at all enclosed scopes. Ad esempio, l'autorizzazione SELECT per uno schema implica che il beneficiario dispone dell'autorizzazione SELECT per tutte le entità a protezione diretta contenute nello schema specifico.For example, SELECT permission on a schema implies that the grantee has SELECT permission on all securables that are contained by that schema. Se si concede a un utente l'autorizzazione SELECT per uno schema, l'utente potrà pertanto visualizzare i metadati dello schema e tutte le tabelle, le viste, le funzioni, le procedure, le code nonché i sinonimi, i tipi e le raccolte XML Schema in esso contenuti.The granting of SELECT permission on a schema therefore enables a user to see the metadata of the schema and also all tables, views, functions, procedures, queues, synonyms, types, and XML schema collections within it. Per altre informazioni, vedere Gerarchia delle autorizzazioni (Motore di database).For more information about scopes, see Permissions Hierarchy (Database Engine).

Precedenza di DENYPrecedence of DENY

DENY ha in genere la precedenza sulle altre autorizzazioni.DENY typically takes precedence over other permissions. Ad esempio, se a un utente del database viene concessa l'autorizzazione EXECUTE per uno schema, ma gli viene negata l'autorizzazione EXECUTE per una stored procedure dello schema specifico, l'utente non potrà visualizzare i metadati relativi alla stored procedure.For example, if a database user is granted EXECUTE permission on a schema but has been denied EXECUTE permission on a stored procedure in that schema, the user cannot view the metadata for that stored procedure.

Inoltre, se a un utente viene negata l'autorizzazione EXECUTE per uno schema ma viene concessa l'autorizzazione EXECUTE per una stored procedure dello schema specifico, l'utente non potrà visualizzare i metadati relativi alla stored procedure.Additionally, if a user is denied EXECUTE permission on a schema but has been granted EXECUTE permission on a stored procedure in that schema, the user cannot view the metadata for that stored procedure.

Infine, se a un utente viene concessa e negata l'autorizzazione EXECUTE per una stored procedure, cosa che può accadere nel caso di appartenenza a diversi ruoli, DENY ha la precedenza e l'utente non potrà visualizzare i metadati della stored procedure.For another example, if a user has been granted and denied EXECUTE permission on a stored procedure, which is possible through your various role memberships, DENY takes precedence and the user cannot view the metadata of the stored procedure.

Visibilità dei metadati dei sottocomponentiVisibility of Subcomponent Metadata

La visibilità dei sottocomponenti, quali gli indici, i vincoli CHECK e i trigger, è determinata dalle autorizzazioni per il componente padre.The visibility of subcomponents, such as indexes, check constraints, and triggers is determined by permissions on the parent. A questi sottocomponenti non è possibile concedere autorizzazioni.These subcomponents do not have grantable permissions. Ad esempio, se a un utente sono state concesse autorizzazioni per una tabella, l'utente potrà visualizzare i metadati relativi a tabelle, colonne, indici, vincoli CHECK, trigger e altri sottocomponenti.For example, if a user has been granted some permission on a table, the user can view the metadata for the tables, columns, indexes, check constraints, triggers, and other such subcomponents.

Metadati accessibili a tutti gli utenti del databaseMetadata That Is Accessible to All Database Users

Alcuni metadati devono essere accessibili a tutti gli utenti di un database specifico.Some metadata must be accessible to all users in a specific database. Ad esempio, non è possibile concedere autorizzazioni per i filegroup e pertanto non è possibile concedere a un utente l'autorizzazione per la visualizzazione dei metadati di un filegroup.For example, filegroups do not have conferrable permissions; therefore, a user cannot be granted permission to view the metadata of a filegroup. Tutti gli utenti che possono creare una tabella devono tuttavia essere in grado di accedere ai metadati dei filegroup per poter usare le clausole filegroup ON o filegroup TEXTIMAGE_ON dell'istruzione CREATE TABLE.However, any user that can create a table must be able to access filegroup metadata to use the ON filegroup or TEXTIMAGE_ON filegroup clauses of the CREATE TABLE statement.

I metadati restituiti dalle funzioni DB_ID() e DB_NAME() sono visibili a tutti gli utenti.The metadata that is returned by the DB_ID() and DB_NAME() functions is visible to all users.

Nella tabella seguente sono elencate le viste del catalogo visibili al ruolo pubblico .The following table lists the catalog views that are visible to the public role.

sys.partition_functionssys.partition_functions sys.partition_range_valuessys.partition_range_values
sys.partition_schemessys.partition_schemes sys.data_spacessys.data_spaces
sys.filegroupssys.filegroups sys.destination_data_spacessys.destination_data_spaces
sys.database_filessys.database_files sys.allocation_unitssys.allocation_units
sys.partitionssys.partitions sys.messagessys.messages
sys.schemassys.schemas sys.configurationssys.configurations
sys.sql_dependenciessys.sql_dependencies sys.type_assembly_usagessys.type_assembly_usages
sys.parameter_type_usagessys.parameter_type_usages sys.column_type_usagessys.column_type_usages

Vedere ancheSee Also

GRANT (Transact-SQL) GRANT (Transact-SQL)
DENY (Transact-SQL) DENY (Transact-SQL)
REVOKE (Transact-SQL) REVOKE (Transact-SQL)
Clausola EXECUTE AS (Transact-SQL) EXECUTE AS Clause (Transact-SQL)
Viste del catalogo (Transact-SQL) Catalog Views (Transact-SQL)
Viste della compatibilità (Transact-SQL) Compatibility Views (Transact-SQL)