Arquivo

Textos com Etiquetas ‘XML’

[POG] Mascarando dados sigilosos de cartão de crédito

28 de março de 2010

Se você não sabe o que é POG, veja esse post antes.

Imagine que você tenha uma string formatada como um XML, e nesse XML exista um nó com um dado sigiloso, por exemplo, o número de um cartão de crédito. Então você cria um método que recebe essa string e mais um parâmetro com o nome do nó que contém o dado sigiloso. O método irá retornar a mesma string substituindo o valor sigiloso por asteriscos (*).

Por exemplo, para a representação XML abaixo:

<prodis>
  <some_text>Prodis</some_text>
  <sensitive_data>4010098287290192</sensitive_data>
  <some_value>456</some_value>
</prodis>

Queremos o valor “4010098287290192″ presente no nó sensitive_data seja substituído por “****************”. A utilização desse método em C# seria assim:

string xml  = "<prodis>"
       xml += "  <some_text>Prodis</some_text>"
       xml += "  <sensitive_data>4010098287290192</sensitive_data>"
       xml += "  <some_value>456</some_value>"
       xml += "</prodis>"

xml = Util.MaskXmlData(xml, "sensitive_data");

/*
O valor da variável xml agora é:
<prodis>
  <some_text>Prodis</some_text>
  <sensitive_data>****************</sensitive_data>
  <some_value>456</some_value>
</prodis>
*/

Nem vamos entrar no mérito do porquê esse XML está em uma string. Vamos nos concentrar na resolução do problema em questão.

Veja agora como um Pateta implementou esse método utilizando técnicas POG:

{
  public static string MascaraCartaoXml(string xml, string tagAbertura, string tagFechamento)
  {
    string retorno = xml;

    int posicaoInicio = (xml.IndexOf(tagAbertura)) + (tagAbertura.Length);
    int posicaoFim = (xml.IndexOf(tagFechamento));
    string cartao = xml.Substring(posicaoInicio, posicaoFim - posicaoInicio);
    string cartaoMascarado = cartao;

    for (int i = 0; i < cartao.Length; i++)
    {
      cartaoMascarado = cartaoMascarado.Replace(cartao.Substring(i, 1), "*");
    }

    retorno = xml.Replace(tagAbertura + cartao + tagFechamento, tagAbertura + cartaoMascarado + tagFechamento);

    return retorno;
  }
}

Meus comentários a respeito:

  • Que fique bem claro que esse método é única e exclusivamente para mascarar dados de cartão (de crédito?). Qualquer outro texto que não seja cartão não poderá ser mascarado. Será que serve também para cartão telefônico ou cartão de Natal?
  • Você já viu algum XML bem formatado onde o nome da tag de abertura de um nó é diferente do nome da sua tag de fechamento? Talvez no mundo POG isso seja possível.
  • Preciso dizer alguma coisa sobre as linhas 9 a 14 ou posso somente dar risada?

POG , ,