Ce document explique comment utiliser des vues sécurisées paramétrables dans Cloud SQL pour MySQL, ce qui vous permet de limiter l'accès aux données en fonction de paramètres nommés spécifiques à l'application, tels que les identifiants utilisateur de l'application. Les vues sécurisées paramétrables améliorent la sécurité et le contrôle des accès en étendant les fonctionnalités des vues MySQL. Ces vues atténuent également les risques d'exécution de requêtes non fiables à partir d'applications en appliquant automatiquement un certain nombre de restrictions à toute requête exécutée.
Pour en savoir plus, consultez la section Vues sécurisées paramétrables dans Cloud SQL.
Avant de commencer
Ce document suppose que vous avez déjà créé une instance Cloud SQL pour MySQL.
Assurez-vous que votre instance Cloud SQL exécute MySQL 8.0.43 ou une version ultérieure. Si votre instance MySQL 8.0 exécute une version mineure antérieure, vous pouvez effectuer une mise à niveau de la version mineure.
Activez le flag de base de données
cloudsql_parameterized_secure_viewpour votre instance.Cette modification d'option ne nécessite pas de redémarrer de base de données. Pour en savoir plus, consultez la page Configurer des options de base de données.
Créer une vue sécurisée paramétrable
Pour créer une vue sécurisée paramétrable, exécutez la commande LDD CREATE VIEW.
Exemple :
CREATE VIEW v_orders
AS SELECT * FROM orders
WHERE customer_id = @local_customer_id;
Utilisez la syntaxe suivante :
-- 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
Remplacez les éléments suivants :
VIEW_NAME: nom de la vue sécurisée paramétrableTABLE_NAMEouTABLE_NAME_N: nom de la table ou des tables à utiliser dans la vue paramétrableCOLUMN_NAMEouCOLUMN_NAME_N: nom de la ou des colonnes de table à utiliser dans la vue paramétrableCONDITIONouCONDITION_N: instruction ou instructions de condition à évaluer dans le cadre d'une clauseWHERE,ONouHAVING. Vous pouvez spécifier la variable de session utilisée comme paramètre lorsque vous effectuez ultérieurement une requête sur la vue. Une condition ressemble à ce qui suit :WHERE customer_id = @local_customer_id
Les variables de session,
@variable_name, ne sont autorisées que dans les clausesWHERE,ONouHAVINGd'une instructionCREATE VIEW.
Interroger une vue sécurisée paramétrable
Pour interroger une vue sécurisée paramétrable dans Cloud SQL pour MySQL, vous avez deux possibilités :
Attribuez des valeurs aux variables à l'aide de l'indicateur
SET_VIEW_VARSlorsque vous interrogez la vue sécurisée paramétrable. Si l'une des variables référencées par la vue n'est pas définie ou si des variables non liées apparaissent dans l'indicateurSET_VIEW_VARS, la requête sur la vue sécurisée paramétrable échoue.Appelez la procédure
mysql.execute_parameterized_querypour interroger la vue sécurisée paramétrable. Si vous utilisez la procéduremysql.execute_parameterized_query, vous fournissez deux arguments à la procédure. Le premier argument est une requête sur la vue sécurisée paramétrable sans aucun indicateur concernant la variable de session. Le deuxième argument fournit toutes les variables de session nécessaires et les valeurs que vous souhaitez fournir.
Utiliser des valeurs d'indicateur
Pour interroger la vue sécurisée paramétrable à l'aide de l'indicateur SET_VIEW_VARS, procédez comme suit :
-- Set the parameter and query SELECT /*+ SET_VIEW_VARS(SESSION_VARIABLE = VALUE) */ * FROM VIEW_NAME;
Remplacez les éléments suivants :
SESSION_VARIABLE: paramètre nommé de la vue sécurisée paramétrable pour lequel vous pouvez fournir différentes valeurs. Vous définissez le nom de la variable de session lorsque vous créez la vue à l'aide de la@variable_namenotation dans la clause de condition de la vue.VALUE: valeur de ce paramètre nomméVIEW_NAME: nom de la vue sécurisée paramétrable
Exemple :
SELECT /*+ SET_VIEW_VARS(local_customer_id = 12345) */ *
FROM v_orders;
Utiliser la procédure de requête paramétrable
Pour interroger la vue sécurisée paramétrable à l'aide de la procédure mysql.execute_parameterized_query, utilisez la syntaxe suivante :
CALL mysql.execute_parameterized_query( 'SELECT * FROM DATABASE_NAME.VIEW_NAME', 'SESSION_VARIABLE=VALUE');
Remplacez les éléments suivants :
SESSION_VARIABLE: paramètre nommé de la vue sécurisée paramétrable pour lequel vous pouvez fournir différentes valeurs. Vous définissez le nom de la variable de session lorsque vous créez la vue à l'aide de la@variable_namenotation dans la clause de condition de la vue.VALUE: valeur de ce paramètre nomméDATABASE_NAME: nom de la base de données de la vueVIEW_NAME: nom de la vue sécurisée paramétrable
Exemple :
CALL mysql.execute_parameterized_query(
'SELECT * FROM db.v_orders',
'local_customer_id = 5, earliest_year = 2021');
Restrictions au niveau des requêtes
La liste suivante présente l'ensemble des opérations restreintes pour les requêtes que vous exécutez à l'aide des options décrites dans Interroger une vue sécurisée paramétrable :
- La requête ne peut être qu'une instruction
SELECT. - La requête ne peut pas inclure d'appels à des fonctions ou procédures stockées définies par l'utilisateur.
- La requête ne peut pas attribuer de variables.
- Si vous utilisez la méthode
CALL mysql.execute_parameterized_query, la requête ne peut pas être constituée de plusieurs instructions concaténées en une seule. Par exemple, l'instruction de requêteSELECT * FROM a; DROP TABLE a;n'est pas valide.
Afficher les vues sécurisées paramétrables dans les journaux
Lorsque les utilisateurs de la base de données Cloud SQL pour MySQL tentent de créer une vue sécurisée paramétrable, un message de niveau information est consigné dans le journal d'erreurs MySQL, comme suit :
User variables permitted in %s.%s through Parameterized Secure View feature
Résoudre les problèmes liés aux vues sécurisées paramétrables
| Problème | Dépannage |
|---|---|
Le flag cloud_parameterized_secure_view n'est pas défini pour l'instance
|
Si le flag cloudsql_parameterized_secure_view est défini sur
OFF, toute tentative d'interrogation d'une vue sécurisée paramétrable existante
génère l'erreur suivante :
Si vous tentez de créer une vue sécurisée paramétrable sans que le flag soit défini, l'erreur suivante s'affiche :
Vous pouvez vérifier si les vues sécurisées paramétrables sont activées pour une instance Cloud SQL en vérifiant la variable globale : SHOW VARIABLES LIKE 'cloudsql_parameterized_secure_view'; |
La requête échoue avec l'erreur View's SELECT contains a variable or
parameter. |
Les variables ne sont pas autorisées en dehors des clauses WHERE, HAVING,
ou ON. L'utilisation d'une variable en dehors de ces clauses
génère une erreur. |
La requête échoue avec l'erreur User variable `%s` used in Parameterized Secure View %s
must be set in the query before using SET_VIEW_VARS hint
|
Définissez la variable de session avant d'exécuter la requête. |
| La requête échoue avec une erreur de version MySQL | Si vous essayez d'interroger une vue sécurisée paramétrable existante à partir d'une version de MySQL
antérieure à 8.0.43, l'erreur suivante peut s'afficher :
|