Segurança em Aplicações
Web com PHP


 Segurança em Aplicações Web com PHP             V Ensol
 Gedvan Dias                           22 de julho de 2011
Sobre mim
●
    Mestre em Informática pela UFPB
●
    Professor substituto no IFPB
       –   C, PHP, Comércio Eletrônico

●
    Professor na Faculdade IDEZ
       –   HTML/CSS/PHP

●
    Lexa Sistemas – www.lexasistemas.com.br
       –   Criação de sites em Drupal

●
    Letz – www.letz.com.br
       –   Rede social para divulgação de eventos

       Segurança em Aplicações Web com PHP                    V Ensol
       Gedvan Dias                                  22 de julho de 2011
Esta palestra é sobre
●
    Segurança em aplicações web
       –   Boas práticas de programação
       –   Erros comuns
       –   Detalhes do PHP
       –   Tipos de ataques a sites
       –   Autenticação e autorização
       –   Foco na implementação com PHP
            ●
                Pode ser aplicado para outras linguagens




      Segurança em Aplicações Web com PHP                            V Ensol
      Gedvan Dias                                          22 de julho de 2011
Esta palestra não é sobre
●
    Segurança de servidores
       –   Configuração de servidores
       –   Firewalls
       –   DNS, FTP, SSH, HTTPS, …
       –   DoS, IP spoofing, phising, …
       –   Spam




      Segurança em Aplicações Web com PHP             V Ensol
      Gedvan Dias                           22 de julho de 2011
Segurança e a linguagem PHP
●
    Por que PHP?
●
    PHP surgiu de forma despretensiosa
●
    Acabou se tornando a linguagem server-side
    mais utilizada na web
       –   Facilidade, rapidez, versatilidade, etc.




      Segurança em Aplicações Web com PHP                       V Ensol
      Gedvan Dias                                     22 de julho de 2011
Segurança e a linguagem PHP
●
    Grandes poderes trazem grandes
    responsabilidades
●
    Programadores inexperientes
●
    Autodidatismo é bom, mas...
       –   Aprendo apenas o que me interessa
       –   Questões importantes acabam ficando de lado

●
    Prazos apertados...


      Segurança em Aplicações Web com PHP                     V Ensol
      Gedvan Dias                                   22 de julho de 2011
Alguns casos recentes
●
    Site Mysql.com tem banco de dados
    comprometido [1]
          –   Ataque via SQL Injection
          –   Acesso a usuários, senhas, e-mails, etc.




[1] http://www.computerworld.com/s/article/9215249/MySQL_Web_site_falls_victim_to_SQL_injection_attack



        Segurança em Aplicações Web com PHP                                                     V Ensol
        Gedvan Dias                                                                   22 de julho de 2011
Alguns casos recentes
●
    Sony
     
         Sony Pictures[1]
     
         Sony Japan[2]
     
         Sony Greece[3]
     
         Sony Canada[4]


[1] http://www.bbc.co.uk/news/technology-13642145
[2] http://nakedsecurity.sophos.com/2011/05/24/sony-music-japan-hacked-through-sql-injection-flaw/
[3] http://nakedsecurity.sophos.com/2011/05/22/sony-bmg-greece-the-latest-hacked-sony-site/
[4] http://www.computerworld.com/s/article/9217028/Sony_says_hacker_stole_2_000_records_from_Canadian_site




         Segurança em Aplicações Web com PHP                                                           V Ensol
         Gedvan Dias                                                                        22 de julho de 2011
Alguns casos recentes
●
    Sites do Governo Brasileiro
       –   Vários órgãos públicos tiveram seu site atacado
       –   Portal Brasil, Presidência, Senado, Receita Federal, IBGE,
           entre outros
       –   Ataques de DoS, defacements e alguns roubos de dados




      Segurança em Aplicações Web com PHP                          V Ensol
      Gedvan Dias                                        22 de julho de 2011
Vamos ao que interessa
                  Show me the code!




Segurança em Aplicações Web com PHP             V Ensol
Gedvan Dias                           22 de julho de 2011
Configurações do PHP
●
    register_globals
    
        Variáveis globais são criadas automaticamente a
        partir de parâmetros GET, POST, cookies, sessões,
        etc.
    
        Desabilitado por padrão a partir do PHP 4.2
    
        Depracated no PHP 5.3




        Segurança em Aplicações Web com PHP               V Ensol
        Gedvan Dias                             22 de julho de 2011
Tratamento de erros
●
    Algumas configurações relacionadas a erros:
    
        error_reporting: nível de erro a ser reportado
         –   E_ALL ou E_ALL | E_STRICT
    
        display_errors: exibir ou não erros na tela
         –   Em produção, deve ser sempre desabilitado
    
        log_errors: fazer log dos erros em arquivo
    
        error_log: arquivo onde será feito log




        Segurança em Aplicações Web com PHP                        V Ensol
        Gedvan Dias                                      22 de julho de 2011
Manipulação de erros
●
    set_error_handler()
    
        Permite usar uma função própria para o
        tratamento dos erros
●
    set_exception_handler()
    
        Permite usar uma função para tratar exceções não
        capturadas




        Segurança em Aplicações Web com PHP                V Ensol
        Gedvan Dias                              22 de julho de 2011
set_error_handler()




Segurança em Aplicações Web com PHP             V Ensol
Gedvan Dias                           22 de julho de 2011
Recomendações
                e boas práticas




Segurança em Aplicações Web com PHP             V Ensol
Gedvan Dias                           22 de julho de 2011
Programação defensiva
●
    “Prevenir é melhor do que remediar”
●
    A internet não é um lugar amigável
●
    Um plano B pode salvar a sua vida (seu
    emprego, sua reputação, etc.)
●
    Pense sempre em minimizar os riscos




      Segurança em Aplicações Web com PHP              V Ensol
      Gedvan Dias                            22 de julho de 2011
KISS
●
    Keep It Simple, Stupid
●
    Evite a complexidade desnecessária
●
    Abra mão da “esperteza” em prol da segurança




      Segurança em Aplicações Web com PHP             V Ensol
      Gedvan Dias                           22 de julho de 2011
KISS




Segurança em Aplicações Web com PHP             V Ensol
Gedvan Dias                           22 de julho de 2011
Regra de Ouro
     Toda entrada deve ser filtrada
   e toda saída deve ser “escapada”




Segurança em Aplicações Web com PHP             V Ensol
Gedvan Dias                           22 de julho de 2011
Filtro e Validação
●
    Você está recebendo o que está esperando
    receber?
●
    Trate todo o input da sua aplicação
       –   Dados de formulários
       –   Parâmetros da URL
       –   Informações de cookies
       –   Dados de sistemas externos

●
    Validação x Filtro (sanitizing)


      Segurança em Aplicações Web com PHP             V Ensol
      Gedvan Dias                           22 de julho de 2011
Validação x Filtro

              CPF      241.775.842-31

   filtro/sanitizing                      validação



   24177584231                        Erro! Formato inválido!




Segurança em Aplicações Web com PHP                             V Ensol
Gedvan Dias                                           22 de julho de 2011
API Data Filtering
●
    Funções para tratar o input usando vários tipos
    de filtro/validação
●
    Disponível a partir do PHP 5.2
●
    Pode substituir totalmente o acesso aos arrays
    superglobais
       –   $_GET, $_POST, $_COOKIE, $_SERVER, $_ENV




      Segurança em Aplicações Web com PHP                   V Ensol
      Gedvan Dias                                 22 de julho de 2011
filter_input




Segurança em Aplicações Web com PHP             V Ensol
Gedvan Dias                           22 de julho de 2011
Escapando a Saída
●
    Regra de ouro: … toda saída deve ser
    “escapada”
       –   Pelo menos a toda a saída não confiável

●
    O que quer dizer “escapar”?
       –   Vem do inglês escape
       –   Nesse contexto, quer dizer que devemos converter
           determinados caracteres (ou sequências)

●
    Objetivo: manter a integridade da saída


      Segurança em Aplicações Web com PHP                      V Ensol
      Gedvan Dias                                    22 de julho de 2011
Escapando o HTML
●
    A saída mais comum do PHP é o HTML
●
    No HTML temos, basicamente:
    
        Tags (abertura, fechamento, atributos)
         –   Definem a estrutura do documento
    
        Conteúdo das tags (valores, texto)
●
    Escape no HTML significa, normalmente,
    impedir que hajam tags onde não deveria
    haver

        Segurança em Aplicações Web com PHP                V Ensol
        Gedvan Dias                              22 de julho de 2011
Escapando o HTML
●
    Funções: htmlespecialchars(), htmlentities()
●
    API Data Filtering: filter_input(), filter_var()




      Segurança em Aplicações Web com PHP               V Ensol
      Gedvan Dias                             22 de julho de 2011
Principais Tipos de Ataques e
      Vulnerabilidades



Segurança em Aplicações Web com PHP             V Ensol
Gedvan Dias                           22 de julho de 2011
SQL Injection
●
    Consiste em tentar inserir um trecho de código
    SQL em uma query que será enviada a um
    banco de dados




      Segurança em Aplicações Web com PHP             V Ensol
      Gedvan Dias                           22 de julho de 2011
SQL Injection




Segurança em Aplicações Web com PHP             V Ensol
Gedvan Dias                           22 de julho de 2011
Exploits of a mom




Segurança em Aplicações Web com PHP             V Ensol
Gedvan Dias                           22 de julho de 2011
SQL Injection
●
    SQL Injection é uma das vulnerabilidades mais
    comuns em aplicações PHP
       –   Felizmente, é muito fácil se proteger contra esse tipo de
           ataque

●
    Basta escapar os dados enviados nas queries
       –   Lembra da regra de ouro?
       –   Ao utilizar banco de dados, as queries são dados de
           saída (output) da aplicação
       –   Portanto, devem ser escapadas

      Segurança em Aplicações Web com PHP                         V Ensol
      Gedvan Dias                                       22 de julho de 2011
Escapando Valores de Queries
●
    Para escapar os valores enviados ao banco,
    pode-se usar as funções de cada extensão
       –   MySQL: mysql_real_escape_string()
       –   PostgreSQL: pg_escape_string()
       –   …
       –   Em último caso, pode-se usar a função addslashes()

●
    Interfaces OO e camadas de abstração
    geralmente têm um método equivalente
       –   PDO: quote()


      Segurança em Aplicações Web com PHP                        V Ensol
      Gedvan Dias                                      22 de julho de 2011
Bound Parameters
●
    As camadas de abstração, normalmente,
    também tem suporte a parâmetros bound
         –   O valores são vinculados através de marcadores
         –   A própria biblioteca faz o escape dos dados
    
        Oferecem uma ótima proteção contra SQL
        Injection




        Segurança em Aplicações Web com PHP                       V Ensol
        Gedvan Dias                                     22 de julho de 2011
Escape de Identificadores
●
    Normalmente, apenas os valores precisam ser
    escapados
●
    Em alguns casos, também é preciso escapar
    (ou filtrar) os identificadores
       –   Nomes de tabelas e campos
       –   Nos casos onde eles vêm de uma fonte externa

●
    No MySQL, os identificadores pode ser escritos
    entre crases.
       –   Ex: SELECT * FROM `tablename`

      Segurança em Aplicações Web com PHP                      V Ensol
      Gedvan Dias                                    22 de julho de 2011
XSS
                Cross-Site Scripting




Segurança em Aplicações Web com PHP              V Ensol
Gedvan Dias                            22 de julho de 2011
Cross-Site Scripting
●
    Também é um dos tipos mais comuns de
    ataques
●
    Toda aplicação que exibe dados recebidos
    (input) corre riscos
    
        Se esses dados não forem devidamente filtrados e
        escapados, a aplicação estará vulnerável




        Segurança em Aplicações Web com PHP              V Ensol
        Gedvan Dias                            22 de julho de 2011
Cross-Site Script
●
    O atacante normalmente explorará essa falha
    inserindo tags e código javascript no seu HTML
       –   Tags <iframe> chamando páginas maliciosas
       –   Código js para redirecionar o usuário para outras
           páginas
       –   Código js para ler os cookies do usuário e enviá-los para
           outros sites
       –   Código js para alterar as informações do site
           (defacement)




      Segurança em Aplicações Web com PHP                          V Ensol
      Gedvan Dias                                        22 de julho de 2011
Cross-Site Scripting
●
    Para se proteger de XSS, basta fazer o que já
    foi dito
    
        Filtrar a entrada, e
    
        Escapar a saída
         –   htmlentities, htmlespecialchars, etc.




        Segurança em Aplicações Web com PHP                    V Ensol
        Gedvan Dias                                  22 de julho de 2011
Cross-Site Scripting




                      Demonstração




Segurança em Aplicações Web com PHP             V Ensol
Gedvan Dias                           22 de julho de 2011
CSRF
          Cross-Site Request Forgery




Segurança em Aplicações Web com PHP              V Ensol
Gedvan Dias                            22 de julho de 2011
CSRF
●
    Como o nome diz, consiste em tentar forjar
    uma requisição de um site para outro
●
    O atacante usa a própria vítima para fazer a
    requisição, sem que ela tenha conhecimento
●
    Portanto, é muito difícil identificar se uma
    requisição é legítima ou um ataque CSRF



      Segurança em Aplicações Web com PHP             V Ensol
      Gedvan Dias                           22 de julho de 2011
CRSF



Uma linha de código vale mais que mil palavras

                        (demonstração)




  Segurança em Aplicações Web com PHP              V Ensol
  Gedvan Dias                            22 de julho de 2011
CSRF
●
    Então como se defender do CSRF?




      Segurança em Aplicações Web com PHP             V Ensol
      Gedvan Dias                           22 de julho de 2011
GET x POST
●
    Antes de tudo
    
        Entenda a diferença entre GET e POST
    
        Funcionamento
    
        Objetivos
    
        Saiba quando usar cada um




        Segurança em Aplicações Web com PHP              V Ensol
        Gedvan Dias                            22 de julho de 2011
GET
●
    O método GET deve ser utilizado apenas para
    consultas
    
        Exibição de páginas
    
        Listagens
    
        Pesquisas
    
        Downloads, etc.




        Segurança em Aplicações Web com PHP             V Ensol
        Gedvan Dias                           22 de julho de 2011
POST
●
    O método POST deve ser utilizado para as
    operações
    
        Cadastros
    
        Atualização
    
        Exclusão
    
        Autenticação




        Segurança em Aplicações Web com PHP             V Ensol
        Gedvan Dias                           22 de julho de 2011
GET
●
    Não use o GET para realizar operações*
●
    Nada que vá modificar os seus dados
●
    Dessa forma, os ataques CSRF via GET não
    causarão nenhum dano




      Segurança em Aplicações Web com PHP             V Ensol
      Gedvan Dias                           22 de julho de 2011
Operações via GET
●
    Às vezes, é necessário realizar operações via
    GET
       –   Ativação de usuário
       –   Reset de senha

●
    Normalmente, o usuário recebe o link por e-
    mail
●
    Nesses casos, o link deve conter um código
    gerado aleatoriamente
       –   De preferência, com data de expiração

      Segurança em Aplicações Web com PHP                    V Ensol
      Gedvan Dias                                  22 de julho de 2011
POST
●
    Entretanto, ainda estamos vulneráveis a
    ataques CSRF via POST
●
    Uma solução é utilizar tokens na sessão
    
        Os tokens são gerados de forma aleatória
    
        São armazenados na sessão e incluídos no
        formulário
    
        Ao receber a requisição, os tokens da sessão e do
        POST são comparados


        Segurança em Aplicações Web com PHP                V Ensol
        Gedvan Dias                              22 de julho de 2011
POST
●
    Outras técnicas ainda podem ser utilizadas
    para incrementar a segurança
    
        Incluir um tempo de expiração para os tokens
    
        Validar o cabeçalho HTTP_REFERER (embora não
        seja 100% confiável)




        Segurança em Aplicações Web com PHP             V Ensol
        Gedvan Dias                           22 de julho de 2011
Request Spoofing




Segurança em Aplicações Web com PHP             V Ensol
Gedvan Dias                           22 de julho de 2011
Request Spoofing
●
    Request Spoofing é a tentativa de manipular
    requisições de alguma forma
●
    A forma mais simples é alterar manualmente
    os parâmetros em uma URL
●
    Também é possível alterar os elementos de um
    formulário
       –   Modificar atributos (maxlength, disabled, readonly,
           name, value)
       –   Inserir ou remover elementos

      Segurança em Aplicações Web com PHP                         V Ensol
      Gedvan Dias                                       22 de julho de 2011
Request Spoofing
●
    Para alterar um formulário, basta simplesmente
    salvar a página no seu computador e editá-la
●
    Ou utilizar ferramentas como o Firebug, que
    permite editar todo o HTML
●
    Outras ferramentas permitem até executar
    códigos javascript de terceiros
●
    Observação
       –   A saída que você gera na aplicação (HTML + CSS +
           Javascript) não é mais sua, é do cliente

      Segurança em Aplicações Web com PHP                         V Ensol
      Gedvan Dias                                       22 de julho de 2011
Request Spoofing
●
    Com um pouco mais de conhecimento, é
    possível criar requisições HTTP completas
       –   Pode ser feito na linha de comando, com o comando
           telnet, por exemplo
       –   Pode-se criar um script em qualquer linguagem que se
           conecta ao socket do servidor web
       –   Existem várias outras formas

●
    O HTTP é um padrão aberto e sua aplicação
    deve estar pronta para isso

      Segurança em Aplicações Web com PHP                       V Ensol
      Gedvan Dias                                     22 de julho de 2011
Request Spoofing
●
    Como se proteger nessa situação?


    Filtrar a entrada …
    … e escapar a saída




      Segurança em Aplicações Web com PHP             V Ensol
      Gedvan Dias                           22 de julho de 2011
Arquivos




Segurança em Aplicações Web com PHP             V Ensol
Gedvan Dias                           22 de julho de 2011
Exposição de Código
●
    Deve-se evitar arquivos PHP com extensão
    diferente de .php (ex: .inc)
    
        Ou deve-se ter certeza que estão fora da raiz web
    
        Ou que o Apache está configurado corretamente
        para executá-los e não exibi-los




        Segurança em Aplicações Web com PHP               V Ensol
        Gedvan Dias                             22 de julho de 2011
Inclusão de Arquivos
●
    Inclusão arquivos errados: index.php?usuario=../../admin
●
    Code injection: POST path=http://meusite.com




       Segurança em Aplicações Web com PHP                     V Ensol
       Gedvan Dias                                   22 de julho de 2011
Command Injection
●
    Se a sua aplicação executa comandos do shell,
    também é preciso escapá-los
●
    Funções
    
        escapeshellcmd
    
        escapeshellarg




        Segurança em Aplicações Web com PHP             V Ensol
        Gedvan Dias                           22 de julho de 2011
Autenticação e Autorização




Segurança em Aplicações Web com PHP             V Ensol
Gedvan Dias                           22 de julho de 2011
Autenticação
●
    É o processo de identificar um usuário
●
    Ou seja, verificar se a pessoa que está
    acessando corresponde ao seu usuário
●
    Dependendo de sua aplicação, considere o uso
    do protocolo HTTPS para a autenticação




      Segurança em Aplicações Web com PHP               V Ensol
      Gedvan Dias                             22 de julho de 2011
Autorização
●
    Também é chamado de controle de acesso
●
    Consiste em determinar se o usuário está
    autorizado a acessar um determinado recurso
       –   Página, operação, consulta, etc.

●
    Normalmente, as informações de autorização
    ficam na sessão
●
    Para processos críticos, considere fazer uma
    nova autenticação

      Segurança em Aplicações Web com PHP               V Ensol
      Gedvan Dias                             22 de julho de 2011
Finalizando...




Segurança em Aplicações Web com PHP             V Ensol
Gedvan Dias                           22 de julho de 2011
Dicas finais
●
    Crie o hábito de programar de forma segura
●
    Em uma equipe, todos os programadores
    devem ter os conceitos básicos em mente
●
    Estabeleça uma política de segurança
    previamente
●
    Esteja atualizado



      Segurança em Aplicações Web com PHP             V Ensol
      Gedvan Dias                           22 de julho de 2011
OWASP
●
    The Open Web Application Secutiry Project
         –   Padrões relacionados a segurança
         –   Levantamento sobre vulnerabilidades e ataque
         –   Tecnologias e ferramentas
         –   Notícias, etc.

●
    Projeto apoiado por grandes empresas e
    universidades
    
        Amazon, IBM, Mozilla, Oracle, etc.


        Segurança em Aplicações Web com PHP                      V Ensol
        Gedvan Dias                                    22 de julho de 2011
Livros




Segurança em Aplicações Web com PHP             V Ensol
Gedvan Dias                           22 de julho de 2011
Links
●
    OWASP: www.owasp.org
●
    Manual do PHP:
    http://php.net/manual/en/security.php
●
    PHP Security Consortium: http://phpsec.org/




      Segurança em Aplicações Web com PHP             V Ensol
      Gedvan Dias                           22 de julho de 2011
Obrigado!
              gedvan@gmail.com - @gedvan




Segurança em Aplicações Web com PHP                  V Ensol
Gedvan Dias                                22 de julho de 2011

Segurança em Aplicações Web com PHP

  • 1.
    Segurança em Aplicações Webcom PHP Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 2.
    Sobre mim ● Mestre em Informática pela UFPB ● Professor substituto no IFPB – C, PHP, Comércio Eletrônico ● Professor na Faculdade IDEZ – HTML/CSS/PHP ● Lexa Sistemas – www.lexasistemas.com.br – Criação de sites em Drupal ● Letz – www.letz.com.br – Rede social para divulgação de eventos Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 3.
    Esta palestra ésobre ● Segurança em aplicações web – Boas práticas de programação – Erros comuns – Detalhes do PHP – Tipos de ataques a sites – Autenticação e autorização – Foco na implementação com PHP ● Pode ser aplicado para outras linguagens Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 4.
    Esta palestra nãoé sobre ● Segurança de servidores – Configuração de servidores – Firewalls – DNS, FTP, SSH, HTTPS, … – DoS, IP spoofing, phising, … – Spam Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 5.
    Segurança e alinguagem PHP ● Por que PHP? ● PHP surgiu de forma despretensiosa ● Acabou se tornando a linguagem server-side mais utilizada na web – Facilidade, rapidez, versatilidade, etc. Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 6.
    Segurança e alinguagem PHP ● Grandes poderes trazem grandes responsabilidades ● Programadores inexperientes ● Autodidatismo é bom, mas... – Aprendo apenas o que me interessa – Questões importantes acabam ficando de lado ● Prazos apertados... Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 7.
    Alguns casos recentes ● Site Mysql.com tem banco de dados comprometido [1] – Ataque via SQL Injection – Acesso a usuários, senhas, e-mails, etc. [1] http://www.computerworld.com/s/article/9215249/MySQL_Web_site_falls_victim_to_SQL_injection_attack Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 8.
    Alguns casos recentes ● Sony  Sony Pictures[1]  Sony Japan[2]  Sony Greece[3]  Sony Canada[4] [1] http://www.bbc.co.uk/news/technology-13642145 [2] http://nakedsecurity.sophos.com/2011/05/24/sony-music-japan-hacked-through-sql-injection-flaw/ [3] http://nakedsecurity.sophos.com/2011/05/22/sony-bmg-greece-the-latest-hacked-sony-site/ [4] http://www.computerworld.com/s/article/9217028/Sony_says_hacker_stole_2_000_records_from_Canadian_site Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 9.
    Alguns casos recentes ● Sites do Governo Brasileiro – Vários órgãos públicos tiveram seu site atacado – Portal Brasil, Presidência, Senado, Receita Federal, IBGE, entre outros – Ataques de DoS, defacements e alguns roubos de dados Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 10.
    Vamos ao queinteressa Show me the code! Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 11.
    Configurações do PHP ● register_globals  Variáveis globais são criadas automaticamente a partir de parâmetros GET, POST, cookies, sessões, etc.  Desabilitado por padrão a partir do PHP 4.2  Depracated no PHP 5.3 Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 12.
    Tratamento de erros ● Algumas configurações relacionadas a erros:  error_reporting: nível de erro a ser reportado – E_ALL ou E_ALL | E_STRICT  display_errors: exibir ou não erros na tela – Em produção, deve ser sempre desabilitado  log_errors: fazer log dos erros em arquivo  error_log: arquivo onde será feito log Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 13.
    Manipulação de erros ● set_error_handler()  Permite usar uma função própria para o tratamento dos erros ● set_exception_handler()  Permite usar uma função para tratar exceções não capturadas Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 14.
    set_error_handler() Segurança em AplicaçõesWeb com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 15.
    Recomendações e boas práticas Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 16.
    Programação defensiva ● “Prevenir é melhor do que remediar” ● A internet não é um lugar amigável ● Um plano B pode salvar a sua vida (seu emprego, sua reputação, etc.) ● Pense sempre em minimizar os riscos Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 17.
    KISS ● Keep It Simple, Stupid ● Evite a complexidade desnecessária ● Abra mão da “esperteza” em prol da segurança Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 18.
    KISS Segurança em AplicaçõesWeb com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 19.
    Regra de Ouro Toda entrada deve ser filtrada e toda saída deve ser “escapada” Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 20.
    Filtro e Validação ● Você está recebendo o que está esperando receber? ● Trate todo o input da sua aplicação – Dados de formulários – Parâmetros da URL – Informações de cookies – Dados de sistemas externos ● Validação x Filtro (sanitizing) Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 21.
    Validação x Filtro CPF 241.775.842-31 filtro/sanitizing validação 24177584231 Erro! Formato inválido! Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 22.
    API Data Filtering ● Funções para tratar o input usando vários tipos de filtro/validação ● Disponível a partir do PHP 5.2 ● Pode substituir totalmente o acesso aos arrays superglobais – $_GET, $_POST, $_COOKIE, $_SERVER, $_ENV Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 23.
    filter_input Segurança em AplicaçõesWeb com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 24.
    Escapando a Saída ● Regra de ouro: … toda saída deve ser “escapada” – Pelo menos a toda a saída não confiável ● O que quer dizer “escapar”? – Vem do inglês escape – Nesse contexto, quer dizer que devemos converter determinados caracteres (ou sequências) ● Objetivo: manter a integridade da saída Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 25.
    Escapando o HTML ● A saída mais comum do PHP é o HTML ● No HTML temos, basicamente:  Tags (abertura, fechamento, atributos) – Definem a estrutura do documento  Conteúdo das tags (valores, texto) ● Escape no HTML significa, normalmente, impedir que hajam tags onde não deveria haver Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 26.
    Escapando o HTML ● Funções: htmlespecialchars(), htmlentities() ● API Data Filtering: filter_input(), filter_var() Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 27.
    Principais Tipos deAtaques e Vulnerabilidades Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 28.
    SQL Injection ● Consiste em tentar inserir um trecho de código SQL em uma query que será enviada a um banco de dados Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 29.
    SQL Injection Segurança emAplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 30.
    Exploits of amom Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 31.
    SQL Injection ● SQL Injection é uma das vulnerabilidades mais comuns em aplicações PHP – Felizmente, é muito fácil se proteger contra esse tipo de ataque ● Basta escapar os dados enviados nas queries – Lembra da regra de ouro? – Ao utilizar banco de dados, as queries são dados de saída (output) da aplicação – Portanto, devem ser escapadas Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 32.
    Escapando Valores deQueries ● Para escapar os valores enviados ao banco, pode-se usar as funções de cada extensão – MySQL: mysql_real_escape_string() – PostgreSQL: pg_escape_string() – … – Em último caso, pode-se usar a função addslashes() ● Interfaces OO e camadas de abstração geralmente têm um método equivalente – PDO: quote() Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 33.
    Bound Parameters ● As camadas de abstração, normalmente, também tem suporte a parâmetros bound – O valores são vinculados através de marcadores – A própria biblioteca faz o escape dos dados  Oferecem uma ótima proteção contra SQL Injection Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 34.
    Escape de Identificadores ● Normalmente, apenas os valores precisam ser escapados ● Em alguns casos, também é preciso escapar (ou filtrar) os identificadores – Nomes de tabelas e campos – Nos casos onde eles vêm de uma fonte externa ● No MySQL, os identificadores pode ser escritos entre crases. – Ex: SELECT * FROM `tablename` Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 35.
    XSS Cross-Site Scripting Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 36.
    Cross-Site Scripting ● Também é um dos tipos mais comuns de ataques ● Toda aplicação que exibe dados recebidos (input) corre riscos  Se esses dados não forem devidamente filtrados e escapados, a aplicação estará vulnerável Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 37.
    Cross-Site Script ● O atacante normalmente explorará essa falha inserindo tags e código javascript no seu HTML – Tags <iframe> chamando páginas maliciosas – Código js para redirecionar o usuário para outras páginas – Código js para ler os cookies do usuário e enviá-los para outros sites – Código js para alterar as informações do site (defacement) Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 38.
    Cross-Site Scripting ● Para se proteger de XSS, basta fazer o que já foi dito  Filtrar a entrada, e  Escapar a saída – htmlentities, htmlespecialchars, etc. Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 39.
    Cross-Site Scripting Demonstração Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 40.
    CSRF Cross-Site Request Forgery Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 41.
    CSRF ● Como o nome diz, consiste em tentar forjar uma requisição de um site para outro ● O atacante usa a própria vítima para fazer a requisição, sem que ela tenha conhecimento ● Portanto, é muito difícil identificar se uma requisição é legítima ou um ataque CSRF Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 42.
    CRSF Uma linha decódigo vale mais que mil palavras (demonstração) Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 43.
    CSRF ● Então como se defender do CSRF? Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 44.
    GET x POST ● Antes de tudo  Entenda a diferença entre GET e POST  Funcionamento  Objetivos  Saiba quando usar cada um Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 45.
    GET ● O método GET deve ser utilizado apenas para consultas  Exibição de páginas  Listagens  Pesquisas  Downloads, etc. Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 46.
    POST ● O método POST deve ser utilizado para as operações  Cadastros  Atualização  Exclusão  Autenticação Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 47.
    GET ● Não use o GET para realizar operações* ● Nada que vá modificar os seus dados ● Dessa forma, os ataques CSRF via GET não causarão nenhum dano Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 48.
    Operações via GET ● Às vezes, é necessário realizar operações via GET – Ativação de usuário – Reset de senha ● Normalmente, o usuário recebe o link por e- mail ● Nesses casos, o link deve conter um código gerado aleatoriamente – De preferência, com data de expiração Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 49.
    POST ● Entretanto, ainda estamos vulneráveis a ataques CSRF via POST ● Uma solução é utilizar tokens na sessão  Os tokens são gerados de forma aleatória  São armazenados na sessão e incluídos no formulário  Ao receber a requisição, os tokens da sessão e do POST são comparados Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 50.
    POST ● Outras técnicas ainda podem ser utilizadas para incrementar a segurança  Incluir um tempo de expiração para os tokens  Validar o cabeçalho HTTP_REFERER (embora não seja 100% confiável) Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 51.
    Request Spoofing Segurança emAplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 52.
    Request Spoofing ● Request Spoofing é a tentativa de manipular requisições de alguma forma ● A forma mais simples é alterar manualmente os parâmetros em uma URL ● Também é possível alterar os elementos de um formulário – Modificar atributos (maxlength, disabled, readonly, name, value) – Inserir ou remover elementos Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 53.
    Request Spoofing ● Para alterar um formulário, basta simplesmente salvar a página no seu computador e editá-la ● Ou utilizar ferramentas como o Firebug, que permite editar todo o HTML ● Outras ferramentas permitem até executar códigos javascript de terceiros ● Observação – A saída que você gera na aplicação (HTML + CSS + Javascript) não é mais sua, é do cliente Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 54.
    Request Spoofing ● Com um pouco mais de conhecimento, é possível criar requisições HTTP completas – Pode ser feito na linha de comando, com o comando telnet, por exemplo – Pode-se criar um script em qualquer linguagem que se conecta ao socket do servidor web – Existem várias outras formas ● O HTTP é um padrão aberto e sua aplicação deve estar pronta para isso Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 55.
    Request Spoofing ● Como se proteger nessa situação? Filtrar a entrada … … e escapar a saída Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 56.
    Arquivos Segurança em AplicaçõesWeb com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 57.
    Exposição de Código ● Deve-se evitar arquivos PHP com extensão diferente de .php (ex: .inc)  Ou deve-se ter certeza que estão fora da raiz web  Ou que o Apache está configurado corretamente para executá-los e não exibi-los Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 58.
    Inclusão de Arquivos ● Inclusão arquivos errados: index.php?usuario=../../admin ● Code injection: POST path=http://meusite.com Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 59.
    Command Injection ● Se a sua aplicação executa comandos do shell, também é preciso escapá-los ● Funções  escapeshellcmd  escapeshellarg Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 60.
    Autenticação e Autorização Segurançaem Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 61.
    Autenticação ● É o processo de identificar um usuário ● Ou seja, verificar se a pessoa que está acessando corresponde ao seu usuário ● Dependendo de sua aplicação, considere o uso do protocolo HTTPS para a autenticação Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 62.
    Autorização ● Também é chamado de controle de acesso ● Consiste em determinar se o usuário está autorizado a acessar um determinado recurso – Página, operação, consulta, etc. ● Normalmente, as informações de autorização ficam na sessão ● Para processos críticos, considere fazer uma nova autenticação Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 63.
    Finalizando... Segurança em AplicaçõesWeb com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 64.
    Dicas finais ● Crie o hábito de programar de forma segura ● Em uma equipe, todos os programadores devem ter os conceitos básicos em mente ● Estabeleça uma política de segurança previamente ● Esteja atualizado Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 65.
    OWASP ● The Open Web Application Secutiry Project – Padrões relacionados a segurança – Levantamento sobre vulnerabilidades e ataque – Tecnologias e ferramentas – Notícias, etc. ● Projeto apoiado por grandes empresas e universidades  Amazon, IBM, Mozilla, Oracle, etc. Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 66.
    Livros Segurança em AplicaçõesWeb com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 67.
    Links ● OWASP: www.owasp.org ● Manual do PHP: http://php.net/manual/en/security.php ● PHP Security Consortium: http://phpsec.org/ Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011
  • 68.
    Obrigado! gedvan@gmail.com - @gedvan Segurança em Aplicações Web com PHP V Ensol Gedvan Dias 22 de julho de 2011