• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

shumy

Regular Expressions

7 mensagens neste tópico

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 :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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 \. :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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 \. :D

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

[?#] 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?  :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

[?#] 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?  :D

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...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora