Expressões Regulares para Iniciantes: Como Começar a Descobrir Dados Sensíveis
May 29, 2019
Qualquer solução de descoberta e classificação de dados depende fortemente de expressões regulares (às vezes chamadas de RegExes, REs ou padrões RegEx) para identificar dados sensíveis. Mas o que são RegExes e como podem ser usadas para descobrir dados sensíveis? Vamos descobrir.
As expressões regulares são uma pequena, mas altamente especializada linguagem de programação; basicamente, são curingas turbinados. Utilizando essa pequena linguagem, você especifica regras que definem as sequências de caracteres que deseja encontrar. Por exemplo, pode definir uma RegEx que irá corresponder a endereços de e-mail, PII, PHI ou números de cartões de crédito.
Componentes de Regex
Uma RegEx pode incluir literais e metacaracteres.
Literais
Qualquer caractere único, exceto aqueles reservados como metacaracteres, já é uma expressão regular por si só. Por exemplo, www corresponde a www.Netwrix.com mas wwz não corresponde. Observe que as expressões regulares são sensíveis a maiúsculas e minúsculas, então www não corresponderá a WWW nem a wWw.
Metacaracteres
Os seguintes caracteres únicos não são interpretados literalmente, mas têm significados especiais:
- . ^ $ * + ? { } [ ] | ( )
A tabela a seguir descreve como cada um desses metacaracteres funciona.
Tipo | Meta-caracteres | Descrição | Exemplos |
|---|---|---|---|
|
O ponto |
. |
O ponto significa qualquer caractere. |
net.rix corresponderá tanto a www.netwrix.com quanto a www.netfrix.com. |
|
Classe de personagem |
[] |
Correspondências para qualquer coisa dentro dos colchetes. |
Você pode listar caracteres individualmente; por exemplo, Netwrix corresponderá a netw , netr e netx mas não a netz. |
|
Âncoras |
^ |
Usado para corresponder a caracteres no início de uma string |
^https corresponderá a https://netwrix.com mas não a www.netwrix.com ou http://netwrix.com |
|
$ |
Usado para corresponder a caracteres no final de uma string |
com$ corresponderá a www.netwrix.com ou telecom mas não a computer. |
|
|
Iteração / quantificadores |
? |
Corresponde ao elemento anterior zero ou uma vez (sempre corresponderá se o caractere não for encontrado). É ótimo para encontrar caracteres opcionais. |
cor corresponderá tanto a color quanto a colour. |
|
|
* |
Corresponde ao elemento anterior zero ou mais vezes em vez de zero ou uma vez. É ótimo para encontrar séries opcionais de caracteres. |
ne*t corresponderá a nt (zero caracteres e), net (um caractere e), neeet (três caracteres e), e assim por diante. |
|
+ |
Corresponde ao elemento anterior uma ou mais vezes. |
ne+t corresponderá a net e neeet mas não a nt. |
|
|
| |
O operador de escolha corresponde à expressão antes ou à expressão depois do operador. |
Netwrix corresponderá a Netwrix e Netwrix. |
|
|
{} |
{x} corresponde se o elemento que o precede for encontrado exatamente x vezes. |
n{3} corresponderá a nnn, nnnn e nnnd (porque todos incluem n três vezes seguidas), mas não corresponderá a nnw. |
|
|
Bloqueando e capturando |
() |
Define uma subexpressão que pode ser recuperada mais tarde usando uma abreviação: A primeira subexpressão entre parênteses pode ser recuperada por \1, a segunda pode ser recuperada por \2 e assim por diante. |
Gr(a|e)y will match Gray or Grey. |
|
Sequência de escape |
\ |
O metacaractere que segue a barra será usado como literal. |
www\.netwrix\.com corresponderá a www.netwrix.com mas não a www,netwrix,com. |
|
Caracteres especiais metacharacters |
\s |
Corresponde a qualquer caractere de espaço em branco (um espaço, uma tabulação, uma quebra de linha ou um avanço de formulário). |
Netwrix Auditor corresponderá a Netwrix Auditor, e Netwrix Auditor, mas não a Netwrix Auditor ou NetwrixAuditor. |
|
|
\S |
Corresponde a qualquer caractere que não seja espaço em branco. |
Netwrix corresponderá a Netwrix e a Netwrix. |
|
\w |
Corresponde a qualquer caractere alfanumérico. |
\w\w\w corresponderá a net, dfw e Netwrix. |
|
|
\W |
Corresponde a qualquer caractere não alfanumérico. |
Netwrix\W corresponderá a Netwrix! e Netwrix?. |
|
|
|
\d |
Corresponde a qualquer dígito decimal. |
Netwrix\d\d corresponderá a Netwrix80 e Netwrix90. |
|
\D |
Corresponde a qualquer caractere que não seja um dígito. |
Netwrix\D corresponderá a Netwrix) e Netwrix-. |
|
|
\a |
Corresponde a qualquer caractere alfabético único, seja maiúsculo ou minúsculo. |
Netwrix corresponderá a Netwrix, netfrix e netarix. |
|
|
|
\b |
Define um limite de palavra. |
\brix corresponderá a rix e rixon mas não a Netwrix. |
|
|
\B |
Define um limite que não é de palavra |
\Brix corresponderá a Netwrix e trix mas não a rixon. |
Combinações de metacaracteres
Agora nós conhecemos quase todos os metacaracteres e estamos prontos para combiná-los.
Exemplo: Procurando por números de placas de veículos
Suponha que precisamos encontrar um número de licença no formato aaa-nnnn — os três primeiros dígitos devem ser alfanuméricos e os últimos quatro devem ser numéricos. O hífen pode ser substituído por qualquer caractere ou estar completamente ausente.
A expressão regular para isso será:
- b[0-9A-Z]{3}([^ 0-9A-Z]|s)?[0-9]{4}b
Vamos dissecar esta RegEx:
- b exige um limite de palavra, portanto, as strings correspondentes não podem ser parte de uma string maior.
- [0-9A-Z]{3} significa que os três primeiros caracteres devem ser alfanuméricos.
- ([^ 0-9A-Z]|s)? significa que a próxima parte da string deve ser um delimitador — um caractere não alfanumérico ou um espaço em branco — ou nada.
- [0-9]{4} significa que a próxima parte da string deve ter 4 dígitos.
- b especifica outro limite de palavra.
Esta RegEx corresponderá aos seguintes números de licença: NT5-6345, GH3 9452, XS83289
No entanto, não corresponderá a estes números de licença: ZNT49371, HG3-29347, nt4-9371
Exemplo: Procurando por números de Seguro Social
Outro bom exemplo é o número do Seguro Social dos EUA (SSN), que sempre segue o formato nnn-nn-nnnn.
A RegEx mais fácil é a seguinte:
- [0-9]{3}-[0-9]{2}-[0-9]{4}
No entanto, isso gerará falsos positivos, já que nem todos os números que têm essa forma são SSNs legítimos. Além disso, deixará de identificar alguns SSNs reais, incluindo aqueles que são escritos sem os hífens. Para obter resultados mais precisos, devemos construir um mais complexo. Sabemos que:
- Nenhum grupo de dígitos pode ser composto inteiramente por zeros.
- O primeiro bloco não pode ser 666 ou 900-999.
- Os números de Segurança Social podem ser escritos com caracteres de espaço em branco em vez de hífens, ou sem nenhum delimitador.
- Se o primeiro bloco começar com um 7, deve ser seguido por um número entre 0 e 6 e depois qualquer terceiro dígito.
Portanto, a RegEx avançada será assim:
- b(?!000|666|9d{2})([0-8]d{2}|7([0-6]d))([-]?|s{1})(?!00)dd2(?!0000)d{4}b
Como antes, b no início e no final especificam um limite de palavra. Vamos olhar mais profundamente em cada bloco de números entre eles.
O primeiro bloco
- (?!000|666|9d{2}) é um look-ahead negativo que especifica que o número não deve começar com 000, 666, ou 9 seguido por quaisquer dois dígitos.
- ([0-8]d{2} especifica que a string deve começar com um dígito entre 0 e 8 e ter mais dois dígitos (0-9) após isso.
- |7[0-6]d)) diz que para começar com 7, o próximo dígito deve estar entre 0 e 6, seguido por qualquer dígito.
- ([-]?|s{1}) especifica que após os três dígitos, deve haver um hífen, um caractere de espaço em branco ou nada, para indicar o final do primeiro bloco.
O segundo bloco
- (?!00) é outro look-ahead negativo que especifica que não deve haver 00 no segundo bloco.
- dd especifica que deve haver quaisquer dois dígitos no segundo bloco.
- 2 corresponde ao mesmo texto que o segundo grupo de captura, que é ([-]?|s{1}), portanto, especifica que o segundo bloco pode terminar com um hífen, um caractere de espaço em branco ou nenhum caractere adicional.
O terceiro bloco
- (?!0000) é outro look-ahead negativo que especifica que não podem haver quatro zeros no terceiro bloco.
- d{4} exige quatro dígitos no terceiro bloco do SSN.
Exemplos de RegExes populares
Para encontrar | Use esta RegEx | Exemplo de correspondência |
|---|---|---|
|
Endereços de email |
^[\w\.=-]+@[\w\.-]+\.[\w]{2,3}$ |
T.Simpson@netwrix.com |
|
Números de Segurança Social dos EUA |
\b(?!000|666|9\d{2})([0-8]\d{2}|7([0-6]\d))([-]?|\s{1})(?!00)\d\d\2(?!0000)\d{4}\b |
513-84-7329 |
|
Endereços IPV4 |
^\d{1,3}[.]\d{1,3}[.]\d{1,3}[.]\d{1,3}$ |
192.168.1.1 |
|
Datas no formato MM/DD/AAAA |
^([1][12]|[0]?[1-9])[\/-]([3][01]|[12]\d|[0]?[1-9])[\/-](\d{4}|\d{2})$ |
05/05/2018 |
|
Números do MasterCard |
^(?:5[1-5][0-9]{2}|222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}$ |
5258704108753590 |
|
Números de cartão Visa |
\b([4]\d{3}[\s]\d{4}[\s]\d{4}[\s]\d{4}|[4]\d{3}[-]\d{4}[-]\d{4}[-] |
4563-7568-5698-4587 |
|
Números de cartão American Express |
^3[47][0-9]{13}$ |
34583547858682157 |
|
Códigos ZIP dos EUA |
^((\d{5}-\d{4})|(\d{5})|([A-Z]\d[A-Z]\s\d[A-Z]\d))$ |
97589 |
|
Caminhos de arquivo |
\\[^\\]+$ |
\\fs1\shared |
|
URLs |
(?i)\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+ |
www.netwrix.com |
Recursos úteis da web sobre Regex
- https://regexr.com e https://regex101.com ajudarão você a verificar suas RegExes destacando a sintaxe e as dicas de ferramentas.
- https://regexcrossword.com é um jogo de palavras cruzadas no qual as pistas são definidas usando expressões regulares.
- https://www.regular-expressions.info um ótimo site com informações sobre expressões regulares. Além disso, a ferramenta Notepad++ possui uma extensão de auxílio RegEx que será muito útil enquanto você trabalha com expressões regulares.
Compartilhar em
Saiba Mais
Sobre o autor
Jeff Melnick
Diretor de Engenharia de Sistemas
Jeff é um ex-Diretor de Engenharia de Soluções Globais na Netwrix. Ele é um blogueiro, palestrante e apresentador da Netwrix há muito tempo. No blog da Netwrix, Jeff compartilha lifehacks, dicas e truques que podem melhorar drasticamente sua experiência em administração de sistemas.
Saiba mais sobre este assunto
Os próximos cinco minutos de conformidade: construindo segurança de dados com foco em identidade em toda a APAC
De ruído a ação: transformando risco de dados em resultados mensuráveis
Leis de Privacidade de Dados por Estado: Abordagens Diferentes para a Proteção da Privacidade
Exemplo de Análise de Risco: Como Avaliar Riscos
O Triângulo da CIA e Sua Aplicação no Mundo Real