Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como criptografar uma função definida pelo usuário no SQL Server


Ao criar uma função definida pelo usuário no SQL Server, você tem a opção de criptografá-la.

Para criar uma função definida pelo usuário com T-SQL, você usa a função CREATE FUNCTION sintaxe. Para criptografá-lo, você adiciona o WITH ENCRYPTION argumento.

Você também pode usar o mesmo argumento para criptografar uma função existente ao usar ALTER FUNCTION .



Quando você criptografa uma função definida pelo usuário dessa maneira, o texto da função é convertido em um formato ofuscado. A definição da função não é diretamente visível em nenhuma exibição de catálogo. Portanto, a definição da função não pode ser visualizada por usuários que não tenham acesso às tabelas do sistema ou aos arquivos do banco de dados.

Exemplo 1 – Função com valor de tabela embutido com criptografia


Aqui está um exemplo de criação de uma função com valor de tabela definida pelo usuário criptografada.
CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) )
    RETURNS TABLE
    WITH ENCRYPTION
AS
RETURN (
    SELECT 
        CatId,
        CatName,
        Phone
    FROM dbo.Cats
    WHERE CatName = @CatName
    );

GO

A parte para criptografar é WITH ENCRYPTION . Eu poderia simplesmente remover esse argumento se não quisesse criptografá-lo.

Depois de criar essa função, agora quando uso o sys.sql_modules visualização do catálogo do sistema para ver sua definição, recebo NULL.
SELECT definition 
FROM sys.sql_modules
WHERE object_id = OBJECT_ID('udf_CatsByName_ITVF');

Resultado:
+--------------+
| definition   |
|--------------|
| NULL         |
+--------------+

E aqui está a mensagem de erro que recebo no Azure Data Studio quando tento fazer o script da função:
No script was returned when scripting as Create on object UserDefinedFunction

E eu receberia uma mensagem semelhante se tentasse visualizá-la no SSMS, DBeaver ou qualquer outro software de gerenciamento de banco de dados GUI.

Exemplo 2 – Função com valor de tabela de várias instruções com criptografia


Aqui está um TVF de várias instruções que faz o mesmo que a função anterior. Os TVFs de várias instruções têm uma sintaxe diferente dos TVFs embutidos. Em TVFs de várias instruções, você coloca a opção de criptografia depois de especificar a variável de retorno.
CREATE FUNCTION [dbo].[udf_CatsByName_MSTVF]( @CatName varchar(70) )
    RETURNS @cats TABLE (
        CatId int,
        CatName varchar(70),
        Phone varchar(10)
    )
    WITH ENCRYPTION
AS
BEGIN
    INSERT INTO @cats
    SELECT 
        CatId,
        CatName,
        Phone
    FROM dbo.Cats
    WHERE CatName = @CatName;

    RETURN;
END;

GO

Exemplo 3 – Função escalar com criptografia


E aqui está um exemplo de uma função escalar criptografada:
CREATE FUNCTION dbo.discountPrice( 
    @price DECIMAL(12,2), 
    @discount DECIMAL(12,2) 
    ) 
RETURNS DECIMAL (12,2) 
WITH ENCRYPTION
AS
BEGIN
  RETURN @price * (1 - @discount);
END;
GO

Exemplo 4 – Adicionar criptografia a uma função existente


Se você deseja criptografar uma função existente, use ALTER FUNCTION com a mesma definição. Em outras palavras, posso pegar o primeiro exemplo e substituir CREATE com ALTER .
ALTER FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) )
    RETURNS TABLE
    WITH ENCRYPTION
AS
RETURN (
    SELECT 
        CatId,
        CatName,
        Phone
    FROM dbo.Cats
    WHERE CatName = @CatName
    );

GO

Isso obviamente pressupõe que o restante da definição da função é exatamente a mesma que a função existente.

A maneira mais fácil de garantir que você está usando a mesma definição é usar sua ferramenta GUI para fazer o script da função existente usando a opção “Script as Alter”, se ela existir. Caso contrário, você pode usar “Script as Create” e, quando a definição aparecer, altere CREATE com ALTER .

Se você tiver apenas uma interface de linha de comando, poderá consultar o sys.sql_modules view para obter a definição existente (como no exemplo anterior). Você pode então copiar a definição e substituir CREATE com ALTER .

Depois de fazer isso, você pode adicionar WITH ENCRYPTION e execute-o novamente.

Exemplo 5 – Adicionando vários argumentos


Você pode especificar vários argumentos como uma lista separada por vírgulas. Por exemplo, se você quiser usar criptografia e você deseja especificar a vinculação de esquema, então você precisa adicioná-los como uma lista separada por vírgulas.
CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) )
    RETURNS TABLE
    WITH SCHEMABINDING, ENCRYPTION
AS
RETURN (
    SELECT 
        CatId,
        CatName,
        Phone
    FROM dbo.Cats
    WHERE CatName = @CatName
    );

GO

Em outras palavras, você especifica apenas WITH uma vez – não há necessidade de repeti-lo para cada argumento.

Observações importantes


Aqui estão algumas coisas que você deve saber sobre a criptografia de funções definidas pelo usuário no SQL Server:
  • Usuários privilegiados que podem acessar as tabelas do sistema pela porta DAC ou acessar diretamente os arquivos do banco de dados ainda poderão visualizar a definição da função (não criptografada).
  • Os usuários que podem anexar um depurador ao processo do servidor podem recuperar o procedimento original da memória em tempo de execução.
  • O uso de criptografia impede que a função seja publicada como parte da replicação do SQL Server.
  • As funções CLR não podem ser criptografadas.