Você está na página 1de 52

Desenvolvendo sistemas

seguros com PHP


FLVIO M. DE SOUZA

Flvio M. Souza

Graduado em Anlise e Desenvolvimento de Sistemas, vivencia esse submundo da


programao desde 2008 tendo o seu primeiro contato atravs da linguagem JAVA.

Seu Know-how em automao de processos de empresas, tendo em seu currvulos diversos


segmentos como mercantil, imobiliria, construtora, cartrio, clnica odontolgica entre outros.

Atuamente Scio DIretor e Analista de Sistemas da empresa inGETI (Provedora de solues


do SEBRAE/PI), trabalhando no projeto inSySALI (Sistema de gesto do SEBRAE para o
programa Agente Local de Inovao), Analista de Sistemas da empresa Aura Consultoria,
trabalhando no projeto DiagonalWEB (Sistema comercial na plataforma WEB da construtora
Diagonal) e Professor da FATENE.

Possui conhecimento nas tecnologias JAVA SE, PHP, JAVASCRIPT, JQUERY, HTML, CSS,
BOOTSTRAP, MYSQL e POSTGRESQL.

Porque os sistemas so vulnerveis

Erros de programao

Erros de configurao

Mudanas no autorizadas

Uso imprprio

O PHP inseguro

No, pelo contrrio, o PHP sendo utilizado de forma correta bastante seguro, no a toa
que grandes frameworks utiliza-o como linguagem base.

O PHP por ser uma linguagem de fcil aprendizagem acaba sendo a primeira linguagem de
programao para muitos, o que acaba disponibilizando no mercado diversos profissionais
inexperientes e imaturos.

Essa imaturidade causa desconhecimento das mais diversas falhas que citaremos neste
material.

O PHP inseguro

Ranking das linguagens

de programao mais
Utilizadas no mundo.

Tipos de ataques mais


utilizados

XSS - Cross-Site Scripting

Permite a injeo de scripts no site atacado,

Em geral por meio de algum campo de input do usurio.

um ataque ao usurio do site e no ao sistema servidor em si. Isso porque o script


injetado nunca ser executado no servidor, mas sim nos navegadores dos clientes que
visitarem a pgina infectada.

Essas informaes nos do a primeira dica, JAMAIS DEVEMOS CONFIAR NAQUILO QUE
O USURIO DIGITA.

XSS - Cross-Site Scripting

A Soluo para este tipo de ataque escapar as entradas e sadas, dessa forma o texto
aparecer como ele realmente

CSRF - Cross-Site Request Forgery

Comandos no autorizados so transmitidos de um usurio que confia no website.

Ele executa scripts que copiam informaes de cookies armazenados do usurio de outros
sites para executar aes como postagens, requisies, executar login, etc.

CSRF - Cross-Site Request Forgery

Como preveno podemos:

Trabalhar com token nos formulrios.

Limitar tempo de vida dos cookies e sesses.

Etc.

SQL Injection

Consiste na insero de instrues SQL dentro de uma consulta atravs da manipulao


das entradas de dados de uma aplicao.

SQL Injection

Vamos imaginar uma aplicao com um formulrio que recebe um nome de usurio, e
depois faz uma consulta ao banco de dados:

$sql="select*fromusuarioswherenome='".$_POST['txt_nome']."'";

SQL Injection

O comando SQL montado a partir de componentes numricos. Exemplo: pesquisa por


uma chave primria de um registro. Neste caso, o atacante tambm pode tentar
manipular o contedo de forma a injetar cdigo adicional na string SQL.

$sql="select*fromusuarioswherecodigo=".$cod;

SQL Injection

O PHP fornece uma srie de funes para este tratamento, so as funes deescapede
caracteres. A maioria dos bancos suportados pelo PHP tem esta funo.

MySQLi -mysqli::real_escape_string
MySQL -mysql_escape_string
Postgre -pg_escape_string
SQLite -sqlite_escape_string

SQL Injection Simulando um ataque


Primeiro passo - Nmero de campos da tabela atual

1 ORDER BY 1,2,3...

Segundo passo - Descobrir nomes das tabelas

null union all select 1,2,group_concat(table_name) from information_schema.tables where


table_schema=database()--

Terceiro passo - Descobrir nomes dos campos

null union all select 1,2,group_concat(column_name) from information_schema.columns where


table_schema=database()--

Quarto passo - Descobrir nomes dos usurios

null union all select 1,2,usu_login FROM usuarios--

Quarto passo - Descobrir senhas dos usurios

null union all select 1,2,usu_senha FROM usuarios--

File Upload

Permite que o usurio possa subir qualquer tipo de arquivo para o seu servidor,
possibilitando assim a excluso de arquivos, captura de dados entre uma srie de
possveis problemas que voc pode ter.

File Upload

Para prevenir, se faz necessrio a validao no somente da extenso do arquivo, como


tambm o seu contedo.

PHP Injection

Permite a incluso (include) de arquivos remotos diretamente em seus sistemas, dessa


forma ele conseguir executar scripts dentro de seu servidor.

PHP Injection

Para prevenir voc poder bloquear o include atravs de URLs no arquivo php.ini, para isso
basta configurar a seguinte opo allow_url_include = Of.

Boas prticas de
programao para
tornar o seu sistema
mais seguro

No passar informaes pela URL

Um erro comum de programadores iniciantes enviar informaes atravs da url utilizando


o mtodo GET.

Por padro, o formulrio utiliza o mtodo GET, preciso configur-lo atravs do atributo
method=POST.

Validaes do lado do servidor ou do


lado do cliente?
Validao do lado do cliente.

O usurio pode interferir nas validaes.

Valida em tempo real.

Alguns navegadores no suportam


JavaScript.

Validao do lado do servidor.

O usurio no consegue interferir nas


validaes.

S valida aps enviar os dados do


formulrio.

Funciona em todos os navegadores j que a


validao ocorrer no servidor independente
de navegador.

Spoofing de formulrios

O Spoofing ocorre quando algum faz uma postagem de um de seus formulrios de algum
local inesperado.

Tcnica mais utilizada para a preveno do ataque o uso de um token.

No momento que exibido o formulrio, um token gerado e armazenado na sesso,


quando o formulrio enviado, confirmada se a chave enviada a mesma gravada na
sesso.

Mudar o nome da sesso

Quando no informado o nome da sesso, o PHP cria automaticamente com o nome


PHPSESSID

Esse nome padro torna a sesso do usurio vulnervel.

O ideal que se altere o nome para caractersticas prprias de cada usurio como por
exemplo Cdigo + Nome + Data d

Verificar origem dos dados

Caso voc utilize uma verso mais antiga do PHP, de quando o register_globals ainda
funcionava.

O register_globals criava variveis automaticamente a partir dos arrays superglobais $_GET,


$_POST, $_SESSION, $_COOKIE, $_SERVER.

Limitar o tempo da sesso

Embora o usurio tenha sado do site ou at mesmo fechado o navegador, dependendo da


forma como est configurada, a sesso permanecer ativa no servidor.

O ideal que se limite o tempo da sesso.

O ideal tambm que voc trate atravs de eventos para que ao usurio sair do site, aquela
sesso automaticamente seja excluda.

Validar upload de arquivos

Usurios maliciosos podem subir arquivos que podem ser executados no servidor e trazer
algum dano.

Para evitar esse tipo de ataque, voc precisa validar no somente a extenso do arquivo,
mas tambm o contedo do mesmo.

Use require ao invs de include

O include, como o prprio nome diz inclui um arquivo dentro de uma pgina, mas isso no
torna obrigatria a presena do mesmo, ou seja, se por algum motivo o arquivo no exista,
ele continua com a execuo do script.

J o Require, torna obrigatria a incluso do arquivo, assim, se por algum motivo o arquivo
no existir, ele bloqueia a execuo do script.

Verificar nvel de acesso em


funcionalidades

No adianta em um sistema usar milhes de ifs e tratar apenas os menus.

O usurio conseguir acessar qualquer pgina atravs do link direto.

Forma correta de se validar nvel de acesso bloquear todas as funcionalidades para todos
os usurios e s liber-las apenas para os usurios autorizados.

Forma errada de se validar nvel de acesso, liberar todas as funcionalidades para todo
mundo e bloque-las apenas para os usurios no autorizados.

Filtrar todas as entradas de dados

Nunca confie no usurio.

Filtre todas as entradas de dados para saber se realmente o que o seu sistema espera.

O PHP disponibiliza uma funo interessante para fazer essa validao ou saneamento, essa
funo a filter_input();

Filtrar todas as sadas de dados

Sempre quando for exibir dados, converta os caracteres para realidade HTML.

Monitore os erros de senha

Em caso de mais de trs tentativas de senha incorreta, bloqueie o IP de origem, adicione um


Captcha como validao adicional, isso dificulta ataques de forca bruta.

Trabalhe formulrios com Captcha

Adicione um Captcha como validao adicional, isso dificulta ataques de forca bruta.

Permisses em pasta

Restrinja o acesso s pastas do servidor, ou seja,


permisses deexecuoe escrita somente em
pastas apropriadas.

No armazenar senha em texto puro


na sesso

Senhas no devem ser armazenadas sem cifragem, sempre armazene senhas


criptografadas, assim estaremos protegendo tambm nossos usurios, numa eventual
invaso ao banco de dados.

No armazenar senha em texto puro


no banco de dados
Hackers conseguem senhas (em texto puro!) da Microsoft Store indiana

http://www.gemind.com.br/11654/microsoft-store-india-senhas-hackers/

PHP Injection

Muitas vezes quando se faz include de forma dinmica, ou seja, com a pgina sendo
passada atravs de variveis, abre-se uma brecha enorme para ataques, pois o usurio
mal intencionado pode alterar o valor dessa varivel para um arquivo externo que poder
ser executado dentro de seu servidor.

Como preveno podemos desabilitar no arquivo php.ini o include de arquivos atravs de


url allow_url_include ou simplesmente validar se o arquivo existe is_file em nosso
servidor.

Requisies JSON

Requisies que retornam JSON so timas de ser utilizadas em nossos sistemas, porm,
de extrema importncia que haja uma validao de onde vem essa requisio.

Como se trata de uma requisio, eu no preciso est dentro do servidor para executar a
mesma e isso juntamente com um arquivo mal configurado pode permitir que sejam
roubadas informaes de seus sistemas.

Use Framework

Por fim, altamente recomendvel que voc utilize frameworks para desenvolvimento,
pois, estes possuem equipes de programadores altamente experientes que j pensaram
nisso tudo para voc.

Usando o php.ini para


tornar o PHP mais
seguro

No exiba erros

No ambiente de produo trabalhe com erros na forma de logs.

Mostrar erros na t

ela pode revelar informaes importantes do teu sistema.

display_errors=Off
log_errors=On
error_log=/var/log/httpd/php_scripts_error.log

register_globals

Cria variveis automaticamente a partir dos arrays superglobais $_GET, $_POST,


$_SESSION, $_COOKIE, $_SERVER

register_globals

Desabilitada por padro a partir da verso 4.2.0 do PHP

Considerada obsoleta a partir da verso 5.3

No est mais presente a partir da verso 5.4

Register_globals=Off

Desabilite o upload de arquivos

Caso seu sistema no tenha upload de arquivos, desabilite a funcionalidade para que
nenhum mal intencionado possa estar subindo arquivos indevidos para o seu servidor.

file_uploads=Off

Desabilite a execuo remota de


cdigos

Dessa forma seu sistema no permite que sejam includos arquivos externos.

allow_url_fopen=Off

allow_url_include=Off

Controle o tamanho das requisies


POST

Caso seu sistema no trabalhe com muita transferncia de dados, no tem necessidade
de ter um tamanho alto para a transferncia dos mesmos.

post_max_size=1K

Controle os recursos que um script


pode consumir

Dessa forma voc evita o estouro de memria em seu servidor, caso um usurio descubra
que existe algum script causando estouro de memria ele pode se aproveitar dessa falha
para deixar seu servidor indisponvel.

max_execution_time = 30
max_input_time = 30
memory_limit = 40M

Desabilitando funes perigosas do


PHP

Existem algumas funes que se voc no for utiliz-las em seu servidor voc deveria
desabilit-las, como o caso do exec que permite que voc execute comandos
diretamente para o sistema operacional.

disable_functions =exec,passthru,shell_exec,system,proc_open,
popen,curl_exec,curl_multi_exec,parse_ini_file,show_source

Para finalizar

NENHUM

SEGURO.

SISTEMA 100%

Dvidas???

Referncias
http://www.cyberciti.biz/tips/php-security-best-practices-tutorial.html
http://blog.thiagobelem.net/principais-falhas-de-seguranca-no-php/
http://imasters.com.br/infra/seguranca/seguranca-em-aplicacoes-web-com-php/
http://www.softwarelivre.gov.br/palestras-tecnicas-cisl/palestras-tecnicas-cisl/apresentacaosegu
rancaphp.pdf
http://blog.thiagobelem.net/principais-falhas-de-seguranca-no-php/
http://www.linhadecodigo.com.br/artigo/673/php-programando-com-seguranca.aspx
http://www.pedropereira.net/hardening-php-seguranca-hack/

Contato

Flvio M. de Souza
flavio@inovup.com.br
(85) 8667-2972

Você também pode gostar