Utilizzare viste sicure con parametri

Questo documento descrive come utilizzare le viste sicure con parametri in Cloud SQL per MySQL, che consentono di limitare l'accesso ai dati in base a parametri denominati specifici dell'applicazione, come le credenziali utente dell'applicazione. Le viste sicure con parametri migliorano la sicurezza e il controllo dell'accesso estendendo la funzionalità delle viste MySQL. Queste viste riducono anche i rischi di esecuzione di query non attendibili dalle applicazioni applicando automaticamente una serie di restrizioni a qualsiasi query eseguita.

Per ulteriori informazioni, consulta Viste sicure con parametri in Cloud SQL.

Prima di iniziare

Questo documento presuppone che tu abbia già creato un'istanza Cloud SQL per MySQL.

  1. Assicurati che l'istanza Cloud SQL esegua MySQL 8.0.43 o versioni successive. Se la tua istanza MySQL 8.0 esegue una versione secondaria precedente, puoi eseguire un upgrade della versione secondaria.

  2. Abilita il flag di database cloudsql_parameterized_secure_view per la tua istanza.

    Questa modifica del flag non richiede il riavvio del database. Per ulteriori informazioni, consulta Configurare i flag di database.

Creare una vista sicura con parametri

Per creare una vista sicura con parametri, esegui il comando DDL CREATE VIEW. Ad esempio:

CREATE VIEW v_orders
AS SELECT * FROM orders
WHERE customer_id = @local_customer_id;

Utilizza la seguente sintassi:

-- Create a view with a parameter using the WHERE clause
CREATE VIEW VIEW_NAME AS
SELECT * FROM TABLE_NAME
WHERE CONDITION;
-- Create a view with a parameter using the HAVING clause
CREATE VIEW VIEW_NAME AS
SELECT * FROM TABLE_NAME
WHERE CONDITION_1      -- row level security
GROUP BY COLUMN_NAME
HAVING CONDITION_2;    -- grouping
-- Create a view with a parameter using the ON clause
CREATE VIEW VIEW_NAME AS
SELECT * FROM TABLE_NAME_1
JOIN TABLE_NAME_2
ON CONDITION_1       --  join criteria
WHERE CONDITION_2;   --  row level security

Sostituisci quanto segue:

  • VIEW_NAME: il nome della vista sicura con parametri
  • TABLE_NAME o TABLE_NAME_N: il nome della tabella o delle tabelle da utilizzare nella vista con parametri
  • COLUMN_NAME o COLUMN_NAME_N: il nome della colonna o delle colonne della tabella da utilizzare nella vista con parametri
  • CONDITION o CONDITION_N: l'istruzione o le istruzioni di condizione da valutare come parte di una clausola WHERE, ON o HAVING. Puoi specificare la variabile di sessione utilizzata come parametro quando esegui una query sulla vista in un secondo momento. Una condizione è simile alla seguente:

    WHERE customer_id = @local_customer_id

    Le variabili di sessione, @variable_name, sono consentite solo all'interno delle clausole WHERE, ON o HAVING di un'istruzione CREATE VIEW.

Eseguire una query su una vista sicura con parametri

Per eseguire una query su una vista sicura con parametri in Cloud SQL per MySQL, hai due opzioni:

  • Assegna valori alle variabili utilizzando l'hint SET_VIEW_VARS durante l'esecuzione di query sulla vista sicura con parametri. Se una delle variabili a cui fa riferimento la vista non è impostata o se nell'hint SET_VIEW_VARS sono presenti variabili non correlate, la query sulla vista sicura con parametri non riesce.

  • Chiama la procedura mysql.execute_parameterized_query per eseguire una query sulla vista sicura con parametri. Se utilizzi la procedura mysql.execute_parameterized_query, devi fornire due argomenti alla procedura. Il primo argomento è una query sulla vista sicura con parametri senza hint sulla variabile di sessione. Il secondo argomento fornisce tutte le variabili di sessione necessarie e i valori che vuoi fornire.

Utilizzare i valori degli hint

Per eseguire una query sulla vista sicura con parametri utilizzando l'hint SET_VIEW_VARS:

-- Set the parameter and query
SELECT /*+ SET_VIEW_VARS(SESSION_VARIABLE = VALUE) */ *
FROM VIEW_NAME;

Sostituisci quanto segue:

  • SESSION_VARIABLE: il parametro denominato della vista sicura con parametri per cui puoi fornire valori diversi. Definisci il nome della variabile di sessione quando crei la vista utilizzando la @variable_name notazione nella clausola di condizione della vista.
  • VALUE: un valore per questo parametro denominato
  • VIEW_NAME: nome della vista sicura con parametri

Ad esempio:

SELECT /*+ SET_VIEW_VARS(local_customer_id = 12345) */ *
FROM v_orders;

Utilizzare la procedura di query con parametri

Per eseguire una query sulla vista sicura con parametri utilizzando la procedura mysql.execute_parameterized_query, utilizza la seguente sintassi:

CALL mysql.execute_parameterized_query(
  'SELECT * FROM DATABASE_NAME.VIEW_NAME',
  'SESSION_VARIABLE=VALUE');

Sostituisci quanto segue:

  • SESSION_VARIABLE: il parametro denominato della vista sicura con parametri per cui puoi fornire valori diversi. Definisci il nome della variabile di sessione quando crei la vista utilizzando la @variable_name notazione nella clausola di condizione della vista.
  • VALUE: un valore per questo parametro denominato
  • DATABASE_NAME: nome del database della vista
  • VIEW_NAME: nome della vista sicura con parametri

Ad esempio:

   CALL mysql.execute_parameterized_query(
    'SELECT * FROM db.v_orders',
    'local_customer_id = 5, earliest_year = 2021');

Restrizioni sulle query

Di seguito è riportato l'insieme di operazioni con restrizioni per le query eseguite utilizzando le opzioni descritte in Eseguire una query su una vista sicura con parametri:

  • La query può essere solo un'istruzione SELECT.
  • La query non può includere chiamate a funzioni definite dall'utente o stored procedure.
  • La query non può assegnare variabili.
  • Se utilizzi il metodo CALL mysql.execute_parameterized_query, la query non può essere costituita da più istruzioni concatenate in una singola istruzione. Ad esempio, l'istruzione di query SELECT * FROM a; DROP TABLE a; non è valida.

Visualizzare le viste sicure con parametri nei log

Quando gli utenti del database Cloud SQL per MySQL tentano di creare una vista sicura con parametri, viene registrato un messaggio a livello di informazioni nel log degli errori di MySQL simile al seguente:

 User variables permitted in %s.%s through Parameterized
 Secure View feature

Risolvere i problemi relativi alle viste sicure con parametri

Problema Risoluzione dei problemi
Il flag cloud_parameterized_secure_view non è impostato per l'istanza Se il flag cloudsql_parameterized_secure_view è impostato su OFF, qualsiasi tentativo di eseguire una query su una vista sicura con parametri esistente genererà il seguente errore:

Cannot operate on a Parameterized Secure View without `cloudsql_parameterized_secure_view` being set. Please turn the flag on first before querying Parameterized Secure Views

Se tenti di creare una vista sicura con parametri senza impostare il flag, riceverai il seguente errore:

View's SELECT contains a variable or parameter

Puoi verificare se le viste sicure con parametri sono abilitate per un'istanza Cloud SQL controllando la variabile globale:

SHOW VARIABLES LIKE 'cloudsql_parameterized_secure_view';
La query non riesce e viene visualizzato l'errore View's SELECT contains a variable or parameter. Le variabili non sono consentite al di fuori delle clausole WHERE, HAVING, o ON. L'utilizzo di una variabile al di fuori di queste clausole genera un errore.
La query non riesce e viene visualizzato l'errore User variable `%s` used in Parameterized Secure View %s must be set in the query before using SET_VIEW_VARS hint Imposta la variabile di sessione prima di eseguire la query.
La query non riesce e viene visualizzato un errore relativo alla versione di MySQL Se tenti di eseguire una query su una vista sicura con parametri esistente da una versione di MySQL precedente alla 8.0.43, potresti riscontrare il seguente errore:

Variable %s found in view %s. Please upgrade to 8.0.43 or above to use Parameterized Secure Views

Passaggi successivi