Desenvolvimento Web Desenvolvendo uma loja virtual - Parte 1

1 Comment

Como meu negócio é banco crei esse artigo para explicar todas as funções que podemos usar em banco de dados Mysql para uma loja virtual.

Primeiro vamos levantar o que precisamos para uma loja virtual:

  1. Sistema de cadastro e alteração de produtos ( como um CMS )
    - Gerenciamento de usuários do sistema
    - Departamentos / Sub-departamentos
    - Marcas
    - Produtos
    - Gerenciamento de usuarios da loja
    - Acompanhamento de pedidos
    - Relatórios
  2. O Front-End da loja.
    - Cadastro de usuarios
    - Listagem de produtos
    - Cesta de produtos
    - Pedido / Venda

Para uma loja simples acho que isso basta. Agora vamos à criação do banco. Pra isso vamos usar o Mysql WorkBench

Crie um layer, vamos chamalo- de “ADMIN” , vamos colocar aqui as tabelas exclusivas do gestor.

Agora Insira uma nova tabela no layer, vamos chama-la de “tb_usuario”, collation latin1, innodb.
Insira os campos: usr_id, usr_nome,usr_email e usr_status conforme a imagem abaixo.

Vamos criar também uma tabela para o armazenamento das senhas. tb_senha, latin1, innodb, com os campos
snh_id e snh_senha, clique na ferramenta de relacionamento 1:n  e clique na tabela de senha e depois na tabela de usuarios. sua modelagem deve ficar como a minha:

tabela de usuarios e senhas

tabela de usuarios e senhas

 Proximo passo? Criar o índice único da tabela de senhas e o insert padrao. Em breve na Parte 2 desse artigo.

[]`s

Tags: , ,

Desenvolvimento Web, Gerencia de projetos, Segurança Boas práticas de segurança

0 Comments

Algumas dessas medidas eu uso em projetos pessoais, outras eu gostaria de implantar mas não tenho essa responsabilidade no trabalho, fica aí para quem pode:

1 - Criação de processo para contato com o cliente (Usuário da aplicação).
            De nada adianta voce se matar pra fazer uma rotina de segurança, se algum cliente, usuário da aplicação ou suporte da sua empresa informar a senha para um desconhecido por telefone e como resolver?
           Eu sugiro implantar um sistema de senha verbal, uma fica com o cliente e uma com o suporte em sua empresa, as informações apenas são repassadas caso as 2 sejam verdadeiras.           

2 - Ainda sobre processo interno, acho uma boa iniciativa a retirada de hardware de armazenamento das maquinas dos funcionarios, USB, cd-r, dvd-r, bluetooth entre outros, também o bloqueio de envio de arquivos via Comunicadores Intantaneos, e acesso a webmail, porque?
Por que eu imagino que voce trabalha em rede, e diretamente com dados de clientes, fontes de software etc … se algum funcionário insatisfeito ou mal-intecionado desejar repassar essas informações, voce pelo menos garante que os processos para dificultar foram feitos.

Agora sobre senhas, e controle de usuarios.

3 - Não permitir que usuários possam logar com o mesmo login e senha.

4 - Criar uma política de troca de senhas, eu aconselho a armazenar essas informações em uma tabela com a chave em um indice único. não permitindo que o usuário reutilize uma senha.

5 - Contra-senha, o usuário se loga e tem que informar uma segunda senha. voce pode mandar por e-mail, pode ser um link, pode ser uma outra senha, pode ser uma senha gerada pela empresa diariamente e comum.

6 - Cadastro de e-mail de usuário com validação de domínio, assim um invasor não poderá alterar um e-mail na base e pedir para recuperar senha.

7 - Rotina de checagem de força de senha. pode-se usar o john the ripper ;-)

8 - O mais básico, nunca armazene uma senha sem criptografia.

Depois escrevo mais.

Internet, Segurança, mysql Protegendo informações de erro humano na internet

0 Comments

Pensei em escrever esse artigo depois da notícia de que uma loja virtual mostrou o valor errado em um laptop, “Mac book por 9,90″, cagada imensa, porém há varias maneiras de prevenir esse tipo de falha.

Escolhi a que mais me agrada, que usa é Claro VIEWS ;-)

A primeira coisa a fazer é criar um campo chamado “valor mínimo do produto” na tabela de produto ou valor_produto, isso é claro se o  seu sistema não faz calculo de custo de produto.
Com essa informação voce cria uma trigger para garantir o valor do produto.

ANTES de INSERIR / ALTERAR se o Valor do produto for menor que o Valor Mínimo, voce dispara uma exceção.

A segunda coisa é gerar a VIEW.
Tendo o produto ja o valor mínimo cadastrado voce vai selecionar os produtos normalmente, porem numa com uma clausula where VALOR_MINIMO < VALOR_DO_PRODUTO.

Assim não haverá na loja um produto com valor Inválido. Nem Cadastrado com esse valor.
Sem depender de programação. O programador geralmente tem mil coisas pra pensar e nem lembrará que pode fazer a validação em banco.

[]`s

Tags: , ,

Banco de dados, mysql Porque usar latin e não utf8

0 Comments

Muita gente cria tabelas em utf8 com medo de problemas de encode, porém esquecem que as pesquisas em utf8 tratam uma palavra acentuada diferente da mesma palavra sem a acentuação ex. (Palavrão != Palavrao)

Vamos ao Exemplo:

Vamos criar uma tabela em utf8:

CREATE TABLE tb_utf (
  campo VARCHAR(255)
)
ENGINE = MyISAM
CHARACTER SET utf8 COLLATE utf8_general_ci;

Agora insira o registro:

INSERT INTO tb_utf values (’Palavrão com acentuação’);

Tente encontrar palavrao, sem acentuação:
SELECT * FROM tb_utf where campo = ‘%palavrao%’;
Nenhum retorno certo?

Agora tente com a acentuação:
SELECT * FROM tb_utf where campo = ‘%palavrão%’;

 Vamos fazer o teste em latin1:

CREATE TABLE tb_latin (
  campo VARCHAR(255)
)
ENGINE = MyISAM
CHARACTER SET latin1 COLLATE latin1_swedish_ci;

Insira o mesmo resgitro:

 INSERT INTO tb_latin values (’Palavrão com acentuação’);

Agora faça a mesma query que foi feita para a tabela utf8:

SELECT * FROM tb_latin where campo = ‘%palavrao%’;
1 registro

SELECT * FROM tb_latin where campo = ‘%palavrão%’;
1 registro

Vale lembrar que isso também influencia em indices FULL-TEXT, na verdade nem funciona com UTF8 se não me engano.

[]`s

Tags: , , ,

Grande Sacada, mysql Migrando dados MS Sql server para o Mysql

1 Comment

Essa semana tive a tarefa de migrar algumas tabelas para um banco pré-existente em Mysql.
De cara instalei o SqlServer 2005 Express e verifiquei o idioma, a estrutura das tabelas, as views e stored procedures.

Sem documentação e com uma nomenclatura pouco intuitiva, falei: 

- fodeu!! (Com “o” mesmo, estou em curitiba).

Mas da nada, lembrei de um cara bacana pro Mysql que poderia me ajudar Toad DataModeler da Quest Software.
Em poucos Passos baixei a versão para Sqlserver. Não vou entrar em detalhes sobre a instalação e uso do Toad, porque é muito intuitivo, você instala, coloca dados de conexão com o sql server e boa faz o que você precisa que é?

Engenharia reversa do banco … mas não é como o Mysql workbench que deixa as coisas meio emaranhadas, ele deixa pronto em uma visão que você de cara entende o que acontece no banco. faça o teste em outro post eu detalho o funcionamento do toad.

Voltando ao assunto, agora que eu ja achei as tabelas e seus relacionamentos, ta na hora de migrar as tabelas:

Com o Mysql Migration toolkit que faz parte do pacote Mysql gui Tools, a coisa fica mais fácil e intuitiva,
Você escolhe o database Origem (source), que no meu caso é o sqlserver, mas poderia ser MS Access, MS SqlServer, Oracle, Sybase ou uma conexão JDBC. Seleciona o destino, apenas a conexão com o banco, ele vai criar o mesmo banco no destino, ou não, voce pode setar para que ele grave o Create Script e o Insert script em arquivo, editar e executar onde bem desejar. Simples né? pra caraio. Porém eu tive problemas com encode … e quem não tem?.

Saí a procura de outro software, eis que vejo o bom e velho EMS que eu conhecia para Mysql, baixeia versão do EMS sqlManager for Sqlserver do site do fabricante. Bom ele não exportava direto no meu banco Mysql, solução?
Exportei em XML e fiz um scriptzinho que sincroniza esses dados com meu banco. coisa de louco.

Mas eu dei essa volta porque meu banco destino fica em outro servidor e eu tinha acesso limitado ao servidor, num mundo perfeito, o Mysql Migration Toolkit ja teria resolvido o problema em 2 toques.

Mas fica a dica, se você esta dando a mesma volta …

Tags: , , , , ,

Banco de dados, Gerencia de projetos, Produtividade Vantagens de um DBA

0 Comments

Esse é um artigo que escrevi para a empresa em que trabalho, expondo as vantagens do trabalho de um DBA no processo de desenvolvimento, e na melhora na produtividade da equipe de programação.

Segurança

Da forma que funciona hoje, cada cliente tem um login e senha para acessar seu banco de dados, mas os programadores ou qualquer um que abra os fontes têm acesso a senha e consequentemente acesso à base de dados do cliente, podendo assim copiar, ou alterar dados importantes, alem de cometer erros que comprometem o desenvolvimento, como apagar uma tabela..

Com um DBA, cada projeto terá uma senha para o banco, porém apenas a permissão de executar sp’s, nessas já haverá uma limitação de registros por consulta, utilizando o mysql-proxy, ferramenta da mysql, já citada no email interno da empresa, que ao fazer consultas de dados confidencias esses retornam apenas ” *** “, como outras funcionalidades.

Logs configuráveis do mysql também farão sua parte.

Otimização de tempo no desenvolvimento.

Trabalhando com normas de padronização e conhecimento do banco utilizado, a produção dos programadores será muito maior.

O trabalho começa na analise, atuando em conjunto com os gerentes de projeto, uma vez feita a analise, passa-se a UML e modelagem do banco de dados, Dicionário de dados, criação do banco, criação de SPs e documentação dessas.

Quando o processo chegar aos programadores, o banco de dados e as rotinas de listagem, inclusão, edição e deleção de registros de todas as tabelas já estará pronto, bastando ao programador ler as documentações.

No caso de um banco de dados com mais recursos, (Oracle/Postgres), alem das sp’s, funções de tratamento de informação, antes utilizadas na programação, também já estarão no banco, bastando ao programador passar apenas parâmetros as funções.

Com o tempo, a padronização estará tão clara ao programador que pouco se necessitará da documentação.

Outra vantagem de restringir o acesso ao banco de dados, é passar a utilizar ao máximo os recursos que o banco oferece, aumentado o desempenho e diminuindo a incidência de erros que causam sobrecarga no banco.

Ex.

(Loops infinitos, consultas “select * from”, por exemplo) que também são tratadas pelo mysql-Proxy.

Otimização de tempo em manutenção.

Acontece muito de um programador que não trabalhou em determinado projeto ter que fazer a manutenção. O problema é que sem uma padronização, ele fica perdido, e demora muito a entender o processo, acaba criando tabelas desnecessárias, ou criando uma tabela que já existe, mas ele não conseguiu perceber pela falta de padronização.

Com a padronização se já não estiver clara ao programador, basta ler a documentação.

Resumo da Otimização

Cada vez mais o programador deixa de ter que se especializar em bancos de dados ele conhecendo o básico para usar as SP’s é o suficiente, não precisa se envolver com regras e particularidades de cada banco, o que acaba restringindo ainda mais a quantidade de profissionais no mercado, você passa a exigir somente que o programador seja especialista nas linguagens de programação, deixando toda a parte de bancos de dados para o administrador de banco de dados, DBA.

Redução de Custos

O resultado dessa mudança no processo de desenvolvimento, somando o aumento de produtividade, o programador voltado apenas para o que lhe compete e o padrão de desenvolvimento adotado no ultimo projeto da empresa, É a velocidade de desenvolvimento, diminuição de tempo para finalizar os projetos, e o melhor aproveitamento dos recursos existentes, dispensando a contratação de novos, podendo a empresa investir na melhor especialização dos programadores.

Valor Agregado

Com um DBA na empresa, agregamos valor a nossos produtos, garantindo os prazos de entrega de projeto, documentação, e segurança dos dados do cliente.

Responsabilidade do DBA

O DBA pode ser visto como o responsável pela organização,

segurança, manutenção e projetos de banco de dados. Ele deve participar da

elaboração do projeto lógico juntamente com os analistas de projetos, executa o projeto físico do banco de dados e coordena as atividades operacionais de manutenção dos mecanismos de segurança lógica e física dos bancos de dados, além de definir as políticas de segurança e planos de contingências.

Documentação do DBA:

1 ) MER (Modelo Entidade Relacionamento)

O MER (Modelo Entidade Relacionamento), também conhecido apenas como modelo de dados ou diagrama de entidade-relacionamento, é a principal documentação de um banco de dados. Neste diagrama são relacionadas as entidades (tabelas) e seus relacionamentos, além de alguns detalhes a respeito das entidades, como nome das colunas nas tabelas, tipos de dados e constraints.

2 ) Padrões de Variáveis (Tabelas, colunas etc) e Documentação

Uma das boas práticas de desenvolvimento é contar com padrões. Saber colocar nomes significativos e explicativos em funções, variáveis, classes etc, está se tornando cada vez mais um pré-requisito para quem trabalha com desenvolvimento. No que tange à banco de dados, a idéia não é diferente: possuir um padrão de nomes para tabelas, colunas, constraints e objetos de bancos de dados é muito importante. Aqui a idéia não é apenas possuir um padrão e utilizá-lo largamente, mas possuir um padrão eficaz que seja fácil de ser utilizado, além de fazer sentido no contexto de banco de dados.

3 ) Capacity Plan

A necessidade de prever recursos de hardware é uma das grandes responsabilidades de um DBA. Além de economizar recursos, a previsão mostra que há um controle não apenas para os recursos que estão sendo utilizados, mas também para os recursos que podem ser necessários no futuro.

4 ) Dicionário de dados

O Dicionário de dados é um documento que complementa o MER. Este documento deve conter mais detalhes a respeito das tabelas e seus relacionamentos. Por exemplo, além de listar todas as colunas de uma tabela, o documento deve fornecer também uma pequena descrição do significado desta coluna, quais são os valores possíveis, a quantidade típica de valores armazenados e quais constraints agem sobre esta coluna. Além das informações sobre colunas, este documento apresenta o nome dos objetos que dependem da tabela, como stored procedures, triggers, views, funções etc, e suas respectivas funções, além dos parâmetros necessários e o que é retornado.

5 ) Política de segurança

O documento contento a política de segurança é um documento não-técnico que envolve os procedimentos, responsabilidades e atribuições relacionadas tanto à segurança das informações como do acesso à elas. Geralmente este documento contém uma política de usuários e senhas, que especificam várias regras, como as definidas abaixo:

* Troca de senha a cada três meses;

* Desabilitar as contas padrão;

* Forçar senhas com letras, números e caracteres especiais que tenham um tamanho mínimo de 10 posições;

Outras políticas gerais de senha, como o cancelamento após um algumas tentativas e horários definidos para certos usuários, também deve constar neste documento, sempre tendo em mente a utilização de sistemas e bancos de dados.

6 ) N.D.A (non-disclosure agreement) – Compromisso de sigilo

Imaginem a seguinte situação:

Somos responsáveis por uma base de dados que deve ser integrada com um sistema externo à empresa. Para discutir os detalhes desta integração, uma reunião é marcada com a equipe externa à empresa que desenvolve o sistema. Durante esta reunião são apresentadas informações sigilosas da empresa que trabalhamos, com o objetivo de discutir os aspectos da integração.

Vamos supor que na situação apresentada acima os profissionais da equipe externa hajam da má fé e utilizem as informações fornecidas para seu próprio benefício, seja comercialmente ou não. Este tipo de situação pode gerar diversos problemas, podendo chegar ao ponto onde a equipe que agiu de má fé ser acusada de roubo.

Para e proteger de situações como estas, é comum fazer uso de um documento chamado NDA (non-disclousure agreement), também conhecido como compromisso de sigilo. Este é o tipo de documento que protege todo mundo: tanto quem assina como quem solicita a assinatura. Em termos práticos, que assina compromete-se a não revelar nenhum detalhe da informação que lhe vai ser comunicada sob pena de ser alvo de procedimento legal.

7 ) S.L.A. (Service Level Agreement) – Acordo de nível de serviço (ANS)

O SLA, também conhecido como Acordo de nível de serviço – ANS é um acordo entre a área prestadora de serviços e seus clientes. Este acordo deve deixar claro quais serviços estão sendo oferecidos (serviços específicos) e o nível de cada serviço (horas de funcionamento, downtime, horário do suporte etc). Geralmente este acordo é colocado na forma de um contrato que deve ser assinado na contratação do serviço. Para banco de dados, em particular, pode-se utilizar um SLA interno, onde o DBA se compromete a dar algum tipo de retorno (feedback) ao solicitante.

8 ) Diagrama de arquitetura

Atualmente é comum encontrar nas empresas, diversos ambientes de bancos de dados. Estes ambientes são separados de acordo com a sua finalidade, isto é, seu principal objetivo. Por exemplo, é comum encontrar ambientes de desenvolvimento, onde os programadores/analistas executam diversos testes durante o processo de desenvolvimento, e ambientes de programação, onde os usuários finais trabalham com os dados reais dos sistemas.

Para documentar e organizar o gerenciamento destes ambientes, o DBA deve elaborar um diagrama de arquitetura, que indica, de forma gráfica, quais servidores pertencem ao ambiente de desenvolvimento e ao ambiente de produção, como eles estão localizados em relação aos usuários com informações sobre link, rede, zonas desmilitarizadas (DMZ), firewalls, roteadores, etc. Este tipo de diagrama contém informações relacionadas à estrutura arquitetural dos ambientes e é extremamente útil para quem não conhece a organização física e lógica dos componentes da rede e dos servidores. É importante lembrar que este documento pode ser flexível, ou seja, pode incluir detalhes específicos, como endereços I.P. e senhas, ou apresentar uma visão de alto nível, onde apenas os principais servidores são apresentados.

9 ) Estratégia de Backup

Todo DBA profissional deve possuir uma estratégia de backup adequada. Esta estratégia deve ser montada de acordo com as necessidades de recuperação e disponibilidade do sistema, ou seja, toda a estratégia de backup vai depender do quanto de downtime e tempo de recuperação é aceitável.

É importante documentar a estratégia de backup utilizada, tanto para oficializar este tipo de tarefa como para conscientizar os usuários a respeito do que pode ser recuperado, quando, sob quais condições e a qualidade do que foi recuperado. Geralmente este documento contém todos os bancos de dados envolvidos na estratégia, como o backup será realizado, qual a periodicidade, qual é o procedimento para recuperação, quem são os responsáveis e os recursos envolvidos. Por fim, é importante atualizar este documento conforme as necessidades de disponibilidade e recuperação mudam de acordo com o volume de informações manipuladas pelos sistemas.

Conclusão

A nossa empresa precisa de um DBA, já alcançou um volume de desenvolvimento onde o a padronização tanto da programação quanto dos bancos de dados é fundamental para a produtividade.

Os grandes clientes que já temos e os que estão por vir também necessitam de cuidados com a segurança de seus dados, padronização e documentação.

“Cada macaco no seu galho”, assim desafogamos um pouco o Adm de redes que volta e meia tem que criar um banco, uma tabela, definir permissões, tirar relatórios etc. Os programadores precisam se preocupar com a programação ou a integração html – php, não com o banco, até porque o conhecimento da maioria é básico, o que gera mais consultas pesadas exigindo mais do servidor de banco de dados, gera tabelas sem padrão, campos sem padrão, e entidades sem relacionamento.

Com um banco bem modelado, tabelas bem relacionadas e sp’s que fazem o trabalho antes feito pelos programadores, sobra mais tempo para os programadores utilizarem refinando a programação. Sobrando mais tempo a cada projeto, a empresa não precisa contratar mais recursos, que, gera custos, e tempo para o aprendizado da metodologia de trabalho, consequentemente atraso nos projetos.

Fontes: Google, Mauro Pichiliani e Cristian Pedroso.

Tags: ,

Banco de dados, mysql Comparar o som das palavras

0 Comments

Um recurso muito interessante do mysql é o soundex, ele  retorna uma string com o fonema da palavra

Faça o teste:

-> SELECT SOUNDEX(’thing’) ,SOUNDEX(’think’) ;

->T520,T520;

Tags: ,

Banco de dados, mysql Recuperar senha de root em 4 passos

0 Comments

Perdeu a senha de root do banco? Não se desespere, tendo acesso ao servidor é facil de recuperar, esse exemplo é baseado num servidor LINUX.

1 – Pare o servidor, mate o processo:
-> kill mysqld_safe
-> kill mysqld

2 – Inicie o servidor sem as tabelas de privilégio:
-> mysqld_safe –skip-grant-tables

3 – Modifique a senha de root:
mysql> SET PASSWORD FOR root@localhost=PASSWORD(’nova_senha’);

4 – Inicie as tabelas de privilegio:
mysql> FLUSH PRIVILEGES;

Tags: , ,

Banco de dados, mysql Expressões regulares, validando um e-mail

0 Comments

Para falar de Expressões regulares, decidi usar o assunto e-mails, acho que todo desenvolvedor ja precisou validar um e-mail.
Agora vamos validar na consulta listando apenas os e-mails válidos:

mysql> SELECT eml_email FROM tb_email WHERE  eml_email REGEXP ‘^[a-zA-Z0-9]{1}([\._a-zA-Z0-9-]+)(\.[_a-zA-Z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+){1,3}$’

Agora listando os e-mails Inválidos:

mysql> SELECT eml_email FROM tb_email WHERE  eml_email NOT REGEXP ‘^[a-zA-Z0-9]{1}([\._a-zA-Z0-9-]+)(\.[_a-zA-Z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+){1,3}$’

*expressões de exemplo não utilize em produção.

Tags: ,

Banco de dados, mysql Backup no mysql - mysqdump

0 Comments

O mysqldump converte a estrutura e os dados de uma tabela em comando sql. voce pode fazer o dump de uma tabela, do banco todo, ou de todos os bancos do servidor.

shell-> mysqldump database > scriptdesaida.sql

Veja algumas opções do mysql dump:

–add-drop-database -  Adiciona ‘DROP DATABASE’ antes de criar o banco.
–add-drop-table – Adiciona  ‘drop table’ antes de criar a tabela.
-i, –comments – Insere comentarios adicionais ao script
-f, –force Força o mysqldump a continuar mesmo havendo erros.
-h, –host=name para fazer um dump remoto aqui vai o ip do servidor.
-p, –password[=name], senha do usuarioque vc esta usando
-u, –user=name nome do usuario.
-X, –xml gera um dump em xml.
-R, becapeia as Stored Procedures.

Tags: , , ,