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.
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.
Abilita il flag di database
cloudsql_parameterized_secure_viewper 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 parametriTABLE_NAMEoTABLE_NAME_N: il nome della tabella o delle tabelle da utilizzare nella vista con parametriCOLUMN_NAMEoCOLUMN_NAME_N: il nome della colonna o delle colonne della tabella da utilizzare nella vista con parametriCONDITIONoCONDITION_N: l'istruzione o le istruzioni di condizione da valutare come parte di una clausolaWHERE,ONoHAVING. 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 clausoleWHERE,ONoHAVINGdi un'istruzioneCREATE 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_VARSdurante l'esecuzione di query sulla vista sicura con parametri. Se una delle variabili a cui fa riferimento la vista non è impostata o se nell'hintSET_VIEW_VARSsono presenti variabili non correlate, la query sulla vista sicura con parametri non riesce.Chiama la procedura
mysql.execute_parameterized_queryper eseguire una query sulla vista sicura con parametri. Se utilizzi la proceduramysql.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_namenotazione nella clausola di condizione della vista.VALUE: un valore per questo parametro denominatoVIEW_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_namenotazione nella clausola di condizione della vista.VALUE: un valore per questo parametro denominatoDATABASE_NAME: nome del database della vistaVIEW_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 querySELECT * 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:
Se tenti di creare una vista sicura con parametri senza impostare il flag, riceverai il seguente errore:
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:
|