Jump to content

Regular Expressions


Recommended Posts

Posted

Tenho reparado em algumas questões sobre validação de dados que encontro. No que diz respeito a validação de texto temos sempre uma ferramenta potente como as “regular expressions”, e que é bastante eficiente desde que a string de match seja construída correctamente.

As “regular expressions” aparecem em tudo quanto é sitio, e o conhecimento destas merece ser assinalado. Funções de procura, validações, parâmetros de alguns comandos como “grep”.

As validações de dados devem sempre ser executadas. São uma importante parte na segurança. Os dados input devem ser validados quanto ao conteúdo para evitar “code injections” e quanto ao tamanho para evitar “buffer overflow”.

Vamos a alguns exemplos:

[‘#] para evitar SQL injections em MySQL

Esta validação procura por caracteres não permitidos. É uma validação mais solta, já que podemos estar a esquecermo-nos de alguma coisa. Validações mais fortes procuram um formato específico de entrada.

Validação de um e-mail:

^[a-zA-Z][\w\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$

Passo a explicar alguns metacaracteres.

^ obriga a string a começar pela validação da expressão que se segue. Neste caso [a-zA-Z] caracteres alfabéticos. Inclui caracteres do tipo ã, á, etc.

* repete a expressão de validação anterior infinitas vezes. [\w\.-]* aceita palavras, pontos e “hyphens”, com sequências repetidas.

$ obriga a string a acabar com a expressão de validação anterior. [a-zA-Z]$ implica que a string tem de acabar com um carácter alfabético.

\ caracter de escape. Para que o caracter seguinte não tenha significado para o interpretador, mas seja interpretado como outro caracter qualquer.

Validação do tamanho do campo :

^[\w\.-]{0,5}$

Nesta expressão são permitidas palavras, pontos e “hyphens”, mas o tamanho do campo está limitado de 0 a 5 caracteres.

[^0-9]* procura sequências que não contenham numéricos.

Neste caso o metacaracter ^ significa negação da expressão. O que quer dizer que o significado dos metacaracteres dependem do contexto onde são inseridos.

Procurar sequências alternativas:

gato|gatas|gatinhas faz um match de gato, gata ou gatinhas.

| caracter que representa “ou”, varias alternativas.

Para melhor conhecimento desta ferramenta aconselho o link

http://guia-er.sourceforge.net/

Aconselho também a obter uma ferramenta para trabalhar com “regular expressions”. Eu tenho na minha posse o Regex Master 1.0 beta. Mas que neste momento não encontro para download livre, talvez o mesmo tenha passado a versão comercial.

Fiquem bem 😄

Aqui há coisa de 2 anos fazia umas malhas de croché, depois fartei-me e fui para informática!

Posted

Muito bom, mas tenho algumas reparações a fazer:

o [a-zA-Z] não inclui caracteres acentuados (a menos que estejas a usar algum programa "adaptado").

o * também aceita nada

já agora falta explicar porque é que usas \w e \. 😄

Posted

A logica do [a-z] é que siga a tabela de ASCII. Mas no programa de teste que tenho aceita acentuação.

o * também aceita nada

Exacto.

já agora falta explicar porque é que usas \w e \. 😄

Está explicado implicitamente quando falo no caracter \ e quando falo na expressão [\w\.-]*

Foi só uma pequena introdução. O resto da informação sigam o link.

Aqui há coisa de 2 anos fazia umas malhas de croché, depois fartei-me e fui para informática!

Posted

[?#] para evitar SQL injections em MySQL

Esta validação procura por caracteres não permitidos. É uma validação mais solta, já que podemos estar a esquecermo-nos de alguma coisa. Validações mais fortes procuram um formato específico de entrada.

será que me podiam explicar um pouco melhor como é que isto funciona?  😄

Posted

[?#] para evitar SQL injections em MySQL

Esta validação procura por caracteres não permitidos. É uma validação mais solta, já que podemos estar a esquecermo-nos de alguma coisa. Validações mais fortes procuram um formato específico de entrada.

será que me podiam explicar um pouco melhor como é que isto funciona?  😄

Se um input é usado numa query SQL e o mesmo deixar passar caracteres com significado em MySQL, a execução da query está sujeita a alterações.

Tendo em conta que os caracteres ' e # são bestante importantes, estes devem pertencer a uma blacklist de caracteres.

Exemplo:

SELECT * FROM Users WHERE login = '<input_login>' AND pass = '<input_pass>'

sem validações e com <input_login> = x'# o resultado fica

SELECT * FROM Users WHERE login = 'x'# o resto do código são comentários...

Aqui há coisa de 2 anos fazia umas malhas de croché, depois fartei-me e fui para informática!

Posted

Se um input é usado numa query SQL e o mesmo deixar passar caracteres com significado em MySQL, a execução da query está sujeita a alterações.

Tendo em conta que os caracteres ' e # são bestante importantes, estes devem pertencer a uma blacklist de caracteres.

Exemplo:

SELECT * FROM Users WHERE login = '<input_login>' AND pass = '<input_pass>'

sem validações e com <input_login> = x'# o resultado fica

SELECT * FROM Users WHERE login = 'x'# o resto do código são comentários...

Agora imagina que tinhas <input_login> = x'; drop table Users #

Ficavas com

SELECT * FROM Users WHERE login = 'x'; DROP TABLE Users # o resto do código são comentários...

Que além de fazer com que não seja necessária a password ainda fiques sem utilizadores na tua base de dados... E quem diz DROP TABLE diz QUALQUER comando MySql...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.