Preto, Branco e as Sombras de Cinza
Click here to load reader
-
Upload
er-galvao-abbott -
Category
Technology
-
view
1.953 -
download
1
description
Transcript of Preto, Branco e as Sombras de Cinza
![Page 1: Preto, Branco e as Sombras de Cinza](https://reader038.fdocuments.in/reader038/viewer/2022100602/558613afd8b42a8d428b4619/html5/thumbnails/1.jpg)
CC Attribution-ShareAlike 3.0 Unported License by Er Galvão Abbott – 2010-11-23 – 1 / 16
Preto, BrancoBranco eas Sombras de Cinza:
Filtrando e Validando Strings
![Page 2: Preto, Branco e as Sombras de Cinza](https://reader038.fdocuments.in/reader038/viewer/2022100602/558613afd8b42a8d428b4619/html5/thumbnails/2.jpg)
CC Attribution-ShareAlike 3.0 Unported License by Er Galvão Abbott – 2010-11-23 – 2 / 16
Objetivo
Esta apresentação tem por objetivo apresentar conceitos e soluções para aquestão de tratamento de strings, o tipo de dado mais complexo que podemosencontrar ao receber dados em uma aplicação.
Serão apresentados os seguintes tópicos:
● O que é Filtragem● O que é Validação● Dados de tipos específicos ● Dados com máscaras pré-definidas● Opções de abordagens de Validação e Filtragem● Vantagens e desvantagens de cada abordagem● Exemplos práticos
Embora teoricamente esta apresentação sirva para linguagens em geral, os exemplosserão apresentados em PHP.
![Page 3: Preto, Branco e as Sombras de Cinza](https://reader038.fdocuments.in/reader038/viewer/2022100602/558613afd8b42a8d428b4619/html5/thumbnails/3.jpg)
CC Attribution-ShareAlike 3.0 Unported License by Er Galvão Abbott – 2010-11-23 – 3 / 16
O que é Filtragem
Filtragem é a transformação de um dado, substituindo, removendo e/ou adicionando um ou mais caracteres, de forma que:
● O Dado assuma o tipo esperado● O formato do Dado se torne compatível com a máscara de dados esperada● O valor do Dado possua apenas caracteres legítimos
![Page 4: Preto, Branco e as Sombras de Cinza](https://reader038.fdocuments.in/reader038/viewer/2022100602/558613afd8b42a8d428b4619/html5/thumbnails/4.jpg)
CC Attribution-ShareAlike 3.0 Unported License by Er Galvão Abbott – 2010-11-23 – 4 / 16
O que é Validação
Validação é o processo pelo qual ocorre uma decisão baseada em uma condição. É o teste feito em cima de um dado recebido, decidindo se o dado é ou não válido, atravésde uma ou mais comparações:
● O tipo do Dado é o tipo esperado● O valor do Dado está entre os valores esperados● O formato do Dado é compatível com a máscara de dados esperada● O valor do Dado é coerente
![Page 5: Preto, Branco e as Sombras de Cinza](https://reader038.fdocuments.in/reader038/viewer/2022100602/558613afd8b42a8d428b4619/html5/thumbnails/5.jpg)
CC Attribution-ShareAlike 3.0 Unported License by Er Galvão Abbott – 2010-11-23 – 5 / 16
Como proceder
Ambos os processos (Validação e Filtragem) se completam ao tratarmos de um dadoexterno à nossa aplicação. O primeiro processo a ser aplicado deve ser o de Filtragem.Após a transformação do dado devemos então realizar a Validação final.
![Page 6: Preto, Branco e as Sombras de Cinza](https://reader038.fdocuments.in/reader038/viewer/2022100602/558613afd8b42a8d428b4619/html5/thumbnails/6.jpg)
CC Attribution-ShareAlike 3.0 Unported License by Er Galvão Abbott – 2010-11-23 – 6 / 16
Abordagens
Existem duas abordagens para seguir no momento de realizar qualquer um dos doisprocessos:
● Black List, ou “Lista Negra” : É o processo pelo qual definimos caracteres, substrings e/ou formatos inválidos para o dado.
Exemplos:
“A aspa simples é um caractere inválido”“O sinal de maior e o sinal de menor são caracteres inválidos”
● White List, ou “Lista Branca”: É o processo pelo qual definimos caracteres, substrings e/ou formatos válidos para o dado.
Exemplos:
“Somente letras são considerados caracteres válidos”“Somente números são considerados caracteres válidos
![Page 7: Preto, Branco e as Sombras de Cinza](https://reader038.fdocuments.in/reader038/viewer/2022100602/558613afd8b42a8d428b4619/html5/thumbnails/7.jpg)
CC Attribution-ShareAlike 3.0 Unported License by Er Galvão Abbott – 2010-11-23 – 7 / 16
Black List
A abordagem de Black List é extremamente comum, mas traz problemas que nem sempre são óbvios. Num primeiro olhar usar Black List parece, sem sombra de dúvida,a coisa certa a fazer:
+ É aparentemente lógico;
+ Os casos especificados são seguramente tratados;
+ Nível de dificuldade “fácil”
– É comum ignorarmos casos, por engano ou esquecimento;
– É extremamente complexo prevermos todas as formas de representar um caractere;
– Em casos de aplicações que implementem i18n e l10n a complexidade aumenta
Quando se reflete melhor as coisas começam a se tornar mais claras:
![Page 8: Preto, Branco e as Sombras de Cinza](https://reader038.fdocuments.in/reader038/viewer/2022100602/558613afd8b42a8d428b4619/html5/thumbnails/8.jpg)
CC Attribution-ShareAlike 3.0 Unported License by Er Galvão Abbott – 2010-11-23 – 8 / 16
Black List
Exemplos clássicos de uso equivocado de Black List:
● htmlentities:● Não considera caracteres como: / - ! |● Em certo ponto é preciso fazer o processo inverso, tornando a aplicação igualmentevulnerável
● addslashes/addcslashes:● Não considera representações como URL encoded, por exemplo
● preg_replace('/select|insert|update|delete/', '', $str):● Não considera dezenas de outros comandos como: grant, create, revoke, drop, etc...● Em textos na língua inglesa impede o uso legítimo dos termos
![Page 9: Preto, Branco e as Sombras de Cinza](https://reader038.fdocuments.in/reader038/viewer/2022100602/558613afd8b42a8d428b4619/html5/thumbnails/9.jpg)
CC Attribution-ShareAlike 3.0 Unported License by Er Galvão Abbott – 2010-11-23 – 9 / 16
White List
A abordagem de White List é, via de regra, a coisa certa a se fazer. Ela parece possuirum grau maior de dificuldade (e às vezes isso até é verdade), mas em contrapartida é em geral muito mais segura e precisa do que o uso da Black List.
+ É mais fácil definir o que é válido, reduzindo ou eliminando a possibilidade de erros;
+ Apenas os casos especificados são tratados;
+ Independente de representação;
+ Independente de i18n e l10n
A “dificuldade” em se implementar uma abordagem White List é ilusória. Na verdadeo que acontece é que precisamos realizar processos com os quais não estamos acostumados:
● Conceitualizar o dado● Definir seu tipo, valor, formato e regra de coerência● Dedicar tempo ao planejamento
![Page 10: Preto, Branco e as Sombras de Cinza](https://reader038.fdocuments.in/reader038/viewer/2022100602/558613afd8b42a8d428b4619/html5/thumbnails/10.jpg)
CC Attribution-ShareAlike 3.0 Unported License by Er Galvão Abbott – 2010-11-23 – 10 / 16
White List
Exemplos comentados de uso de White List
Exemplo #1 – Aceitar apenas números
if (!preg_match('/^\d+$/'), $str) { die('Dado inválido!');}
Exemplo #2 – Dados numéricos
if (!(int)$str) { die('Dado inválido!');}
![Page 11: Preto, Branco e as Sombras de Cinza](https://reader038.fdocuments.in/reader038/viewer/2022100602/558613afd8b42a8d428b4619/html5/thumbnails/11.jpg)
CC Attribution-ShareAlike 3.0 Unported License by Er Galvão Abbott – 2010-11-23 – 11 / 16
White List
Exemplo #3 – Data, no formato dd/mm/aaaa
if (!preg_match('/\d{1,2}\/\d{1,2}\/\d{4}$/'), $str) { die('Dado inválido!');}
Exemplo #4 – Números de telefone
if (!preg_match('/^\(\d{2}\)\s*\d+\-*\d+$/'), $str) { die('Dado inválido!');}
![Page 12: Preto, Branco e as Sombras de Cinza](https://reader038.fdocuments.in/reader038/viewer/2022100602/558613afd8b42a8d428b4619/html5/thumbnails/12.jpg)
CC Attribution-ShareAlike 3.0 Unported License by Er Galvão Abbott – 2010-11-23 – 12 / 16
Coerência
Alguns dados necessitam ser coerentes, como o exemplo das datas. A coerência éparte importantíssima do processo de validação. Embora muitas vezes dados incoerentesnão comprometam a segurança da aplicação diretamente não há sentido em armazenarinformações inúteis.
Não esqueça: a aplicação, além de segura, deve ser eficiente!
Alguns exemplos:
Datas de Nascimento:- Obrigatoriamente no passado- Obrigatoriamente com um limite máximo- Opcionalmente com um limite mínimo
Datas de Agendamento:- Obrigatoriamente no futuro- Obrigatoriamente com um limite máximo- Obrigatoriamente com um limite mínimo- Obrigatoriamente dependentes de disponibilidade
![Page 13: Preto, Branco e as Sombras de Cinza](https://reader038.fdocuments.in/reader038/viewer/2022100602/558613afd8b42a8d428b4619/html5/thumbnails/13.jpg)
CC Attribution-ShareAlike 3.0 Unported License by Er Galvão Abbott – 2010-11-23 – 13 / 16
Coerência
Validação coerente de datas? Pura matemática! Com a Unix Timestamp fica simplesde fazer a maioria das verificações do slide anterior. Veja o exemplo:
Exemplo #5 – Data no passado e dentro do limite
$limite = 18 * 3600 * 24 * 365;
$data = mktime(0, 0, 0, $mes, $dia, $ano);
if ((time() - $data) < $limite) { die('Apenas para maiores!');}
![Page 14: Preto, Branco e as Sombras de Cinza](https://reader038.fdocuments.in/reader038/viewer/2022100602/558613afd8b42a8d428b4619/html5/thumbnails/14.jpg)
CC Attribution-ShareAlike 3.0 Unported License by Er Galvão Abbott – 2010-11-23 – 14 / 16
Nem Black List, “nem White List”
E se não pudermos aplicar nenhum dos dois conceitos? Se eu quiser, por exemplo,permitir algumas tags HTML em um texto enviado pelo usuário?
Tecnicamente usaremos quase uma abordagem White List para isso, mas é umexemplo bem mais complexo do que vimos até o momento. Além disso precisamosidentificar, dentro do dado recebido, o que é tag HTML e o que não é.
É justamente nesse ponto que reside a complexidade da situação. Se usarmos umarotina flexível demais corremos o risco de “censurar” conteúdo legítimo – por processartexto comum na informação – ou de deixarmos a aplicação vulnerável.
O método que explicarei aqui é uma sugestão simplificada. Ele está longe, bem longeda perfeição, inclusive possuindo falhas graves que comentarei aqui.
Se você achar uma solução melhor compartilhe!
![Page 15: Preto, Branco e as Sombras de Cinza](https://reader038.fdocuments.in/reader038/viewer/2022100602/558613afd8b42a8d428b4619/html5/thumbnails/15.jpg)
CC Attribution-ShareAlike 3.0 Unported License by Er Galvão Abbott – 2010-11-23 – 15 / 16
Nem Black List, “nem White List”
Exemplo #6 (simplificado e falho) – Encontrando e limitando tags XHTML
$validTags = array('table', 'thead', 'tbody', 'tfoot', 'tr', 'th', td');
preg_match_all('/<[a-z]+/', $str, $foundTags);
foreach ($foundTags[0] as $tag) { if (!in_array(substr($tag, 1), $validTags)) { die("Tag invalida: $tag"); }}
Uma forma mais complexa e mais segura seria a análise caractere-a-caractere. Cadacódigo numérico de cada caractere seria então comparado ao código numérico do sinal demenor, seguido de letras e outros caracteres típicos de tags XHTML, seguido por umaforma de fechamento (barra seguida do nome da tag ou barra seguida do sinal de maior).
O que é realmente importante neste exemplo é a definição da White List (o array do início).
![Page 16: Preto, Branco e as Sombras de Cinza](https://reader038.fdocuments.in/reader038/viewer/2022100602/558613afd8b42a8d428b4619/html5/thumbnails/16.jpg)
CC Attribution-ShareAlike 3.0 Unported License by Er Galvão Abbott – 2010-11-23 – 16 / 16
OBRIGADO!
Sobre o Autor:
Er Galvão Abbott trabalha há mais de 15 anosdesenvolvendo sistemas e aplicações com interface web. Palestra em eventos, dá cursos em diversas instituições e faz parte da organização da PHP Conference Brasil e do Fórum de Software Livre de Curitiba.
Especializou-se em segurança de aplicações web,abordando o tema em uma época quando isso ainda era raro noBrasil. Trabalhou com diversas empresas de grande parte, tantonacionais como internacionais.
Site: http://www.galvao.eti.br/Twitter: @galvaoSlides e Documentos: http://slideshare.net/ergalvao