MySQL e PHP: SegurançaCarlos SantosLabMM 4 - NTC - DeCA - UAAula 22, 16-05-2013
MySQL: recomendaçõesServidor MySQL• nunca utilizar o utilizador root para o acesso às BDs• para cada BD, definir um novo ut...
MySQL: recomendaçõesServidor MySQL• atribuir os privilégios estritamente necessários a esse utilizador e apenasna BD com q...
Paradigma “Need to know only”Esconder toda a informação que permita saber mais do que é necessáriosobre:• ficheiros e pasta...
Listagem de diretórios/pastasNão permitir o directory browsing• não permitir ver os conteúdos de uma pasta quando não exis...
Informação sobre o servidor WebEsconder informação sobre o servidor Web• no .htaccess (ServerSignature Off)• também é poss...
Configuração do PHPEsconder informação sobre a configuração do PHP no servidor• não permitir a execução da função phpinfo()•...
Mensagens de erro do PHPEsconder mensagens de erros do PHP (expõem informações importantessobre os ficheiros, servidor e PH...
Exemplo: log file
Mais recomendaçõesPHP Security Consortium (http://phpsec.org/)• na secção de projectos:• Security Guide (PDF)• PHPSecInfo:...
Execução de ficheiros via WebImpedir que se possam visualizar/alterar ou executar, via Web, ficheirospotencialmente perigoso...
Inclusão e upload de ficheirosIncluir ficheiros sempre através do require/require_once -> qualquer errotermina execução do P...
Filtragem de dadosMuitas das ameaças à segurança podem provir de dados maliciososintroduzidos em formulários, variáveis su...
Filtragem e codificação de dadosValores contidos numa variável• filter_var($a, FILTER_VALIDATE_INT);• filter_var($a, FILTER...
Filtragem e codificação de dadosPreservar a formatação HTML mas codificar inputs para utilizarem HTMLentities• htmlentities(...
Filtragem e codificação de dadosget_magic_quotes_gpc() -> avalia o estado da diretiva no php.ini• por defeito está “Off” (no...
SQL InjectionA introdução de inputs não filtrados nas queries pode originar falhas desegurança. É inadmissível em páginas d...
SQL Injection: funções de filtragemRemover eventuais comandos SQL• preg_replace ($padrao_a_procurar, $valor_substituicao,$s...
Outras funções úteis na filtragem/validaçãoPesquisa de padrões• preg_match($padrao_a_procurar, $string_alvo_da_procura);• p...
Codificação de passwordsArmazenar na BD as passwords codificadas!• MD5 (128bits)• $pwd_codif = md5($pwd);• SHA1 (160bits) ou...
XSS - Cross Site ScriptingIntrodução de código (normalmente JS) em áreas de User GeneratedContent (blogues, fóruns, commen...
Próximos SlideShares
Carregando em…5
×

LabMM4 (T22 - 12/13) - segurança

767 visualizações

Publicada em

Publicada em: Educação
0 comentários
1 gostou
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
767
No SlideShare
0
A partir de incorporações
0
Número de incorporações
7
Ações
Compartilhamentos
0
Downloads
49
Comentários
0
Gostaram
1
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

LabMM4 (T22 - 12/13) - segurança

  1. 1. MySQL e PHP: SegurançaCarlos SantosLabMM 4 - NTC - DeCA - UAAula 22, 16-05-2013
  2. 2. MySQL: recomendaçõesServidor MySQL• nunca utilizar o utilizador root para o acesso às BDs• para cada BD, definir um novo utilizador só com acesso via localhost(se aplicável)
  3. 3. MySQL: recomendaçõesServidor MySQL• atribuir os privilégios estritamente necessários a esse utilizador e apenasna BD com que ele irá interagir• se necessário, ter utilizadores com privilégios diferenciados para frontoffice e back office
  4. 4. Paradigma “Need to know only”Esconder toda a informação que permita saber mais do que é necessáriosobre:• ficheiros e pastas do servidor• configuração do servidor Web• configuração do PHP no servidor Web• estrutura da BD
  5. 5. Listagem de diretórios/pastasNão permitir o directory browsing• não permitir ver os conteúdos de uma pasta quando não existe umficheiro por defeito• colocar na pasta um ficheiro .htaccess (Options -Indexes)• os efeitos do .htaccess são reflectidos nas subpastas
  6. 6. Informação sobre o servidor WebEsconder informação sobre o servidor Web• no .htaccess (ServerSignature Off)• também é possível utilizando o httpd.conf• qualquer informação disponível pode dar pistas que facilitam oreconhecimento de falhas de segurança a explorar!
  7. 7. Configuração do PHPEsconder informação sobre a configuração do PHP no servidor• não permitir a execução da função phpinfo()• php.ini (disable_functions = phpinfo)• esta diretiva do php.ini pode ser utilizada para outras funçõespotencialmente perigosas (disable_functions = phpinfo, exec,passthru, shell_exec, system, proc_open, popen,curl_exec, curl_multi_exec, parse_ini_file, show_source)• não expor informação sobre o PHP• php.ini (expose_php = ‘off’)
  8. 8. Mensagens de erro do PHPEsconder mensagens de erros do PHP (expõem informações importantessobre os ficheiros, servidor e PHP)• php.ini; E_ALL & ~E_NOTICE (Show all errors, except for notices and coding standards warnings.); E_ALL & ~E_NOTICE | E_STRICT (Show all errors, except for notices); E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR (Show only errors); E_ALL | E_STRICT (Show all errors, warnings and notices including coding standards.); Default Value: E_ALL & ~E_NOTICE; Development Value: E_ALL | E_STRICT; Production Value: E_ALL & ~E_DEPRECATEDerror_reporting = E_ALL & ~E_DEPRECATED; Default Value: On; Development Value: On; Production Value: Offdisplay_errors = Off• em produção, ter log dos erros: log_errors=On e error_log=“file”
  9. 9. Exemplo: log file
  10. 10. Mais recomendaçõesPHP Security Consortium (http://phpsec.org/)• na secção de projectos:• Security Guide (PDF)• PHPSecInfo: aplicação (Download & install)
  11. 11. Execução de ficheiros via WebImpedir que se possam visualizar/alterar ou executar, via Web, ficheirospotencialmente perigosos• .htaccess<Files ~ ".(log|inc|sql|ini)$">Order allow,denyDeny from all</Files><Files ~ "^.ht">Order allow,denyDeny from allSatisfy All</Files>extensões não permitidasimpedir o acesso ao .htaccess
  12. 12. Inclusão e upload de ficheirosIncluir ficheiros sempre através do require/require_once -> qualquer errotermina execução do PHPNo upload de ficheiros a partir de uma formulário:• testar a extensão do ficheiro carregado: $_FILES[‘ficheiro’][‘type’] ouatravés da função pathinfo()• testar o tamanho do ficheiro carregado: $_FILES[‘ficheiro’][‘size’] ouatravés da função filesize()• no final usar sempre a função move_uploaded_file(), para colocar oficheiro na sua pasta destino
  13. 13. Filtragem de dadosMuitas das ameaças à segurança podem provir de dados maliciososintroduzidos em formulários, variáveis superglobais ($_GET, $_POST,$_SESSION, $_FILES, etc), queries à BD, etc…• filtragem lógica -> associada à lógica do algoritmo de processamentodos dados• filtragem de limpeza -> remoção de todos os caracteres potencialmenteperigosos nos dados• usar sempre -> filtragem cliente-side (JavaScript) + filtragem server-side (PHP)• evitar utilização de hidden form fields• evitar, sempre que possível, a passagem de parâmetros na Query String-> usar Variáveis de sessão• parâmetros na Query String -> são de fácil edição e partilha e podemrevelar estrutura da BD ou de outros parâmetros da aplicação
  14. 14. Filtragem e codificação de dadosValores contidos numa variável• filter_var($a, FILTER_VALIDATE_INT);• filter_var($a, FILTER_SANITIZE_NUMBER_INT);• filter_var($b, FILTER_VALIDATE_EMAIL);• filter_var($b, FILTER_SANITIZE_EMAIL);• Mais critérios em http://php.net/manual/en/filter.constants.php• Artigo sobre filtragem: http://www.phpro.org/tutorials/Filtering-Data-with-PHP.html
  15. 15. Filtragem e codificação de dadosPreservar a formatação HTML mas codificar inputs para utilizarem HTMLentities• htmlentities($d);Limpar tags HTML e PHP• strip_tags($e);Problemas com codificação• utf8_encode($e1);• utf8_decode($e2);Retirar espaços do início e do final de uma string• trim($a);
  16. 16. Filtragem e codificação de dadosget_magic_quotes_gpc() -> avalia o estado da diretiva no php.ini• por defeito está “Off” (no PHP 6 será removida!)• quando “On” todos os valores vindos por $_GET, $_POST, $_COOKIErecebem o escape automático de certos caracteres: ‘, ”, stripslashes() -> remove as de uma string$string = mysqli->real_escape_string($string)• faz o escape de ‘, “ e
  17. 17. SQL InjectionA introdução de inputs não filtrados nas queries pode originar falhas desegurança. É inadmissível em páginas de produção!
  18. 18. SQL Injection: funções de filtragemRemover eventuais comandos SQL• preg_replace ($padrao_a_procurar, $valor_substituicao,$string_alvo_da_procura)• $padrao_a_procurar = “/(…|…|…)/i”palavras a procurar(expressões regulares).“i” no final torna pesquisacase insensitivefunction valida($a) {$a = strip_tags($a); //remover tags$a = mysqli->real_escape_string($a);$padrao = "/(select|from|where|like|order|drop|insert|delete|update|values|and|or|create|tables|table|#|;)/i";$a = preg_replace($padrao, "", $a);$a = trim($a);return $a;}!
  19. 19. Outras funções úteis na filtragem/validaçãoPesquisa de padrões• preg_match($padrao_a_procurar, $string_alvo_da_procura);• preg_match("/@ua.pt/i",$f);• preg_match("/^(?!d+$|[a-z]+$|.*[W_])/i",$g);• http://www.phpf1.com/tutorial/php-regular-expression.html• http://weblogtoolscollection.com/regex/regex.php• ctype_alnum($string); -> valida caracteres alfanuméricos• ctype_alpha($string); -> validação de caracteres alfabéticos• ctype_digit($string); -> valida caracteres numéricos
  20. 20. Codificação de passwordsArmazenar na BD as passwords codificadas!• MD5 (128bits)• $pwd_codif = md5($pwd);• SHA1 (160bits) ou hash()• $pwd_codif = sha1($pwd);• BASE64• $pwd_codif = base64_encode($pwd);• $pwd = base64_decode($pwd_codif);• hash(...) e crypt(...)• permitem escolher o tipo de codificação• o crypt() permite adicionar uma string de SALT
  21. 21. XSS - Cross Site ScriptingIntrodução de código (normalmente JS) em áreas de User GeneratedContent (blogues, fóruns, comments, etc.)• não é um ataque direto ao site, mas sim ao utilizador…• diferenças entre browsers!• Exemplo 1• Input: <script language="javascript"> document.location="http://www.ua.pt"; </script>echo $_POST[campo1]; //vai redirecionar• Exemplo 2• Input: <script language="javascript"> document.location="http://www.ua.pt"; </script>echo strip_tags($_POST[campo1]); //não redirecionaecho htmlentities($_POST[campo1]); //não redireciona

×