Como criptografar os parâmetros passados para uma URL?

Visão Geral

As vezes queremos enviar o link de uma tela desenvolvida no Latromi para alguém, de forma que a pessoa que receba este link possa simplesmente clicar e consumir o recurso, sem que seja necessário (ou possível) informar qualquer parâmetro para filtrar os dados.

Para fazer isso usando o Latromi, será necessário a combinação de duas técnicas:

  • Captura de parâmetros de URL
  • Criptografia da URL

A seguir, vamos aprender a usar essas duas técnicas.

Captura de parâmetros de URL

Nos Formulários e Consultas do Latromi, é possível capturar qualquer parâmetro de URL e usá-los nos Procedimentos, Comandos SQL e na passagem de parâmetro.

Ao contrário de quando se utiliza um elemento pré-definido, que pode ser selecionado pelo usuário, como um Campos ou Parâmetros, ao utilizar um Parâmetro de URL ele precisa ser digitado manualmente.

Vamos usar como exemplo a seguinte URL:

https:// latromi.minha-empresa.com.br/web/DynamicForm.aspx?MenuId=123&Numero_NF=999

ou o mesmo endereço, mas com um Caminho amigável para URL:

https:// latromi.minha-empresa.com.br/web/ConsultaNF/?Numero_NF=999

Nosso objeto será capturar o parâmetro de URL Numero_NF, e usá-lo em Comandos SQL ou passagem de parâmetros.

Comando SQL

Para utilizar o parâmetro de URL em um Comando SQL, basta usar o formato já utilizado nos Parâmetros, Campos e etc, usando o prefixo “URL”:

SELECT 
    dtemissao,
    valortotal,
    idcliente
FROM notasfiscais
WHERE numero = {?URL Numero_NF}

Passagem de Parâmetros

Para usar a URL como valor na passagem de parâmetros ou na ação Popular Campos e Variáveis, também vamos usar o formato já utilizado nos Parâmetros, Campos e etc, usando o prefixo “URL”:

URL.Numero_NF

Criptografia da URL

No contexto apresentado neste exemplo, a criptografia da URL é um detalhe muito importante, para impedir que o usuário altere o valor dos parâmetros para tentar acessar outros dados, diferentes daqueles especificados na URL.

URL Fixa

Se você quer criptografar uma URL com parâmetros fixos, que não vão ser alterados com frequência, você pode fazer através dessa página: Criptografia de URL | LATROMI

Nota: Se o endereço do seu site ainda não estiver usando HTTPS, acesse este mesmo endereço usando o protocolo HTTP.

image

No resultado, você tem o endereço da URL criptografado. Este endereço pode ser acessado como se fosse o endereço original, com a segurança de que os parâmetros não estão expostos ao usuário.

URL Dinâmica

Se você precisa gerar uma URL dinâmica em um processo automatizado, será necessário usar a Web API de Criptografia de URL, disponível em qualquer instância do Latromi, no endereço relativo:

Services/CryptoProvider.svc/rest/EncryptUrl

A seguir vamos descobrir como consumir essa Web API via JavaScript e C#.

Usando JavaScript

A função abaixo faz a criptografia da URL consumindo a Web API e devolve o resultado em um callback:

function encryptUrl(url, callback) {
    var latromiBaseURL = "https://latromi.minha-empresa.com.br/web"
    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function () {
        if (this.readyState == 4) {
            if (this.status == 200) {
                var result = JSON.parse(xhttp.responseText);
    
                // Dispara erro
                if (result.status !== "OK")
                    throw new Error(result.message);
    
                callback(result);
            }
            else {
                // Dispara erro
                throw new Error(result.statusText);
            }
        }
    };
    
    xhttp.open("POST", latromiBaseURL + "Services/CryptoProvider.svc/rest/EncryptUrl");
    xhttp.setRequestHeader("Content-Type", "application/json; charset=utf-8");
    xhttp.send(JSON.stringify({ url: url }));
}

Se essa você vai chamar essa função de dentro do Latromi, é possível implementar algumas melhorias.

Usar o endereço relativo da Web API. Neste caso a variável latromiBaseURL não seria necessária:

 xhttp.open("POST", "Services/CryptoProvider.svc/rest/EncryptUrl");

Substituir os disparos de erros por uma mensagens do Latromi:

if (result.status !== "OK")
    ShowMessage(result.message, "ERROR");

O código abaixo pode ser utilizado na ação Executar Código JavaScript dos Procedimentos. Neste exemplo, txtURL é o nome do campo que tem o endereço que será criptografado, e txtResult é o nome do campo onde a URL criptografada será mostrada:

var myForm = latromi.formManager.getFormInstance();
encryptUrl(myForm.getFieldValue('txtURL'), function (result) {
    myForm.setFieldValue('txtResult', result.absoluteUrl); // ou .relativeUrl
});

Usando C#

O código C# que vamos apresentar aqui é voltado para o uso dentro dos Formulários Dinâmicos.

Seguindo a mesma estrutura do exemplo em JavaScript, txtURL é o nome do campo que tem o endereço que será criptografado, e txtResult é o nome do campo onde a URL criptografada será mostrada:

// Adiciona referente de System.Web.Extensions para deserializar o resultado
var assembly = LoadAssembly("System.Web.Extensions.dll");
dynamic serializer = assembly.CreateInstance("System.Web.Script.Serialization.JavaScriptSerializer");

// Endereço que será criptografado
var url = (string)Fields["txtURL"].Value;

// Pega o endereço base do LATROMI
var latromiBaseURL = Environment.BaseUrl;

// Monta a url completa da Web API
var uri = new System.Uri(latromiBaseURL + "/Services/CryptoProvider.svc/rest/EncryptUrl");

// Inicia a requisição
var request = (System.Net.WebRequest)System.Net.WebRequest.Create(uri);
request.Method = "POST";
request.ContentType = "application/json; charset=utf-8";

// Adiciona na requisição o endereço que saerá criptografado
var requestData = Encoding.ASCII.GetBytes(serializer.Serialize(new { url = url }));
using (var stream = request.GetRequestStream())
{
    stream.Write(requestData, 0, requestData.Length);
}

// Consome a Web API
string resultJson = null;
using (var response = request.GetResponse())
using (var stream = response.GetResponseStream())
using (var reader = new System.IO.StreamReader(stream))
{
    // Faz a leitura do retorno
    resultJson = reader.ReadToEnd();
}

// Deserializa o resultado
var result = serializer.Deserialize<dynamic>(resultJson);

// Se o status for "OK", devolve a URL criptografada.
if (result["status"] == "OK")
{
    Fields["txtResult"].Value = result["absoluteUrl"];
}
1 curtida

Boa tarde, Daniel.
Estou criptografando uma url que vai ser enviada por e-mail. Consegui criptografar com o método em JavaScript, e também setei o campo txtResult com o valor da url criptografada. Porém na hora executar o código C# que vai enviar o e-mail, o campo txtResult está nulo.
Poderia me ajudar? Obrigado.

Mudei a absoluteUrl para relativeUrl. E usei um console.log para ver se o campo estava vazio ou não, e no console log ele não está nulo, está com a url criptografada.

var myForm = latromi.formManager.getFormInstance();
encryptUrl(myForm.getFieldValue('txtURL'), function (result) {
    myForm.setFieldValue('txtResult', result.relativeUrl); // ou .relativeUrl
});

Captura de tela 2022-02-25 135827

Porém me parece que na hora que está fora desse código JavaScript o valor continua nulo. No código c# estou chamando o valor assim.

var relUrl = (string)Fields["txtResult"].Value;
1 curtida

Olá @augustonegromonte!
Seja bem vindo a comunidade!

Imagino que você tenha chamado uma ação Executar Código Javascript e depois Executar Código C# no mesmo procedimento.

Quando um evento de Formulário é processado, o sistema executa todos as ações que devem ocorrer do lado do servidor (como por exemplo, comandos SQL e código C#) e reserva as ações que são do lado do navegador (como por exemplo mostrar mensagens e executar código Javascript) para executar no fim da requisição.

Quando você tenta acessar o conteúdo do campo txtResult no lado do servidor ele está vazio, porque o processamento ainda não voltou para o navegador, logo, o código Javascript ainda não foi executado.

Para usar Javascript e acessar o resultado via C#, você precisa executar os dois em eventos separados.

Experimente utilizar dois botões para testar:

  • O primeiro executa o código Javascript
  • O segundo executa o código C#

Se precisa fazer tudo de uma só vez, você deve fazer a criptografia pelo C#.


Se a sua situação não for essa que apresentei, por favor, fornece mais informações

2 curtidas

Bom dia Daniel. Obrigado pelas boas-vindas.

É essa situação mesmo. Eu tentei fazer com Javascript e C# porque não consegui fazer a criptografia só com o C#, mas vou tentar novamente.
Teria como eu salvar esse valor da url em uma variável por JavaScript e usar ele no C#?
Muito obrigado pela ajuda!

1 curtida

Daniel. consegui fazer a criptografia com JavaScript e enviar o e-mail com C#.
Como você realmente falou, coloquei em procedimentos diferentes e funcionou.
Muito obrigado novamente!

2 curtidas