Este documento descreve como usar visualizações seguras parametrizadas no Cloud SQL para MySQL, que permitem limitar o acesso a dados com base em parâmetros nomeados específicos do aplicativo, como credenciais de usuário do aplicativo. As visualizações seguras parametrizadas melhoram a segurança e o controle de acesso ao estender a funcionalidade das visualizações do MySQL. Essas visualizações também reduzem os riscos de executar consultas não confiáveis de aplicativos, aplicando automaticamente várias restrições a qualquer consulta executada.
Para mais informações, consulte Visualizações seguras parametrizadas no Cloud SQL.
Antes de começar
Neste documento, pressupomos que você já criou uma instância do Cloud SQL para MySQL.
Verifique se a instância do Cloud SQL está executando o MySQL 8.0.43 ou mais recente. Se a instância do MySQL 8.0 estiver executando uma versão secundária anterior, você poderá fazer um upgrade da versão secundária.
Ative a flag de banco de dados
cloudsql_parameterized_secure_viewpara sua instância.Essa mudança de flag não exige a reinicialização do banco de dados. Para mais informações, consulte Configurar flags de banco de dados.
Criar uma visualização segura parametrizada
Para criar uma visualização segura parametrizada, execute o comando DDL CREATE VIEW.
Exemplo:
CREATE VIEW v_orders
AS SELECT * FROM orders
WHERE customer_id = @local_customer_id;
Use a seguinte sintaxe:
-- 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
Substitua:
VIEW_NAME: o nome da visualização segura parametrizadaTABLE_NAMEouTABLE_NAME_N: o nome da tabela ou das tabelas a serem usadas na visualização parametrizada.COLUMN_NAMEouCOLUMN_NAME_N: o nome da coluna ou das colunas da tabela a serem usadas na visualização parametrizadaCONDITIONouCONDITION_N: a instrução ou as instruções de condição a serem avaliadas como parte de uma cláusulaWHERE,ONouHAVING. É possível especificar a variável de sessão usada como parâmetro ao fazer uma consulta na visualização mais tarde. Uma condição é semelhante a esta:WHERE customer_id = @local_customer_id
As variáveis de sessão,
@variable_name, só são permitidas nas cláusulasWHERE,ONouHAVINGde uma instruçãoCREATE VIEW.
Consultar uma visualização segura parametrizada
Para consultar uma visualização segura parametrizada no Cloud SQL para MySQL, você tem duas opções:
Atribua valores às variáveis usando a dica
SET_VIEW_VARSao consultar a visualização segura parametrizada. Se alguma das variáveis referenciadas pela visualização não estiver definida ou se variáveis não relacionadas aparecerem na dicaSET_VIEW_VARS, a consulta na visualização segura parametrizada vai falhar.Chame o procedimento
mysql.execute_parameterized_querypara consultar a visualização segura parametrizada. Se você usar o procedimentomysql.execute_parameterized_query, forneça dois argumentos. O primeiro argumento é uma consulta na visualização segura parametrizada sem dicas sobre a variável de sessão. O segundo argumento fornece todas as variáveis de sessão necessárias e os valores que você quer fornecer.
Usar valores de dica
Para consultar a visualização segura parametrizada usando a dica SET_VIEW_VARS, faça o seguinte:
-- Set the parameter and query SELECT /*+ SET_VIEW_VARS(SESSION_VARIABLE = VALUE) */ * FROM VIEW_NAME;
Substitua:
SESSION_VARIABLE: o parâmetro nomeado da visualização segura parametrizada para o qual você pode fornecer valores diferentes. Você define o nome da variável de sessão ao criar a visualização usando a notação@variable_namena cláusula de condição da visualização.VALUE: um valor para esse parâmetro nomeadoVIEW_NAME: nome da visualização segura parametrizada
Exemplo:
SELECT /*+ SET_VIEW_VARS(local_customer_id = 12345) */ *
FROM v_orders;
Usar o procedimento de consulta parametrizada
Para consultar a visualização segura parametrizada usando o procedimento mysql.execute_parameterized_query, use a seguinte sintaxe:
CALL mysql.execute_parameterized_query( 'SELECT * FROM DATABASE_NAME.VIEW_NAME', 'SESSION_VARIABLE=VALUE');
Substitua:
SESSION_VARIABLE: o parâmetro nomeado da visualização segura parametrizada para o qual você pode fornecer valores diferentes. Você define o nome da variável de sessão ao criar a visualização usando a notação@variable_namena cláusula de condição da visualização.VALUE: um valor para esse parâmetro nomeadoDATABASE_NAME: nome do banco de dados da visualizaçãoVIEW_NAME: nome da visualização segura parametrizada
Exemplo:
CALL mysql.execute_parameterized_query(
'SELECT * FROM db.v_orders',
'local_customer_id = 5, earliest_year = 2021');
Restrições em consultas
A seguir, listamos o conjunto de operações restritas para consultas executadas usando as opções descritas em Consultar uma visualização segura parametrizada:
- A consulta só pode ser uma instrução
SELECT. - A consulta não pode incluir invocações de funções definidas pelo usuário ou procedimentos armazenados.
- A consulta não pode atribuir variáveis.
- Se você usar o método
CALL mysql.execute_parameterized_query, a consulta não poderá ser várias instruções concatenadas em uma única instrução. Por exemplo, a instrução de consultaSELECT * FROM a; DROP TABLE a;não é válida.
Ver visualizações seguras parametrizadas em registros
Quando os usuários do banco de dados do Cloud SQL para MySQL tentam criar uma visualização segura parametrizada, uma mensagem de nível de informação é registrada no registro de erros do MySQL, semelhante à seguinte:
User variables permitted in %s.%s through Parameterized Secure View feature
Resolver problemas de visualizações seguras parametrizadas
| Problema | Solução de problemas |
|---|---|
A flag cloud_parameterized_secure_view não está definida para a instância
|
Se a flag cloudsql_parameterized_secure_view estiver definida como
OFF, qualquer tentativa de consultar uma visualização segura parametrizada
vai resultar no seguinte erro:
Se você tentar criar uma visualização segura parametrizada sem definir a flag, vai receber o seguinte erro:
Para verificar se as visualizações seguras parametrizadas estão ativadas em uma instância do Cloud SQL, confira a variável global: SHOW VARIABLES LIKE 'cloudsql_parameterized_secure_view'; |
A consulta falha com o erro View's SELECT contains a variable or
parameter. |
Variáveis não são permitidas fora das cláusulas WHERE, HAVING ou ON. Usar uma variável fora dessas cláusulas
resulta em um erro. |
A consulta falha com o erro User variable `%s` used in Parameterized Secure View %s
must be set in the query before using SET_VIEW_VARS hint
|
Defina a variável de sessão antes de executar a consulta. |
| A consulta falha com um erro de versão do MySQL | Se você tentar consultar uma visualização segura parametrizada de uma versão do MySQL
anterior à 8.0.43, poderá encontrar o seguinte erro:
|