PHP 5 de Forma Correta e Segura

Preview:

DESCRIPTION

A forma correta e simples de seguir uma técnica de programação em PHP.Alguns dos ataques mais comum e como se defender.É comum encontrar desenvolvedores desatentos deixando brechas que, por mais simples que seja, podem gerar situações desagradáveis. Prevenção de ataques aplicados ao seu usuário, modalidade de ataque que vem crescendo. Esta palestra vai abordar melhores práticas para Iniciar em PHP, reunindo os cuidados que devem ser tomados na hora de desenvolver uma aplicação web, com técnicas de programação defensiva em segurança.

Citation preview

PHP 5 de Forma Correta e Segura

Kleber da Silva RodriguesEngenheiro de ComputaçãoMilenium InformáticaTwitter: @krebistux

19 de Novembro de 2011

Sobre a Milenium Informatica

Área de Atuação – 17 Anos no Mercado

A Milenium Informática é uma empresa prestadora de serviços, atuando na área de:

Consultoria em Conectividade, Redes, Segurança da Informação, Servidores de aplicações;

Soluções em Banco de Dados, Conectividade , Desenvolvimento,

Redes e Segurança da Informação;

Desenvolvimento de sistemas personalizados;

Treinamentos: Milenium TI Center e Mandriva.

Sobre a Milenium Informatica

* PHP - Web Sites Dinâmicos I

* PHP Avançado - Web Sites Dinâmicos II

* PostgreSQL – Começando nesta semana (23/11/2011)

* Informações no site, por telefone ou msn: treinamento@mileniuminformatica.com.br

Porque utilizar PHP :)

Dados Atuais sobre PHP na área de TI

Dicas para programação correta

Técnicas para Segurança

As formas de Ataque/ Tipos de Ameaça

Protegento o lado do cliente

Onde pedir ajuda Oportunidade de carreira

Dúvidas, critícas, sugestões ...

Conteúdo da Palestra

Introdução

O PHP é hoje uma das linguagens web mais populares.

Se você sair navegando pela internet e observar a extensão das

páginas verá que uma grande parte, se não a maioria, é página

PHP.

E ainda tem aqueles sites que escondem a extensão.

O PHP tem grandes vantagens como programação web:

É uma linguagem simples de aprender (isso também gera

problema, pois mesmo quem não sabe consegue fazer uma

página)

Tem muitos recursos para a criação de sites, como boas

funções para trabalhar com strings, com arquivos, etc.

Integração com os principais SGBDs

O PHP tem grandes vantagens como programação web:

Funciona com os principais servidores web, sendo

principalmente usado com Apache.

Tem um bom suporte a Orientação a Objetos. Veja que os

grandes frameworks e CMS usam o PHP orientado a objetos.

Em consequência de ser popular você não vai encontrar uma

hospedagem web para seu site que não tenha suporte ao

PHP.

Fonte: Tiobe Software

Popularidade

Simplicidade e Adaptabilidade

Modelo de desenvolvimento simples

- Facilita o aprendizando

Sintaxe Estruturada ou

Sintaxe Orientada à Objetos

- Similar ao Java e C++

- Encapsulamento, Herança, Polimorfismo, Interfaces,

Reflexão

- Visibilidade, Exceções, Métodos Mágicos (interceptadores).

- SPL (Standard PHP Library)

- Desenvolvimento em camadas, Shell Scripts, ...

Quem Usa PHP ?

Quem Usa PHP ?

Quem Usa PHP ?

Quem Usa PHP ?

Quem Usa PHP ?

Quem Usa PHP ?

Quem Usa PHP ?

Quem Usa PHP ?

Quem Usa PHP ?

Algumas das Melhores Práticas para Iniciar em PHP

Seja amigo do manual do PHP e da busca de funções em:

Manual

http://www.php.net/manual/pt_BR/

Busca por Funções

http://www.php.net

Muito rico: sintaxe, explicações e vários exemplos de uso.

Algumas das Melhores Práticas para Iniciar em PHP

Ative a reportagem de erros.

http://www.php.net/manual/en/function.error-reporting.php

Se não estiver ativa você não receberá nenhuma

indicação sobre os erros.

Quando ativa você será ajudado, com mensagens de erro

contendo muitos detalhes que o ajudarão a corrigir o erro.

Algumas das Melhores Práticas para Iniciar em PHP

Adote uma IDE. Experimente:

NetBeans for PHP - http://www.netbeans.org

Eclipse PDT - http://www.eclipse.org/pdt

Algumas das Melhores Práticas para Iniciar em PHP

Ambas com últimos recursos que tornarão seu trabalho

de programador mais produtivo:

– Destaque de sintaxe;

– Auto-completar o código;

– Avisos de erros (tratamento de erros);

– E muitos outros bons recursos.

Algumas das Melhores Práticas para Iniciar em PHP

Atenção para não se repetir no código (DRY).

Sempre que existir um código que você usa em vários

locais, procure criar uma função e evite ao máximo copiar

e colar código.

Algumas das Melhores Práticas para Iniciar em PHP

Para grande clareza do seu código sempre use

INDENTAÇÃO. Alguns códigos sem indentação ficam

quase ilegíveis, em especial em estruturas de controle.

http://pt.wikipedia.org/wiki/Indentação

Algumas das Melhores Práticas para Iniciar em PHP

Seja organizado e sempre procure separar seu código em

camadas coerentes.

Código JavaScript deve ficar em um arquivo .js.

Código CSS deve ficar em um arquivo separado .css.

Assim como deve ter um arquivo de funções, um arquivo

com configurações, um diretório para os templates, um

para as imagens, etc.

Algumas das Melhores Práticas para Iniciar em PHP

Sempre usa as tags:

< ?php

? >

São as mais completas, as únicas que suportam o XML.

Evite as outras possíveis.

Algumas das Melhores Práticas para Iniciar em PHP

Outro assunto importante são o sistema de nomeação de

variáveis, funções, constantes e classes.

Use um sistema coerente. Não precisa seguir nenhum

padrão existente, embora não seja também problema se o

fizer, mas o importante é que sempre siga o mesmo

padrão.

Algumas das Melhores Práticas para Iniciar em PHP

/* Comentários */

Estes tanto são importantes para quem ler seu código

quanto para você mesmo.

Para efetuar alguma manutenção bem posterior.

Os comentários ajudam muito. Para ajudar tem o PHP

Documentor (http://www.phpdoc.org).

Algumas das Melhores Práticas para Iniciar em PHP

Para iniciar use um bom pacote instalador. Existem

vários, mas meu preferido LAMP.

Outros:

EasyPHP - http://www.easyphp.org/

Xampp - http://www.apachefriends.org/pt_br/index.html

Algumas das Melhores Práticas para Iniciar em PHP

Existe uma função no PHP, que controla o tempo de

execução dos scripts, que chama-se, set_time_limit().

Esta função evita loops infinitos e timeout da conexão

com o banco de dados.

Ela define a quantidade máxima de segundos em que a

função deve rodar (default são 30 segundos). Após esse

tempo um erro fatal será disparado.

Algumas das Melhores Práticas para Iniciar em PHP

Use POO somente quando necessário e realmente se

caracterizar o uso de objetos.

Caracterização da Modelagem do Sistema.

Algumas das Melhores Práticas para Iniciar em PHP

Evite o uso de frameworks, pois geralmente engessam

qualquer manutenção ou alguma alteração que precise

fazer.

Frameworks devem ser usados apenas quando você usa

exatamente os mesmos estilos de aplicativos.

Melhor ir guardando os exemplos usados, as funções,

rotinas e com o tempo ter sua biblioteca que irá facilitar a

construção de aplicativos.

Algumas das Melhores Práticas para Iniciar em PHP

Evite o uso de aspas duplas. Somente use quando

necessário. As aspas simples são mais seguras e com

melhor desempenho.

Algumas das Melhores Práticas para Iniciar em PHP

Caso crie um arquivo contendo a função phpinfo() em seu

servidor de produção, remova-o após a execução.

Existe muita informação que poderá cair em mãos

erradas.

Algumas das Melhores Práticas para Iniciar em PHP

Sempre valide os dados recebidos dos usuários.

Por mais confiáveis que eles sejam eles estão sujeitos a

erros.

Valide sempre antes de armazenar no banco.

Algumas das Melhores Práticas para Iniciar em PHP

Includes

A inclusão de arquivos via include() e require(),

São muito úteis, mas pode ter consequências muito ruins

senão utilizadas corretamente.

É muito comum a inclusão de arquivos recebidos via URL

sem que a string seja filtrada.

Algumas das Melhores Práticas para Iniciar em PHP

Includes

Arquivos com extensões que o seu servidor web não

conheça.

Evite extensões do tipo .inc. Se for fazer, prefira

colocando arquivo.inc.php.

Algumas das Melhores Práticas para Iniciar em PHP

Includes

Funções para filtrar dados recebidos e evitar um ataque

de XSS ou exposição de código.

basename()

file_exists()

Algumas das Melhores Práticas para Iniciar em PHP

Armazene senhas criptografadas no banco.

Algumas das Melhores Práticas para Iniciar em PHP

Use visualizadores de dados dos SGBDs.

MySQL

DBDesigner - http://fabforce.net/dbdesigner4

WorkBench - http://dev.mysql.com/workbench

PostgreSQL

DBVisualizer - http://www.dbvis.com

Algumas das Melhores Práticas para Iniciar em PHP

Valide dados de Cookies.

Para isso use as funções:

– htmlspecialchars()

– mysql_real_escape_string ()

– pg_escape_string()

http://us3.php.net/manual/en/function.htmlspecialchars.php

http://us3.php.net/mysql_real_escape_string

Mantenha funçoẽs fora de laços

<?php

$cont!=0;

function laco ($cont) {

echo 'Nada bom isso';

}

while ($cont<100)

{

laco ($cont)

echo "O valor atual do contador é $cont <br>";

$cont++;

}

?>

Algumas das Melhores Práticas para Iniciar em PHP

Trabalhe sempre com as versões mais recentes dos

softwares que utiliza, inclusive PHP, Apache, MySQL,

PostgreSQL.

As versões mais recentes corrigem bugs, trazem novas e

importantes funcionalidades.

Algumas das Melhores Práticas para Iniciar em PHP

Assine boas listas de discussão.

Visite bons fórums e bons sites, assim como também em

ainda sobrando alguma dúvida procure no Google.

Documentação ampla :)

http://phpbrasil.com/http://www.phpms.org/

Um pouco de Segurança

O que é segurança ??

CONFICIALIDADE - INTEGRIDADE - DISPONIBILIDADE

Um pouco de Segurança

Não existem aplicaçoes 100% seguras ....

Um pouco de Segurança

Segurança e Usabilidade

Segurança e Usabilidade

Sempre ...

Proteção Nunca é Demais

Sua aplicação é Segura ?

Seu sistema invadido

pode e vai te gerar muitos

problemas.

Horas e Finais de Semana

de preocupação.

Sua aplicação é Segura ?

Revise seu código

Testes exaustivos, tornam

Mais seguros

Revise seu código

Sua aplicação é Segura ?

Aplicações com segurança,

custa caro

Aplicações sem segurança,

custam mais caro ainda ...

Tornando sua aplicação ais Segura

Mais pesquisa no projeto

Maior tempo de codificação

Testes mais sofisticados

Qual a melhor defesa ???

Tornando sua aplicação mais Segura

É o ATAQUE !!!

Ataque que podem acontecer

Brute Force

Rainbow Table

Password Sniffing

XSS (Cross-site Scripting)

SQL Injection

Session Hijacking

Cookie Theft

O que é ?

Injeção de código indevido em uma página.

Como ocorre

Brechas em formulários onde os dados

enviados ao servidor não são devidamente

filtrados.

XSS (Cross-site Scripting)

Como Evitar ?

Existem funções prontas no PHP

Usadas como filtros de strings.

XSS (Cross-site Scripting)

Funções que você pode utilizar:

htmlspecialchars()

htmlentities()

filter_input()

XSS (Cross-site Scripting)

SQL Injection

O que é ?

Injeção de códigos SQL aleatório dentro de

uma consulta no seu BD.

Na maioria das vezes a injeção de códigos

SQL se dá partir de formulários não

filtrados, em que dos dados recebidos vão

diretamente para dentro da consulta.

SQL Injection

EXEMPLO:

id=-

999.9'/**/UNION/**/ALL/**/SELECT/**/0x31303235343830303536,0

x31303235343830303536,(SELECT/**/concat(0x7e

,0x27,Hex(cast(acessar.senha/**/as/**/char)),0x27,0x7e

)/**/FROM/**/`banco`.acesso/**/LIMIT/**/0,1

)/**/,0x31303235343830303536,0x31303235343830303536,0x3130

3235343830303536,0

x31303235343830303536,0x31303235343830303536,0x31303235

343830303536,0x31303235343830303536/**/and/**/'x'='x

Como Evitar ?

Filtrando os dados enviados pelo usuário é

possível evitar que seja injetado

código dentro do seu SQL.

SQL Injection

Proteja seus script contra Injeção em SQL.

MySQL - mysql_real_escape_string():

http://us3.php.net/mysql_real_escape_string

PostgreSQL existe a função pg_escape_string() e pg-

escape-bytea():

http://www.php.net/manual/pt_BR/function.pg-escape-

string.php

http://www.php.net/manual/pt_BR/function.pg-escape-

bytea.php

SQL Injection

E para reforçar a segurança:

$meus_dados =

pg_escape_string(utf8_encode($_POST['meus_dados']));

Mais Funções que pode utilizar:

addslashes()

preg_replace()

mysql_real_escape_string()

SQL Injection

<?php

/*está função deve ser chamada sempre que enviar dados de GET ou POST

em consultas sql*/

function anti_injection($sql){

$sql = preg_replace(sql_regcase("/(from|select|insert|delete|where|drop table|

show tables|#|\*|--|\\\\)/"), "" ,$sql);

$sql = trim($sql);

$sql = strip_tags($sql);

$sql = (get_magic_quotes_gpc()) ? $sql : addslashes($sql);

return $sql;

}

?>

SQL Injection – Exemplo Anti Injection

O que é ?

Quando o invasor obtém acesso à sessão de um usuário já

autenticado no sistema.

Como acontece ?

Sempre que os dados do cliente são armazenados em sessão é

gerado um identificador de usuário no servidor.

Se o invasor conseguir obter o ID, poderá navegar pelo site

como usuário real.

Exemplo -> pagina.php?id_user=22

Session Hijacking

Evitando o Ataque

Verificar o ID recebido, com funções redundantes, comparando

o IP e o usuário com outros campos para mais segurança;

Aplicação de Cookies, para uma navegação mais segura;

Sobre mais http://tinyurl.com/mais-sobre-sess-hijacking

Session Hijacking

Cuidado com o Havij

Mecanismo de Busca

Mecanismo de Busca

Scanner Testing

Ataque que pode acontecer

Qual o pior do

Ataque Citado ?

Ataque Físico

Política de Segurança

Controle de Acesso

Pesquise sobre:

Ataque de negação de Servico (Dos)

Testes de Invasão (Penetration Test)

Cross-site Request Forgery (XRFS)

Ataque Físico – (Tiazinha da Swat)

PHP é uma linguagem amplamente usada, é especializada para o desenvolvimento Web.De acordo com a Security Space, a linguagem PHP é o módulo mais popular do Apache e é instalado em mais de 50% dos sites Apache na Web.

PHP

Por que aprender PHP?Pesquisas mostram que o mercado brasileiro de programação

web deverá atingir índices expressivos de crescimento nos

próximos anos, aumentando assim a procura por profissionais

capacitados nessa linguagem para aplicaçoẽs web.

Duvidas?

Perguntas ?

www.mileniuminformatica.com.br3342-2115

Qualquer dúvida, entre em contato!

contato@mileniuminformatica.com.br

Obrigado !