MySQL & Segurança

Por Arthur Gonçalves, Lucas Plácido, Neivison Santos e Rafael Dourado

CONCEITOS E PRÁTICAS DO SISTEMA DE GERENCIAMENTO DE BANCO DE DADOS

Conceitos de banco de dados:
  • O que é um Banco de Dados? 
Um banco de dados é uma coleção de dados inter-relacionados, representando informações sobre um domínio específico, ou seja, sempre que for possível agrupar informações que se relacionam e tratam de um mesmo assunto, posso dizer que tenho um banco de dados.
  • O que é um Modelo Entidade Relacionamento?
O Modelo Entidade Relacionamento (também chamado Modelo ER, ou simplesmente MER), como o nome sugere, é um modelo conceitual utilizado na Engenharia de Software para descrever os objetos (entidades) envolvidos em um domínio de negócios, com suas características (atributos) e como elas se relacionam entre si (relacionamentos).
  • O que é um Modelo de Dados Relacional?
O modelo relacional é um modelo de dados representativo (ou de implementação), adequado a ser o modelo subjacente de um Sistema Gerenciador de Banco de Dados (SGBD), que se baseia no princípio de que todos os dados estão armazenados em tabelas (ou, matematicamente falando, relações).
  • O que é um SGBD?
Um sistema de gerenciamento de banco de dados (SGBD) é um software que possui recursos capazes de manipular as informações do banco de dados e interagir com o usuário. Exemplos de SGBDs são: Oracle, SQL Server, DB2, PostgreSQL, MySQL, o próprio Access ou Paradox, entre outros.


SQL (Structured Query Language ou Linguagem de Consulta Estruturada):
Trata-se de uma linguagem específica para a manipulação de tabelas de dados. A linguagem padrão universal para manipular bancos de dados relacionais através dos SGBDs.

Grupos de Comandos SQL:
Os comandos do SQL são classificados em três grupos, de acordo com suas principais funções. São eles:
  • DML (Data Manipulation Language ou Linguagem de Manipulação de Dados):
É o subconjunto mais utilizado da linguagem SQL, pois é através da DML que operamos sobre os dados dos bancos de dados com instruções de inserção, atualização, exclusão e consulta de informações. Comandos como INSERIR, DELETAR, ATUALIZAR, SELECIONAR E ETC.
  • DDL (Data Definition Language ou Linguagem de Definição de Dados):
É o subconjunto da SQL utilizado para gerenciar a estrutura do banco de dados. Com a DDL podemos criar, alterar e remover objetos (tabelas) no banco de dados.
  • DCL (Data Control Language ou Linguagem de Controle de Dados):
É o subconjunto da SQL utilizado para controlar o acesso aos dados, basicamente com dois comandos que permite ou bloqueia o acesso de usuários a dados;

Características do MySQL:
  • Portabilidade (suporta praticamente qualquer plataforma atual);
  • Compatibilidade (existem drivers ODBC, JDBC e .NET e módulos de interface para diversas linguagens de programação, como Delphi, Java, C/C++, C#, Visual Basic, Python, Perl, PHP, ASP e Ruby);
  • Excelente desempenho e estabilidade;
  • Pouco exigente quanto a recursos de novos hardware;
  • Facilidade no manuseio;
  • É um Software Livre com base na GPL (entretanto, se o programa que acessar o Mysql não for GPL, uma licença comercial deverá ser adquirida);
  • Suporta controle transacional;
  • Interfaces gráficas (MySQL Toolkit) de fácil utilização cedidos pela MySQL Inc.;

SQL x MySQL:
  • Só para constar o MySQL não é uma extensão do SQL.
  • O MySQL é um Sistema de Gerenciamento de Banco de Dados.
  • O SQL é a linguagem para manipulação dos dados no SGBD.
  • Para utilizar as características e o funcionamento do SQL é preciso se servir de um Sistema de Gerenciamento de Bancos de Dados (SGBD), isto é, de um ambiente no qual possamos utilizar os comandos desta linguagem para manipular dados.

Instalar MySQL:
Existem alternativas para conseguir o MySQL em seu computador:
  • Baixar o MySQL no seu site e instala-lo;
  • Instalar pacotes que venham com o MySQL incluso, caso do XAMPP e WAMP;
  • MySQL Workbench;

Comandos Básicos: 
Para criar de um banco de dados o comando é simples:
mysql> CREATE DATABASE meu-banco;

Podemos verificar rapidamente a existência do BD recém-criado, bem como a de todos os outros criados anteriormente, utilizando a instrução SHOW DATABASES (mostrar bancos de dados):
mysql> SHOW DATABASES;

Para excluir um banco de dados, usa-se o comando DROP DATABASE, seguido do nome do banco de dados que deseja deletar:
mysql> DROP DATABASE meu-banco;

É possível selecionar valores da tabela, utilizando o comando SELECT do SQL. O comando SELECT é, basicamente, a ferramenta principal para consultar informações de um banco de dados, por isso, é comumente chamado de query:
mysql> SELECT dados_desejados FROM nome_tabela;

O comando de INSERIR é um dos mais utilizados. Para inserir valores em uma determinada tabela, basta seguir a regra:
mysql> INSERT nome_da_tabela VALUES (‘valor1’, ‘valor2’, ...);


Técnica de Tuning:
O processo de tuning é algo que só deve ser realizado quando houver uma real necessidade, pois envolve uma grande quantidade de processos tanto do SGBD como do sistema operacional.
A técnica de tuning de desempenho é uma prática feita em todos os SGBDs importantes com técnicas diferentes. É uma necessidade de toda grande empresa, e requer um grande nível de conhecimento e experiência sobre os processos e suas técnicas, pois nem sempre o problema será resolvido com uma ou duas alterações, às vezes é necessário uma mudança nas queries.


SEGURANÇA

Por que se preocupar com segurança no Banco de Dados?
Atualmente, o maior bem que uma empresa possui é a informação. E, quando se trata de manter a confiabilidade dos próprios dados, são muitos os desafios enfrentados — sendo a segurança em banco de dados um dos maiores deles.

Só acesse cookies de sessão via HTTP:
Para mudar a configuração, vá até o arquivo php.ini do PHP, procure pelo atributo session.cookie_httponly e defina seu valor como 1.
Embora os ids de sessão sejam armazenados em cookies por padrão no PHP, o atributo session.cookie_httponly não vem como padrão. Ativando-o você garante que os cookies de sessão só poderão sre acessados via HTTP, impedindo que scripts JavaScript, por exemplo, sejam barrados ao tentar fazer o mesmo. Essa á uma ótima dica para evitar principalmente ataques XSS.


Atribua um limite de tempo de vida para as sessões:
Mesmo que um cracker consiga acessar o seu sistema roubando uma sessão, ele terá pouquíssimo tempo para agir se você limitar o tempo de vida das sessões.


Valide a origem da sessão em todas as páginas:
Garanta que o usuário que se autenticou no sistema é o mesmo que está acessando a página atual validando o User Agent e o IP do dono da sessão em todas as páginas.

 

Nunca esqueça de validar dados externos:
Jamais se esqueça de validar os dados que chegam à sua aplicação via comandos GET, POST, COOKIE ou SERVER, pois todos eles podem ser manipulados e merecem ser verificados. Essa prática é especialmente importante para evitar ataques do tipo XSS e SQL Injection.
Para esta tarefa, pode-se usar as validações que vêm nativamente no PHP. Veja alguns exemplos abaixo:


 

Utilização do PDO:
Antes:
<?php
$sql = 'INSERT INTO usuarios (nome, senha, email) VALUES ('.$nome.', '.$senha.', '.$email.');';
$dbh->exec($sql);


Depois:
<?php
$sql = 'INSERT INTO usuarios (nome, senha, email) VALUES (:nome, :senha, :email);';
$sth = $dbh->prepare($sql);
<?php
$sth->bindValue(':nome', $nome);
$sth->bindValue(':senha', $senha);
$sth->bindValue(':email', $email);
$sth->execute();


Valide os arquivos enviados ao servidor:
É cada vez mais raro encontrarmos sistemas que não oferecem a possibilidade de enviarmos algum arquivo para armazená-lo no servidor. Se o seu utiliza esse recurso, então nunca esqueça de validar os uploads antes de salvar os arquivos no servidor. Dessa forma você evita que arquivos maliciosos sejam armazenados e causem algum dano ao seu servidor e sistema.
Vale ressaltar, no entanto, que validar apenas a extensão do arquivo já não é mais suficiente, pois ela pode ser manipulada no momento do envio. Para uma solução completa, é preciso verificar o cabeçalho do arquivo. No caso de imagens, uma boa alternativa é a seguinte:


 

Impeça que suas pastas sejam acessadas via HTTP:
No PHP, inúmeras configurações ficam armazenadas em arquivos com extensões ini, XML, JSON, txt e outras. O pior de tudo é que o conteúdo desses arquivos é visível quando acessados pelo navegador, o que acaba sendo um problema se ali contiver informações confidenciais.
Para evitar esse problema, a melhor alternativa é proteger as pastas que contêm esses arquivos contra acessos externos. Para isso, basta colocar esses arquivos fora da pasta public_html ou adicionar um arquivo .htaccess com as seguintes configurações nas pastas que se deseja proteger:


 

Mantenha o controle dos erros do sistema seguro:
Não adianta: por mais que você previna que erros ocorram na sua aplicação, aqui e ali eles aparecerão. O problema é que, se não forem bem tratadas, essas falhas podem acabar exibindo dados sobre sua aplicação.
Para evitar isso, defina um arquivo de log para registrar esses erros. Caso haja necessidade de acompanhar esse arquivo de log em tempo real, uma boa opção é acessar o servidor via SSH e usar o comando tail -f pathlog/logfile.
Também há uma configuração que pode ser feita no php.ini para evitar que tudo seja exibido na cara do usuário. Acesse-o e modifique as seguintes linhas para armazenar tudo num arquivo predeterminado:

//php.ini
error_reporting = E_ALL & ~E_NOTICE
display_errors=On
log_error=On
error_log=my_file.log


Jamais armazene senhas em texto puro:
 
Chega um momento do desenvolvimento que o cansaço começa a tomar conta de nós e acabamos abrindo mão de alguns recursos de segurança para adiantar os testes do projeto. Contudo, isso não pode acontecer quando o assunto é as senhas de acesso ao sistema. Elas jamais devem ser armazenadas sem antes serem criptografadas. Adotando essa técnica, você protege não só os seus usuários, mas também o banco de dados de uma eventual invasão.

Cuidado com servidores compartilhados:
Os servidores compartilhados são vistos por uma boa parcela dos desenvolvedores como uma ótima opção de hospedagem principalmente por causa dos preços baixos, que acabam os tornando atraentes. Contudo, o que os iniciantes não sabem é que essa solução também traz consigo algumas preocupações extras com segurança.
Há alguns anos, o PHP tentou resolver parte desses problemas com a diretiva safe_mode, mas chegou-se à conclusão que essa preocupação não era de responsabilidade da equipe de desenvolvimento da tecnologia. Por esse motivo, essa diretiva passará a não existir mais a partir do PHP 6.
Mesmo assim, ainda há três diretivas do php.ini que continuam a desempenhar um importante papel na configuração de hospedagens compartilhadas. São elas:

  • open_basedir: Com ela, é possível imitar os diretórios que o PHP pode abrir com o fopen ou include.
  • disable_functions e disable_classes: essas duas diretivas funcionam de forma semelhante e permitem que você desabilite certas funções nativas do PHP e classes por razões de segurança.
//php.ini
open_basedir = "/home/user/www/:/usr/local/lib/php/";
;foram adicionados dois caminhos separados por “:”

//php.ini
;desabilitando as funções
disable_functions = exec,passthru,shell_exec,system
;desabilitando as classes
disable_classes = DirectoryIterator,Directory


Fique de olho nos erros de senha:
Há quem monitore toda tentativa de acesso ao sistema, quer seja ela bem sucedida ou não. Uma vez com esse controle implantado, é sempre bom ficar de olho e bloquear o IP de origem ou adicionar um Captcha como validação adicional em caso de mais de três tentativas de senha incorreta. Dessa forma você mina as possibilidades de ataques de força bruta.

Tenha cuidado com as permissões em pastas:
Sempre tenha um pé atrás e restrinja o acesso às pastas do servidor. Adicione regras de execução e escrita somente em pastas apropriadas.

Fique sempre de olho no seu sistema:
Utilize programas de identificação de vulnerabilidades. Além de identificar os pontos fracos da sua aplicação, esses sistemas oferecem informações sobre elas e ainda podem lhe orientar sobre como resolvê-las.

Tenha um plano em caso de comprometimento do sistema:
Sempre somos levados a pensar que o pior não acontecerá conosco. Contudo, como o seguro morreu de velho, é sempre bom ter um plano de ação para o caso de você descobrir que seu sistema foi comprometido.
Uma boa dica é desabilitar as contas para que uma investigação seja conduzida a fim de descobrir a falha explorada pelos crackers. Depois disso, defina uma estratégia de reativação das contas utilizando e-mails.



Referências:

Comentários

Postagens mais visitadas deste blog

Tutorial Inicial em Angular 1x

HTML + CSS + BOOTSTRAP