SEGURANÇA EM PHP
                                 Augusto Pascutti




Friday, January 29, 2010
Augusto Pascutti

              4 anos de experiência

              Zend Certified Engineer

              Co-Fundador PHPSP

              Host PHPSPCast

              Habari,CakePHP



Friday, January 29, 2010
Segurança




Friday, January 29, 2010
Princípios


              Se mantenha a eles e você terá:

                   Um usuário feliz

                   Um patrão feliz

                   Finais de Semana e quem sabe férias




Friday, January 29, 2010
Segurança é ...




Friday, January 29, 2010
como um ogro ...




Friday, January 29, 2010
Que são como cebolas !




Friday, January 29, 2010
Segurança em camadas


              Segurança nunca é demais

              Segurança em profundidade

                   Aplique camadas de segurança em tudo que puder

              Não conte com a bondade no mundo




Friday, January 29, 2010
Informação Confidencial




Friday, January 29, 2010
Informação Confidencial


              Classifique tudo que for sensível

              Impeça o acesso a essa informação

              Lei do menor privilégio

                   Se o usuário não precisa ver, não deixe.




Friday, January 29, 2010
Segurança x Usabilidade




                                                 Shozu.com


Friday, January 29, 2010
Segurança x Usabilidade




                                                     reCaptcha


Friday, January 29, 2010
Segurança x Usabilidade

              Procure implementar segurança transparente ao usuário

              Se não for possível:

                   Pense no Risco e na Usabilidade

                   Tenha em mente que dependemos de usuários felizes

                   NUNCA esqueça da usabilidade



Friday, January 29, 2010
Segurança x Usabilidade




                                  Qual o animal da figura ?



Friday, January 29, 2010
Vigie sempre

              Nunca confie no usuário

              Nunca confie em outras aplicações

              Nunca confie.

              Mantenha registro da onde, de quem e quando a informação for
              gerada




Friday, January 29, 2010
Filtre o INPUT



              Identifique o input

              Filtre o input




Friday, January 29, 2010
Identificando Input


              O input pode vir de diversos lugares

                   Formulário

                   Outra aplicação

                   Sistema




Friday, January 29, 2010
Filtrando




Friday, January 29, 2010
Filtrando




Friday, January 29, 2010
Filtrando




Friday, January 29, 2010
Filtrando




Friday, January 29, 2010
Filtrando




Friday, January 29, 2010
Filtrando




Friday, January 29, 2010
Filtrando




Friday, January 29, 2010
Filtrando




Friday, January 29, 2010
Filtrando




Friday, January 29, 2010
Escape o Output

              O que é output ?

                   echo, print, sprintf

                   <?=

              Na grande maioria, o destino é o navegador

                   Escapar HTML



Friday, January 29, 2010
Escape o Output




Friday, January 29, 2010
Escape o Output




Friday, January 29, 2010
Escape o Output




Friday, January 29, 2010
htmlentities()
              Converte TODO caractere para entidade HTML correspondente

              Segundo e terceiro parâmetro são opcionais

                   Segundo: como as aspas (duplas e simples) seão tratadas

                       Padrão: ENT_COMPAT

                       ENT_QUOTES: Converte ambas para entidade HTML

                   Terceiro: encoding do output

                       Padrão: ISO-8859-1

Friday, January 29, 2010
Escape o Output




Friday, January 29, 2010
Brindes


              Extensão dos arquivos sempre “.php”

              Dentro do DocRoot, só o necessário

              Mantenha seu código simples e encapsulado

              Favoreça Orientação a Objetos




Friday, January 29, 2010
TOP 10 OWASP
              Lista de riscos de Segurança (rc1) de 2010
                 Injection
                 XSS
                 Quebra de Autenticação e Problemas de Sessões
                 Referências não seguras a Objetos
                 CSRF
                 Erros de Configuração
                 Falhas ao restringir acesso a URLs
                 Redirecionamentos e Encaminhamentos não seguros
                 Métodos de criptografia não seguros
                 Segurança insuficiente no transporte de dados


Friday, January 29, 2010
Sql Injection
              O que é ?

                   Envio de comandos não tratados pela aplicação para o
                   interpretador

              Impacto

                   Toda a base de dados pode ser lida ou modificada

                   Pode garantir acesso ao banco de dados ou até ao Sistema
                   Operacional


Friday, January 29, 2010
Cross Site Scripting (XSS)


              O que é ?

                   Dados do atacante são enviados ao navegador do cliente

              Impacto

                   Roubo de sessão, de dados sensíveis, phishing




Friday, January 29, 2010
Cross Site Request Forgery
                              (CSRF)
              O que é ?

                   O navegador é “enganado” e envia um comando a um site
                   vulnerável

              Impacto

                   Iniciar transações (tranferência, logout, cancelamento)

                   Acesso sensível a dados

                   Mudança de dados da conta


Friday, January 29, 2010
CSRF




Friday, January 29, 2010
CSRF




Friday, January 29, 2010
CSRF


           <img src="http://loja/comprar.php?quant=100" />




Friday, January 29, 2010
CSRF




Friday, January 29, 2010
CSRF




Friday, January 29, 2010
CSRF




Friday, January 29, 2010
Problemas de Configuração

              O que é ?

                   Configuração de rede e do servidor de aplicação

              Impacto

                   Acesso ao Sistema Operacional através de um problema
                   conhecido

                   Acesso a dados da aplicação



Friday, January 29, 2010
allow_url_fopen


              Permite acesso a recursos remotos

              Valor padrão: On

              Aliado ao ‘allow_url_include’ (> 5.2) é muito perigoso




Friday, January 29, 2010
allow_url_fopen



           $conteudo = file_get_contents(“http://www.google.com”)




Friday, January 29, 2010
allow_url_fopen



                           include “http://www.bad-bad-site.com”




Friday, January 29, 2010
register_globals

              Exporta índices de super globais para variáveis comuns

              Impede que se identifique a origem do dado

              Padrão

                   < 4.2: On

                   >4.2: Off



Friday, January 29, 2010
register_globals




Friday, January 29, 2010
register_globals




Friday, January 29, 2010
register_globals




Friday, January 29, 2010
magic_quotes_gpc
              Escapa todos os dados em $_GET, $_POST e $_COOKIE

              Usa addslashes() e não escape nativo do seu banco

              Complica seu algoritmo de filtro

              Padrão: On

                   Obsoleto no PHP 5.3

                   Removido do PHP 6


Friday, January 29, 2010
display_errors


              Exibe no output erros do PHP

              DEVE ser usado no desenvolvimento

              DEVE ser desligado na produção

              Padrão: On




Friday, January 29, 2010
error_reporting


              Controla os níveis de erros que devem ser exibidos

              Ajuda na identificação de erros e boas práticas

              Recomendado: -1




Friday, January 29, 2010
safe_mode

              Restringe algumas funcões tidas como prejudiciais

                   Verifica se o dono do arquivo a ser executado é o mesmo do
                   script em execução

              Melhora a segurança

              Não é suficiente

              Padrão: Off



Friday, January 29, 2010
Acesso a URLs Restritas

              O que é?

                   Permitir que um usuário possa forjar uma autorização a uma
                   URL sensível

              Impacto

                   Permitir ações privilegiadas a qualquer pessoa




Friday, January 29, 2010
Redirecionamentos Inválidos


              O que é?

                   Enviar o usuário para uma URL não valida

              Impacto

                   Phishing




Friday, January 29, 2010
Criptografia Não Segura
              O que é?

                   Falha na identificação de todos os dados que devem ser
                   criptografados

                   Uso de criptografia não segura (md5, sha1)

              Impacto

                   Acesso a dados sensíveis

              Solução

                   mcrypt

Friday, January 29, 2010
Transporte de dados

              O que é?

                   Falta de segurança na troca de informações sensíveis

              Impacto

                   Acesso a dados sensíveis

              Solução

                   SSL ou TLS para transporte dos dados


Friday, January 29, 2010
Perguntas ?




                                           Augusto Pascutti

                                         augusto@phpsp.org.br

                                                 @augustohp



Friday, January 29, 2010
Referências


              Essential PHP Security - Chris Chiflett - O’Reilly

              http://www.owasp.org/

              http://phpsp.org.br/category/phpsp/phpspcast/

              Segurança em PHP - Márcio Pessoa - Novatec




Friday, January 29, 2010

Desenvolvendo com Segurança em PHP

  • 1.
    SEGURANÇA EM PHP Augusto Pascutti Friday, January 29, 2010
  • 2.
    Augusto Pascutti 4 anos de experiência Zend Certified Engineer Co-Fundador PHPSP Host PHPSPCast Habari,CakePHP Friday, January 29, 2010
  • 3.
  • 4.
    Princípios Se mantenha a eles e você terá: Um usuário feliz Um patrão feliz Finais de Semana e quem sabe férias Friday, January 29, 2010
  • 5.
    Segurança é ... Friday,January 29, 2010
  • 6.
    como um ogro... Friday, January 29, 2010
  • 7.
    Que são comocebolas ! Friday, January 29, 2010
  • 8.
    Segurança em camadas Segurança nunca é demais Segurança em profundidade Aplique camadas de segurança em tudo que puder Não conte com a bondade no mundo Friday, January 29, 2010
  • 9.
  • 10.
    Informação Confidencial Classifique tudo que for sensível Impeça o acesso a essa informação Lei do menor privilégio Se o usuário não precisa ver, não deixe. Friday, January 29, 2010
  • 11.
    Segurança x Usabilidade Shozu.com Friday, January 29, 2010
  • 12.
    Segurança x Usabilidade reCaptcha Friday, January 29, 2010
  • 13.
    Segurança x Usabilidade Procure implementar segurança transparente ao usuário Se não for possível: Pense no Risco e na Usabilidade Tenha em mente que dependemos de usuários felizes NUNCA esqueça da usabilidade Friday, January 29, 2010
  • 14.
    Segurança x Usabilidade Qual o animal da figura ? Friday, January 29, 2010
  • 15.
    Vigie sempre Nunca confie no usuário Nunca confie em outras aplicações Nunca confie. Mantenha registro da onde, de quem e quando a informação for gerada Friday, January 29, 2010
  • 16.
    Filtre o INPUT Identifique o input Filtre o input Friday, January 29, 2010
  • 17.
    Identificando Input O input pode vir de diversos lugares Formulário Outra aplicação Sistema Friday, January 29, 2010
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
    Escape o Output O que é output ? echo, print, sprintf <?= Na grande maioria, o destino é o navegador Escapar HTML Friday, January 29, 2010
  • 28.
    Escape o Output Friday,January 29, 2010
  • 29.
    Escape o Output Friday,January 29, 2010
  • 30.
    Escape o Output Friday,January 29, 2010
  • 31.
    htmlentities() Converte TODO caractere para entidade HTML correspondente Segundo e terceiro parâmetro são opcionais Segundo: como as aspas (duplas e simples) seão tratadas Padrão: ENT_COMPAT ENT_QUOTES: Converte ambas para entidade HTML Terceiro: encoding do output Padrão: ISO-8859-1 Friday, January 29, 2010
  • 32.
    Escape o Output Friday,January 29, 2010
  • 33.
    Brindes Extensão dos arquivos sempre “.php” Dentro do DocRoot, só o necessário Mantenha seu código simples e encapsulado Favoreça Orientação a Objetos Friday, January 29, 2010
  • 34.
    TOP 10 OWASP Lista de riscos de Segurança (rc1) de 2010 Injection XSS Quebra de Autenticação e Problemas de Sessões Referências não seguras a Objetos CSRF Erros de Configuração Falhas ao restringir acesso a URLs Redirecionamentos e Encaminhamentos não seguros Métodos de criptografia não seguros Segurança insuficiente no transporte de dados Friday, January 29, 2010
  • 35.
    Sql Injection O que é ? Envio de comandos não tratados pela aplicação para o interpretador Impacto Toda a base de dados pode ser lida ou modificada Pode garantir acesso ao banco de dados ou até ao Sistema Operacional Friday, January 29, 2010
  • 36.
    Cross Site Scripting(XSS) O que é ? Dados do atacante são enviados ao navegador do cliente Impacto Roubo de sessão, de dados sensíveis, phishing Friday, January 29, 2010
  • 37.
    Cross Site RequestForgery (CSRF) O que é ? O navegador é “enganado” e envia um comando a um site vulnerável Impacto Iniciar transações (tranferência, logout, cancelamento) Acesso sensível a dados Mudança de dados da conta Friday, January 29, 2010
  • 38.
  • 39.
  • 40.
    CSRF <img src="http://loja/comprar.php?quant=100" /> Friday, January 29, 2010
  • 41.
  • 42.
  • 43.
  • 44.
    Problemas de Configuração O que é ? Configuração de rede e do servidor de aplicação Impacto Acesso ao Sistema Operacional através de um problema conhecido Acesso a dados da aplicação Friday, January 29, 2010
  • 45.
    allow_url_fopen Permite acesso a recursos remotos Valor padrão: On Aliado ao ‘allow_url_include’ (> 5.2) é muito perigoso Friday, January 29, 2010
  • 46.
    allow_url_fopen $conteudo = file_get_contents(“http://www.google.com”) Friday, January 29, 2010
  • 47.
    allow_url_fopen include “http://www.bad-bad-site.com” Friday, January 29, 2010
  • 48.
    register_globals Exporta índices de super globais para variáveis comuns Impede que se identifique a origem do dado Padrão < 4.2: On >4.2: Off Friday, January 29, 2010
  • 49.
  • 50.
  • 51.
  • 52.
    magic_quotes_gpc Escapa todos os dados em $_GET, $_POST e $_COOKIE Usa addslashes() e não escape nativo do seu banco Complica seu algoritmo de filtro Padrão: On Obsoleto no PHP 5.3 Removido do PHP 6 Friday, January 29, 2010
  • 53.
    display_errors Exibe no output erros do PHP DEVE ser usado no desenvolvimento DEVE ser desligado na produção Padrão: On Friday, January 29, 2010
  • 54.
    error_reporting Controla os níveis de erros que devem ser exibidos Ajuda na identificação de erros e boas práticas Recomendado: -1 Friday, January 29, 2010
  • 55.
    safe_mode Restringe algumas funcões tidas como prejudiciais Verifica se o dono do arquivo a ser executado é o mesmo do script em execução Melhora a segurança Não é suficiente Padrão: Off Friday, January 29, 2010
  • 56.
    Acesso a URLsRestritas O que é? Permitir que um usuário possa forjar uma autorização a uma URL sensível Impacto Permitir ações privilegiadas a qualquer pessoa Friday, January 29, 2010
  • 57.
    Redirecionamentos Inválidos O que é? Enviar o usuário para uma URL não valida Impacto Phishing Friday, January 29, 2010
  • 58.
    Criptografia Não Segura O que é? Falha na identificação de todos os dados que devem ser criptografados Uso de criptografia não segura (md5, sha1) Impacto Acesso a dados sensíveis Solução mcrypt Friday, January 29, 2010
  • 59.
    Transporte de dados O que é? Falta de segurança na troca de informações sensíveis Impacto Acesso a dados sensíveis Solução SSL ou TLS para transporte dos dados Friday, January 29, 2010
  • 60.
    Perguntas ? Augusto Pascutti augusto@phpsp.org.br @augustohp Friday, January 29, 2010
  • 61.
    Referências Essential PHP Security - Chris Chiflett - O’Reilly http://www.owasp.org/ http://phpsp.org.br/category/phpsp/phpspcast/ Segurança em PHP - Márcio Pessoa - Novatec Friday, January 29, 2010