SEGURANÇA EM PHP
      Augusto Pascutti
Augusto Pascutti

4 anos de experiência

Zend Certified Engineer

Co-Fundador PHPSP

Host PHPSPCast

Habari,CakePHP
Segurança
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
Segurança é ...
como um ogro ...
Que são como cebolas !
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
Informação Confidencial
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.
Segurança x Usabilidade




                      Shozu.com
Segurança x Usabilidade




                          reCaptcha
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
Segurança x Usabilidade




       Qual o animal da figura ?
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
Filtre o INPUT



Identifique o input

Filtre o input
Identificando Input


O input pode vir de diversos lugares

  Formulário

  Outra aplicação

  Sistema
Filtrando
Filtrando
Filtrando
Filtrando
Filtrando
Filtrando
Filtrando
Filtrando
Filtrando
Escape o Output

O que é output ?

  echo, print, sprintf

  <?=

Na grande maioria, o destino é o navegador

  Escapar HTML
Escape o Output
Escape o Output
Escape o Output
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
Escape o Output
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
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
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
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
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
CSRF
CSRF
CSRF


<img src="http://loja/comprar.php?quant=100" />
CSRF
CSRF
CSRF
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
allow_url_fopen


Permite acesso a recursos remotos

Valor padrão: On

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



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



include “http://www.bad-bad-site.com”
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
register_globals
register_globals
register_globals
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
display_errors


Exibe no output erros do PHP

DEVE ser usado no desenvolvimento

DEVE ser desligado na produção

Padrão: On
error_reporting


Controla os níveis de erros que devem ser exibidos

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

Recomendado: -1
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
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
Redirecionamentos Inválidos


O que é?

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

Impacto

  Phishing
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
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
Perguntas ?




                Augusto Pascutti

              augusto@phpsp.org.br

                      @augustohp
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

Segurança em PHP