labmm4 (t22 - 12/13) - segurança

21
MySQL e PHP: Segurança Carlos Santos LabMM 4 - NTC - DeCA - UA Aula 22, 16-05-2013

Upload: carlos-santos

Post on 18-Dec-2014

574 views

Category:

Education


3 download

DESCRIPTION

 

TRANSCRIPT

Page 1: LabMM4 (T22 - 12/13) - segurança

MySQL e PHP: Segurança

Carlos SantosLabMM 4 - NTC - DeCA - UAAula 22, 16-05-2013

Page 2: LabMM4 (T22 - 12/13) - segurança

MySQL: recomendações

Servidor 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)

Page 3: LabMM4 (T22 - 12/13) - segurança

MySQL: recomendações

Servidor MySQL

• atribuir os privilégios estritamente necessários a esse utilizador e apenas na BD com que ele irá interagir

• se necessário, ter utilizadores com privilégios diferenciados para front office e back office

Page 4: LabMM4 (T22 - 12/13) - segurança

Paradigma “Need to know only”

Esconder toda a informação que permita saber mais do que é necessário sobre:

• ficheiros e pastas do servidor• configuração do servidor Web• configuração do PHP no servidor Web • estrutura da BD

Page 5: LabMM4 (T22 - 12/13) - segurança

Listagem de diretórios/pastas

Não permitir o directory browsing

• não permitir ver os conteúdos de uma pasta quando não existe um ficheiro por defeito

• colocar na pasta um ficheiro .htaccess (Options -Indexes)• os efeitos do .htaccess são reflectidos nas subpastas

Page 6: LabMM4 (T22 - 12/13) - segurança

Informação sobre o servidor Web

Esconder 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 o

reconhecimento de falhas de segurança a explorar!

Page 7: LabMM4 (T22 - 12/13) - segurança

Configuração do PHP

Esconder 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ções potencialmente 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’)

Page 8: LabMM4 (T22 - 12/13) - segurança

Mensagens de erro do PHP

Esconder mensagens de erros do PHP (expõem informações importantes sobre 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”

Page 9: LabMM4 (T22 - 12/13) - segurança

Exemplo: log file

Page 10: LabMM4 (T22 - 12/13) - segurança

Mais recomendações

PHP Security Consortium (http://phpsec.org/)

• na secção de projectos:• Security Guide (PDF)• PHPSecInfo: aplicação (Download & install)

Page 11: LabMM4 (T22 - 12/13) - segurança

Execução de ficheiros via Web

Impedir que se possam visualizar/alterar ou executar, via Web, ficheiros potencialmente perigosos

• .htaccess<Files ~ "\.(log|inc|sql|ini)$"> Order allow,deny Deny from all</Files>

<Files ~ "^\.ht"> Order allow,deny Deny from all Satisfy All</Files>

extensões não permitidas

impedir o acesso ao .htaccess

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

Inclusão e upload de ficheiros

Incluir ficheiros sempre através do require/require_once -> qualquer erro termina execução do PHP

No upload de ficheiros a partir de uma formulário:

• testar a extensão do ficheiro carregado: $_FILES[‘ficheiro’][‘type’] ou através da função pathinfo()

• testar o tamanho do ficheiro carregado: $_FILES[‘ficheiro’][‘size’] ou através da função filesize()

• no final usar sempre a função move_uploaded_file(), para colocar o ficheiro na sua pasta destino

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

Filtragem de dados

Muitas das ameaças à segurança podem provir de dados maliciosos introduzidos em formulários, variáveis superglobais ($_GET, $_POST, $_SESSION, $_FILES, etc), queries à BD, etc…

• filtragem lógica -> associada à lógica do algoritmo de processamento dos dados

• filtragem de limpeza -> remoção de todos os caracteres potencialmente perigosos 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 podem

revelar estrutura da BD ou de outros parâmetros da aplicação

Page 14: LabMM4 (T22 - 12/13) - segurança

Filtragem e codificação de dados

Valores 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

Page 15: LabMM4 (T22 - 12/13) - segurança

Filtragem e codificação de dados

Preservar a formatação HTML mas codificar inputs para utilizarem HTML entities

• 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);

Page 16: LabMM4 (T22 - 12/13) - segurança

Filtragem e codificação de dados

get_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, $_COOKIE

recebem o escape automático de certos caracteres: \‘, \”, \\

stripslashes() -> remove as \ de uma string

$string = mysqli->real_escape_string($string)

• faz o escape de ‘, “ e \

Page 17: LabMM4 (T22 - 12/13) - segurança

SQL Injection

A introdução de inputs não filtrados nas queries pode originar falhas de segurança. É inadmissível em páginas de produção!

Page 18: LabMM4 (T22 - 12/13) - segurança

SQL Injection: funções de filtragem

Remover 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 pesquisa

case insensitive

function 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;

}!

Page 19: LabMM4 (T22 - 12/13) - segurança

Outras funções úteis na filtragem/validação

Pesquisa 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

Page 20: LabMM4 (T22 - 12/13) - segurança

Codificação de passwords

Armazenar 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

Page 21: LabMM4 (T22 - 12/13) - segurança

XSS - Cross Site Scripting

Introdução de código (normalmente JS) em áreas de User Generated Content (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