Segurança da Informação:

Documentos relacionados
Segurança em Sistemas Web. Addson A. Costa

XSS - CROSS-SITE SCRIPTING

Segurança em aplicações web: pequenas ideias, grandes resultados Prof. Alex Camargo

2.3. PHP Tipos de dados e operadores

PHP & Segurança: Uma União Possível

Internet e Programação Web

UFSM COLÉGIO AGRÍCOLA DE FREDERICO WESTPHALEN CURSO SUPERIOR DE TECNOLOGIA EM SISTEMAS PARA INTERNET. Programação para Internet I

2 echo "PHP e outros.";

SUMÁRIO 1. AULA 6 ENDEREÇAMENTO IP:... 2

Boas Práticas de Desenvolvimento Seguro

Agora OS: Manual Interface Milenial Multimedia

Linguagem de. Aula 06. Profa Cristiane Koehler

Programação Web Prof. Wladimir

Ameaças, riscos e vulnerabilidades Cont. Objetivos

Entendendo como funciona o NAT

AULA APLICAÇÕES PARA WEB SESSÕES E LOGIN E SENHA

Guia de Atualização PROJURIS WEB 4.5. Manual do Técnico Atualização - ProJuris Web 4.5. Manual do Técnico Atualização - ProJuris Web 4.

Você está a um passo do sucesso no seu Marketing de Rede

8VDQGR5HSRUW0DQDJHUFRP&ODULRQH3RVWJUH64/ -XOLR&HVDU3HGURVR 8VDQGRSDUkPHWURV

PHP: Formulários e upload de múltiplos arquivos Por Alfred Reinold Baudisch 28 de fevereiro de 2006.

Programação WEB. Prof. André Gustavo Duarte de Almeida docente.ifrn.edu.br/andrealmeida. Aula III Introdução PHP

Nomes: Questão 1 Vulnerabilidade: SQL Injection (Injeção de SQL):

TUTORIAL MRV CORRETOR

43 11 Relatórios, Listagens e Exportações para Excel, TXT e HTML

3 SERVIÇOS IP. 3.1 Serviços IP e alguns aspectos de segurança

Manual de Integração Web Service

Lição 1 - Criação de campos calculados em consultas

Segurança Web com PHP 5 Douglas V. Pasqua Zend Certified Enginner

Prof. Roberto Franciscatto 4º Semestre - TSI - CAFW. Free Powerpoint Templates Page 1

Revisão: Introdução. - Integração com o AutoManager; 1 Atualização de versão do banco de dados PostgreSQL


Fonte: - Illustration by Gaich Muramatsu

Aulas de PHP Criptografia com Cifra de César. Paulo Marcos Trentin

PHP. Hypertext Pre-Processor

WEBSITE. Como utilizar um site Assistente de Criação para criar seu próprio site

Programação Orientada a Objetos com PHP & MySQL Sistema Gerenciador de Banco de Dados: Introdução e configuração de bases de dados com Postgre e MySQL

Guia de Métricas. Quais métricas acrescentam para a diretoria da empresa?

Introdução ao PHP. Prof. Késsia Marchi

VULNERABILIDADES WEB v.2.2

CURSO DE PROGRAMAÇÃO EM JAVA

Prova de pré-requisito

WHITE PAPER CERTIFICADOS SSL

JSP - ORIENTADO A OBJETOS

Conteúdo Dinâmico. Introdução. Interação Browser x Servidor Web. Interação Browser x Servidor Web

Programação Orientada a Objetos com PHP & MySQL Cookies e Sessões. Prof. MSc. Hugo Souza

MANUAL DE CONDUTA NAS MÍDIAS SOCIAIS

Sistema de Chamados Protega

Transações Seguras em Bancos de Dados (MySQL)

WEBDESIGN. Professor: Paulo Marcos Trentin - paulo@paulotrentin.com.br Escola CDI de Videira

Personalizações do mysuite

TCEnet. Manual Técnico. Responsável Operacional das Entidades

MANUAL PARA UTILIZAÇÃO DO MOODLE FACULDADE INTERAÇÃO AMERICANA VIRTUAL - Versão: Aluno

Os objetivos indicados aplicam-se a duas linguagens de programação: C e PHP

Terceiro Milênio Informática

COMO FUNCIONA UM FORMULÁRIO

LÓGICA DE PROGRAMAÇÃO. Professor Celso Masotti

Distribuidor de Mobilidade GUIA OUTSOURCING

Mais sobre uso de formulários Site sem Ajax

Lista de Revisão. 3. Analise a afirmativa a seguir como verdadeira ou falsa e justifique.

MANUAL DO ALUNO MOODLE

BRAlarmExpert. Software para Gerenciamento de Alarmes. BENEFÍCIOS obtidos com a utilização do BRAlarmExpert:

Desenvolvendo Websites com PHP

Ataques a Aplicações Web

Passo a Passo da instalação da VPN

Sistema Web de Suporte ao Acompanhamento Pedagógico e Administrativo dos Núcleos do PST

(In)Segurança em Aplicações Web. Marcelo Mendes Marinho Thiago Canozzo Lahr

Manual Comunica S_Line

REGISTRANDO DOMÍNIOS, COMO PUBLICAR UM SITE? DIRECIONANDO O DNS. Professor Carlos Muniz

Trecho retirando do Manual do esocial Versão 1.1

MANUAL DO USUÁRIO SORE Sistema Online de Reservas de Equipamento. Toledo PR. Versão Atualização 26/01/2009 Depto de TI - FASUL Página 1

Programação Web com PHP. Prof. Wylliams Barbosa Santos Optativa IV Projetos de Sistemas Web

Estrutura do Trabalho: Fazer um resumo descrevendo o que será visto em cada capítulo do trabalho.

Novo Formato de Logins Manual de Consulta

Conceitos de extensões Joomla!

Processo de Envio de

Como fazer um fluxo de nutrição de leads eficaz

Programando em PHP. Conceitos Básicos

MANUAL DE INSTALAÇÃO

Gerenciamento de software como ativo de automação industrial

Cálculo utilizando variáveis do tipo DATA

COMO COMEÇAR 2016 se organizando?

Guia Rápido do Formulário de Apresentação de Planos de Negócio Inova Energia 01/2013

Introdução a listas - Windows SharePoint Services - Microsoft Office Online

Proposta. Site em Flash (Ramo de Cosméticos) Versão: 01 Data: 09/08/2007 Validade: 30 dias. Para

OPERADORES E ESTRUTURAS DE CONTROLE

Desenvolvendo para WEB

Iniciando o MySQL Query Brower

INTRODUÇÃO AO DESENVOLVIMENTO WEB

Segurança em aplicações Web. Exemplos e Casos Práticos em

Na tela dele, clique no sinal de + ao lado do nome do seu computador, para expandi-lo. A seguir, expanda também o item "Sites da web".

Manual de Integração Web Service. Prefeitura de Ituiutaba/MG

COMO SOLICITAR O CADASTRO DE UM ITEM SSA Central de Cadastro

ECD1200 Equipamento de Consulta de Dados KIT DE DESENVOLVIMENTO

Introdução a Banco de Dados

Omega Tecnologia Manual Omega Hosting

Como gerar arquivos.plt

Transcrição:

Segurança da Informação: Tratando dados em PHP

Objetivo: O objetivo desta palestra é demonstrar os riscos inerentes de se trabalhar com informações externas à aplicações desenvolvidas em PHP, como o descuido pode tornar uma aplicação vulnerável e apresentar conceitos de filtragem, tratamento e limpeza de dados. Tópicos Conceituando dados; Aplicando conceitos no desenvolvimento; Riscos presentes em dados não tratados; Filtragem e tratamento; Referências.

Importância: Filtragem e tratamento de dados é uma questão importantíssima e obrigatória porque a falta de rotinas que implementem estas questões é a causa das principais vulnerabilidades de aplicações: SQL Injection Cross Site Scripting (XSS) Cross Site Request Forgeries (CSRF)

Conceituando dados: Um dado ou informação é tudo o que é externo à aplicação, seja por ser produzido por um meio externo para que esta processe ou produzido por ela mesma para uso posterior. A aplicação utiliza dados para processamento, geração de resultado e/ou comunicação com outros sistemas. Dados geralmente possuem duas características: Tipo: O tipo de dado esperado pela aplicação (presumido) e o tipo do dado de fato (real). Exemplos: strings, números, etc...; Direção: se este dado está sendo informado para a aplicação (input) ou gerado por ela mesma (output).

Conceituando dados Tipo: Ao presumir que um dado será informado para a aplicação com um tipo definido corre-se o risco de, ao receber um dado de tipo diferente, a aplicação seja comprometida. Observe o seguinte exemplo: $sql = SELECT email FROM usuarios WHERE id_usuario=$dado_externo ; Onde, em situações normais, ao receber o dado externo a aplicação monta queries como estas: $sql = SELECT email FROM usuarios WHERE id_usuario=106 ; A falha presente nesta aplicação é uma das mais comuns encontradas no mercado: excesso de confiança e ingenuidade, ou seja, o programador confia em um dado que não é controlado pela aplicação.

Conceituando dados Tipo Quando as coias dão errado: Como nossa aplicação não faz nenhuma espécie de tratamento da informação antes de processá-la, torna-se brincadeira de criança para um cracker enganar a aplicação para que ela assuma um comportamento diferente do esperado e traga o resultado que ele quer: $sql = SELECT email FROM usuarios WHERE id_usuario=0 OR 'x'='x' ; Observe como a perversão do tipo de dado (agora a aplicação está recebendo uma string ao invés de um número inteiro), perverte todo o conceito da aplicação, tornando-a uma ferramenta de coleta de endereços de e-mail de toda a base cadastrada.

Conceituando dados Tipo Assumindo o controle: A solução neste caso é forçarmos o tipo presumido do dado que será recebido por nossa aplicação, de forma que ele se torne, de fato, o tipo correto e dessa forma torne a aplicação mais coerente e segura: settype($dado_externo, 'integer'); $sql = SELECT email FROM usuarios WHERE id_usuario=$dado_externo ; Ao forçar a conversão do tipo de dado, o resultado será diferente para casos diferentes: Caso o dado possua o tipo correto ele não será alterado: 106 => 106 Caso o dado possua um tipo diferente, mas o tipo correto no início, apenas a porção que contém o tipo correto será considerada: 106 or 'x'='x' => 106 Em todos os demais casos, o dado será convertido para o inteiro 0 (zero): 'galvão' or 1=1 => 0

Conceituando dados Direção: A direção de um dado e consequentemente sua origem e/ou destino, é uma caraterística importantíssima à se levar em conta. Esta importância se deve aos seguintes fatores: Forma de entrada de dados: É muito mais simples para um cracker forjar um dado passado por query string do que um dado passado por uma sessão ou formulário que envia informações pelo método POST, por exemplo. Dependendo do destino de um dado após o seu processamento ele deverá receber um tratamento específico antes de ser gravado. Exemplos comuns: Banco de Dados: Deve se fazer o escape de caracteres específicos de forma à evitar ataques de SQL Injection. Gravação de dados para posterior exibição: Deve se fazer o escape de caracteres diferentes, de forma à se evitar ataques de XSS e CSRF.

Conceituando dados Direção (continuação): Direção e, especialmente origem da informação tem sido uma questão polêmica quando falamos especificamente da linguagem PHP. Isto ocorre pela famosa configuração register_globals. A configuração register_globals faz com que o interpretador da linguagem converta, automaticamente, índices de informações que um script está recebendo em variáveis, independentemente da origem da informação.

Conceituando dados Direção (continuação): Considere um formulário HTML típico, onde há um campo oculto chamado 'codigo': <input type= hidden name= codigo value= a983kjas208u762od60pcn1256jsg0il /> Quando consideramos trabalhar com a configuração register_globals, optamos pelo fácil, pelo que é menos trabalhoso e, equivocadamente, mais produtivo: if (in_array($codigo, $codigos_validos)) { //Seu código aqui } else { die('código inválido!'); } A falha, uma vez mais, é o excesso de confiança e ingenuidade: esperamos que a origem da informação seja sempre e inequivocadamente correta.

Conceituando dados Direção Quando as coisas dão errado: Ao desconsiderar a importância da origem da informação, mantemos no caso da configuração register_globals estar ativada, diversas portas desnecessariamente abertas para que o dado nos seja enviado. Torna-se, uma vez mais, fácil forjar o dado e enganar nossa aplicação: http://www.galvao.eti.br/script.php?codigo=askjd2387skdjs118292skdj Confiando apenas no índice da informação à ser recebida, passamos a aceitar esta informação mesmo que ela venha de uma fonte inválida. if (in_array($codigo, $codigos_validos)) { //Seu código aqui } else { die('código inválido!'); }

Conceituando dados Direção Assumindo o controle: A solução torna-se, pura e simplesmente, explicitar a origem da qual o dado deve, obrigatoriamente, proceder: if (in_array($_post['codigo'], $codigos_validos)) { //Seu código aqui } else { die('código inválido!'); } É importante notarmos que, embora parte da culpa por este problema possa ser atribuída à linguagem em si, medidas já foram tomadas para resolver o problema: já faz algum tempo que a configuração register_globals vem desativada por default, e já foi oficialmente anunciado que o PHP 6, a próxima grande versão da linguagem não possuirá mais esta configuração.

Riscos Consequências da falta de filtragem: Observe uma técnica simples de phishing. Esta técnica, como a maioria das outras se baseia na falta de filtragem de informação. Quando recebemos um dado e o tratamos, por exemplo, para evitar um ataque de SQL Injection, esquecemos que este dado pode, em determinado momento, ser exibido em uma tela ou página qualquer. while ($registro = mysql_fetch_assoc($resultado)) { } echo $registro['nome']; Agora considere que, no momento do cadastro, o usuário entrou a seguinte informação: <script language='javascript'>self.location.href='http://www.galvao.eti.br/crack.php';<;script> Ou seja, devemos ainda tomar cuidado com a falsa sensação de segurança: não basta realizarmos tratamento e limpeza de informações quando estas estão entrando, mas é igualmente importante tratá-las antes de enviá-las para a saída.

Técnicas Filtragem, tratamento e limpeza: Como já foi comentado anteriormente, o tratamento de um dado deve ser aplicado considerando-se características específicas deste, como tipo, origem e destino. Existem, porém, algumas recomendações genéricas que valem para qualquer rotina de tratamento e limpeza de informação: Jamais confie cegamente em um dado externo; Seja paranóico, mas cuide para que isso tenha o mínimo de interferência na usabilidade do sistema; Sempre force a tipagem do dado; Sempre explicite a origem do dado; Concentre se no que é aceito como válido para informação ou, na pior hipótese, em caracteres que são indiscutivelmente problemáticos. Evite desenvolver rotinas que possuam foco no bloqueio de caracteres/palavras; Quando for possível utilize soluções prontas e consolidadas;

Técnicas Filtragem, tratamento e limpeza Bancos de Dados: Lembre-se dos caracteres que possuem significado sintático na linguagem SQL: Aspa simples ( ' ): Delimitador de strings; Hífen ( ): Quando usado em dupla ( ) é o comentário SQL; Pipe ( ): Quando usado em dupla ( ) concatena strings; etc... Use soluções consolidadas e confiáveis: mysql_real_escape_string: Função nativa da linguagem; sql_escape_string: Função nativa da linguagem; Classes de abstração de dados, como PDO, MDB2 e ADODB; etc...

Técnicas Filtragem, tratamento e limpeza HTML: Lembre-se dos caracteres que possuem significado sintático na linguagem HTML: Maior, Menor ( >, < ): Delimitador de tags; Ampersand e ponto e vírgula ( &, ; ): Definem entidades que são traduzidas em caracteres HTML automaticamente pelo browser; etc... Use soluções consolidadas e confiáveis: htmlspecialchars: Função nativa da linguagem; htmlentities: Função nativa da linguagem; etc...

Referências: Existe uma variedade de sites que podem auxiliar na construção de aplicações mais coerentes, seguras e menos vulneráveis: Documentação oficial da linguagem: http://docs.php.net/ PHP Security Consortium: http://www.phpsec.org/ Procure por profissionais dedicados à segurança de aplicações PHP: Er Galvão Abbott (RS) Márcio Pessoa (SP) Ricardo Striquer (PR) Procure por eventos que apresentam palestras sobre segurança de aplicações PHP: FISL (RS), CONISLI (SP), Latinoware (PR), PHP Conference Brasil (SP)

Um futuro promissor: Diversas mudanças estão previstas para as próximas versões da linguagem, que certamente possibilitarão ao desenvolvedor icrementar a segurança de suas aplicações: Taint Mode O fim da register_globals Tipagem explícita de parâmetros

Muito Obrigado! Programador, especializado em segurança de aplicações PHP, ministra cursos e presta consultoria na área. galvao@galvao.eti.br / www.galvao.eti.br Fundador e Líder do PUG PHPBR, que conta hoje com mais de 800 associados em todo o Brasil. galvao@phpbr.com.br / www.phpbr.com.br Diretor de Conteúdo da PHP Conference Brasil, o principal evento de PHP da América Latina. PHP Conference Brasil '08: 27, 28 e 29 de Novembro galvao@phpconf.com.br / www.phpconf.com.br