desenvolvendo sistemas seguros com php
DESCRIPTION
Nesta palestra, abordo as principais formas de ataque, assim como diversas dicas de programação com PHP para tornar o seu sistema cada vez mais seguro, assim como também dicas de configurações do php.ini.TRANSCRIPT
![Page 1: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/1.jpg)
Desenvolvendo sistemas
seguros com PHPFLÁVIO M. DE SOUZA
![Page 2: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/2.jpg)
Flávio M. Souza
Graduado em Análise e Desenvolvimento de Sistemas, vivencia esse submundo daprogramação desde 2008 tendo o seu primeiro contato através da linguagem JAVA.
Seu Know-how é em automação de processos de empresas, tendo em seu currívulosdiversos segmentos como mercantil, imobiliária, construtora, cartório, clínicaodontológica entre outros.
Atuamente é Sócio DIretor e Analista de Sistemas da empresa inGETI (Provedora desoluções do SEBRAE/PI), trabalhando no projeto inSySALI (Sistema de gestão doSEBRAE para o programa Agente Local de Inovação), Analista de Sistemas daempresa Aura Consultoria, trabalhando no projeto DiagonalWEB (Sistema comercialna plataforma WEB da construtora Diagonal) e Professor da FATENE.
Possui conhecimento nas tecnologias JAVA SE, PHP, JAVASCRIPT, JQUERY, HTML, CSS,BOOTSTRAP, MYSQL e POSTGRESQL.
![Page 3: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/3.jpg)
Porque os sistemas são vulneráveis
Erros de programação
Erros de configuração
Mudanças não autorizadas
Uso impróprio
![Page 4: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/4.jpg)
O PHP é inseguro
Não, pelo contrário, o PHP sendo utilizado de forma correta é bastante seguro, não é a toa
que grandes frameworks utiliza-o como linguagem base.
O PHP por ser uma linguagem de fácil aprendizagem acaba sendo a primeira linguagem de
programação 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.
![Page 5: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/5.jpg)
O PHP é inseguro
Ranking das linguagens
de programação mais
Utilizadas no mundo.
![Page 6: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/6.jpg)
Tipos de ataques mais
utilizados
![Page 7: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/7.jpg)
XSS - Cross-Site Scripting
Permite a injeção de scripts no site atacado,
Em geral por meio de algum campo de input do usuário.
É um ataque ao usuário do site e não ao sistema servidor em si. Isso porque o script injetado
nunca será executado no servidor, mas sim nos navegadores dos clientes que visitarem a
página infectada.
Essas informações nos dão a primeira dica, JAMAIS DEVEMOS CONFIAR NAQUILO QUE O
USUÁRIO DIGITA.
![Page 8: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/8.jpg)
XSS - Cross-Site Scripting
A Solução para este tipo de ataque é escapar as entradas e saídas, dessa forma o texto
aparecerá como ele realmente é
![Page 9: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/9.jpg)
CSRF - Cross-Site Request Forgery
Comandos não autorizados são transmitidos de um usuário que confia no website.
Ele executa scripts que copiam informações de cookies armazenados do usuário de outros
sites para executar ações como postagens, requisições, executar login, etc.
![Page 10: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/10.jpg)
CSRF - Cross-Site Request Forgery
Como prevenção podemos:
Trabalhar com token nos formulários.
Limitar tempo de vida dos cookies e sessões.
Etc.
![Page 11: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/11.jpg)
SQL Injection
Consiste na inserção de instruções SQL dentro de uma consulta através da manipulação das
entradas de dados de uma aplicação.
![Page 12: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/12.jpg)
SQL Injection
Vamos imaginar uma aplicação com um formulário que recebe um nome de usuário, e
depois faz uma consulta ao banco de dados:
$sql = "select * from usuarios where nome = '" . $_POST['txt_nome'] . "'";
![Page 13: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/13.jpg)
SQL Injection
O comando SQL é montado a partir de componentes numéricos. Exemplo: pesquisa por uma
chave primária de um registro. Neste caso, o atacante também pode tentar manipular o
conteúdo de forma a injetar código adicional na string SQL.
$sql = "select * from usuarios where codigo = " . $cod ;
![Page 14: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/14.jpg)
SQL Injection
O PHP fornece uma série de funções para este tratamento, são as funções de escape de
caracteres. A maioria dos bancos suportados pelo PHP tem esta função.
MySQLi - mysqli::real_escape_string
MySQL - mysql_escape_string
Postgre - pg_escape_string
SQLite - sqlite_escape_string
![Page 15: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/15.jpg)
SQL Injection – Simulando um ataque
Primeiro passo - Número 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 wheretable_schema=database()--
Terceiro passo - Descobrir nomes dos campos
null union all select 1,2,group_concat(column_name) from information_schema.columns wheretable_schema=database()--
Quarto passo - Descobrir nomes dos usuários
null union all select 1,2,usu_login FROM usuarios--
Quarto passo - Descobrir senhas dos usuários
null union all select 1,2,usu_senha FROM usuarios--
![Page 16: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/16.jpg)
File Upload
Permite que o usuário possa subir qualquer tipo de arquivo para o seu servidor, possibilitando
assim a exclusão de arquivos, captura de dados entre uma série de possíveis problemas que
você pode ter.
![Page 17: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/17.jpg)
File Upload
Para prevenir, se faz necessário a validação não somente da extensão do arquivo, como
também o seu conteúdo.
![Page 18: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/18.jpg)
PHP Injection
Permite a inclusão (include) de arquivos remotos diretamente em seus sistemas, dessa forma
ele conseguirá executar scripts dentro de seu servidor.
![Page 19: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/19.jpg)
PHP Injection
Para prevenir você poderá bloquear o include através de URLs no arquivo php.ini, para isso
basta configurar a seguinte opção allow_url_include = Off.
![Page 20: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/20.jpg)
Boas práticas de
programação para
tornar o seu sistema mais
seguro
![Page 21: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/21.jpg)
Não passar informações pela URL
Um erro comum de programadores iniciantes é enviar informações através da url utilizando o
método GET.
Por padrão, o formulário utiliza o método GET, é preciso configurá-lo através do atributo
method=“POST”.
![Page 22: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/22.jpg)
Validações do lado do servidor ou do
lado do cliente?
Validação do lado do cliente.
O usuário pode interferir nas validações.
Valida em tempo real.
Alguns navegadores não suportam
JavaScript.
Validação do lado do servidor.
O usuário não consegue interferir nas
validações.
Só valida após enviar os dados do formulário.
Funciona em todos os navegadores já que a
validação ocorrerá no servidor independente
de navegador.
![Page 23: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/23.jpg)
Spoofing de formulários
O Spoofing ocorre quando alguém faz uma postagem de um de seus formulários de algum
local inesperado.
Técnica mais utilizada para a prevenção do ataque é o uso de um token.
No momento que é exibido o formulário, um token é gerado e armazenado na sessão, quando
o formulário é enviado, é confirmada se a chave enviada é a mesma gravada na sessão.
![Page 24: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/24.jpg)
Mudar o nome da sessão
Quando não informado o nome da sessão, o PHP cria automaticamente com o nome
PHPSESSID
Esse nome padrão torna a sessão do usuário vulnerável.
O ideal é que se altere o nome para características próprias de cada usuário como por
exemplo Código + Nome + Data d
![Page 25: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/25.jpg)
Verificar origem dos dados
Caso você utilize uma versão mais antiga do PHP, de quando o register_globals ainda
funcionava.
O register_globals criava variáveis automaticamente a partir dos arrays superglobais $_GET,
$_POST, $_SESSION, $_COOKIE, $_SERVER.
![Page 26: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/26.jpg)
Limitar o tempo da sessão
Embora o usuário tenha saído do site ou até mesmo fechado o navegador, dependendo da
forma como está configurada, a sessão permanecerá ativa no servidor.
O ideal é que se limite o tempo da sessão.
O ideal também é que você trate através de eventos para que ao usuário sair do site, aquela
sessão automaticamente seja excluída.
![Page 27: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/27.jpg)
Validar upload de arquivos
Usuários maliciosos podem subir arquivos que podem ser executados no servidor e trazer algum
dano.
Para evitar esse tipo de ataque, você precisa validar não somente a extensão do arquivo, mas
também o conteúdo do mesmo.
![Page 28: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/28.jpg)
Use require ao invés de include
O include, como o próprio nome diz inclui um arquivo dentro de uma página, mas isso não
torna obrigatória a presença do mesmo, ou seja, se por algum motivo o arquivo não exista, ele
continua com a execução do script.
Já o Require, torna obrigatória a inclusão do arquivo, assim, se por algum motivo o arquivo não
existir, ele bloqueia a execução do script.
![Page 29: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/29.jpg)
Verificar nível de acesso em
funcionalidades
Não adianta em um sistema usar milhões de ifs e tratar apenas os menus.
O usuário conseguirá acessar qualquer página através do link direto.
Forma correta de se validar nível de acesso é bloquear todas as funcionalidades para todos os
usuários e só liberá-las apenas para os usuários autorizados.
Forma errada de se validar nível de acesso, liberar todas as funcionalidades para todo mundo
e bloqueá-las apenas para os usuários não autorizados.
![Page 30: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/30.jpg)
Filtrar todas as entradas de dados
Nunca confie no usuário.
Filtre todas as entradas de dados para saber se realmente é o que o seu sistema espera.
O PHP disponibiliza uma função interessante para fazer essa validação ou saneamento, essa
função é a filter_input();
![Page 31: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/31.jpg)
Filtrar todas as saídas de dados
Sempre quando for exibir dados, converta os caracteres para realidade HTML.
![Page 32: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/32.jpg)
Monitore os erros de senha
Em caso de mais de três tentativas de senha incorreta, bloqueie o IP de origem, adicione um
Captcha como validação adicional, isso dificulta ataques de forca bruta.
![Page 33: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/33.jpg)
Trabalhe formulários com Captcha
Adicione um Captcha como validação adicional, isso dificulta ataques de forca bruta.
![Page 34: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/34.jpg)
Permissões em pasta
Restrinja o acesso às pastas do servidor, ou seja,
permissões de execução e escrita somente em pastas
apropriadas.
![Page 35: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/35.jpg)
Não armazenar senha em texto puro
na sessão
Senhas não devem ser armazenadas sem “cifragem”, sempre armazene senhas
criptografadas, assim estaremos protegendo também nossos usuários, numa eventual
invasão ao banco de dados.
![Page 36: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/36.jpg)
Não armazenar senha em texto puro
no banco de dados
http://www.gemind.com.br/11654/microsoft-store-india-senhas-hackers/
Hackers conseguem senhas (em texto puro!) da Microsoft Store indiana
![Page 37: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/37.jpg)
PHP Injection
Muitas vezes quando se faz include de forma dinâmica, ou seja, com a página sendo
passada através de variáveis, abre-se uma brecha enorme para ataques, pois o usuário mal
intencionado pode alterar o valor dessa variável para um arquivo externo que poderá ser
executado dentro de seu servidor.
Como prevenção podemos desabilitar no arquivo php.ini o include de arquivos através de
url allow_url_include ou simplesmente validar se o arquivo existe is_file em nosso servidor.
![Page 38: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/38.jpg)
Requisições JSON
Requisições que retornam JSON são ótimas de ser utilizadas em nossos sistemas, porém, é de
extrema importância que haja uma validação de onde vem essa requisição.
Como se trata de uma requisição, eu não preciso está dentro do servidor para executar a
mesma e isso juntamente com um arquivo mal configurado pode permitir que sejam
roubadas informações de seus sistemas.
![Page 39: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/39.jpg)
Use Framework
Por fim, é altamente recomendável que você utilize frameworks para desenvolvimento, pois,
estes possuem equipes de programadores altamente experientes que já pensaram nisso tudo
para você.
![Page 40: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/40.jpg)
Usando o php.ini para
tornar o PHP mais seguro
![Page 41: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/41.jpg)
Não exiba erros
display_errors=Offlog_errors=Onerror_log=/var/log/httpd/php_scripts_error.log
No ambiente de produção trabalhe com erros na forma de logs.
Mostrar erros na t
ela pode revelar informações importantes do teu sistema.
![Page 42: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/42.jpg)
register_globals
Cria variáveis automaticamente a partir dos arrays superglobais $_GET, $_POST, $_SESSION,
$_COOKIE, $_SERVER
![Page 43: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/43.jpg)
register_globals
Register_globals=Off
Desabilitada por padrão a partir da versão 4.2.0 do PHP
Considerada obsoleta a partir da versão 5.3
Não está mais presente a partir da versão 5.4
![Page 44: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/44.jpg)
Desabilite o upload de arquivos
file_uploads=Off
Caso seu sistema não tenha upload de arquivos, desabilite a funcionalidade para que
nenhum mal intencionado possa estar subindo arquivos indevidos para o seu servidor.
![Page 45: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/45.jpg)
Desabilite a execução remota de
códigos
allow_url_fopen=Off
allow_url_include=Off
Dessa forma seu sistema não permite que sejam incluídos arquivos externos.
![Page 46: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/46.jpg)
Controle o tamanho das requisições
POST
post_max_size=1K
Caso seu sistema não trabalhe com muita transferência de dados, não tem necessidade de
ter um tamanho alto para a transferência dos mesmos.
![Page 47: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/47.jpg)
Controle os recursos que um script
pode consumir
max_execution_time = 30max_input_time = 30memory_limit = 40M
Dessa forma você evita o estouro de memória em seu servidor, caso um usuário descubra
que existe algum script causando estouro de memória ele pode se aproveitar dessa falha
para deixar seu servidor indisponível.
![Page 48: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/48.jpg)
Desabilitando funções perigosas do
PHP
disable_functions =exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
Existem algumas funções que se você não 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.
![Page 49: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/49.jpg)
Para finalizar
NENHUM SISTEMA É 100% SEGURO.
![Page 50: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/50.jpg)
Dúvidas???
![Page 51: Desenvolvendo sistemas seguros com PHP](https://reader031.vdocuments.site/reader031/viewer/2022012322/559ba23d1a28ab16158b4675/html5/thumbnails/51.jpg)
Referências
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/apresentacaosegurancaphp.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/