segunda-feira, 22 de setembro de 2008

Envio de e-mail com CakePHP

Oi pessoal. Hoje apresentarei a vocês como utilizar o componente nativo do CakePHP para envio de e-mails. No caso deste artigo, para um formulário de contato.

Lembrando que este é um componente nativo do CakePHP 1.2.

Inicialmente, vamos criar nosso formulário com ajuda do helper Form do CakePHP.



// app/views/contacts/index.ctp


create(´Contact´, array(´url´ => ´/contacts´)); ?>
input(´primeiroNome´);
echo $form->input(´sobreNome´);
echo $form->input(´email´);
echo $form->input(´msg´, array(´type´ => ´textarea´));
?>
end(__(´submit´, true)); ?>


Acima, temos um formulário de contato básico. Crie uma pasta de nome contacts dentro da pasta app/view

Ex. (/app/view/contacts) e salve este arquivo como index.ctp.

Agora vamos criar nosso modelo:


// app/models/contact.php

Nosso modelo será bem simples, sem validação. Mas isto não impede de vocês inserirem validações nos campos, utiliizando componentes de segurança, etc.

Esta variável $useTable que usei acima, é para falar ao CakePHP que este modelo não trabalhará com nenhuma tabela, por isto o valor está especificado como false.

Vamos agora ao nosso controller:

// app/controllers/contacts_controller.php
data))
{
$name = $this->data[´Contact´][´primeiroNome´] . ´ ´ . $this->data[´Contact´][´sobreNome´];
$from = $this->data[´Contact´][´email´];
$subject = ´Contato do Site´;
$msg = $this->data[´Contact´][´msg´];

$this->Email->sendAs = ´both´; // html, text, both
$this->set(´conteudo´, $msg); // especifica variavel da mensagem para o template
$this->Email->layout = ´contact´; // views/elements/email/html/contact.ctp
$this->Email->template = ´contact´;

// set view variables as normal
$this->set(´from´, $name);
$this->set(´msg´, $msg);

$this->Email->to = ´ seuemail@seusite.com.brEste e-mail está sendo protegido dos spam bots, você precisa ter o JavaScript habilitado para vê-lo ´;
$this->Email->subject = $subject;
$this->Email->replyTo = ´ naoresponda@seusite.com.brEste e-mail está sendo protegido dos spam bots, você precisa ter o JavaScript habilitado para vê-lo ´;
$this->Email->from = $name . ´<´ . $from .´>´;

if ( $this->Email->send($msg) ) {
$this->Session->setFlash(´E-mail enviado´);
} else {
$this->Session->setFlash(´E-mail nao enviado´);
}
$this->redirect(´/´);
}
}

}

Seguem agora algumas explicações sobre nosso controle:

$this->Email->sendAs = ´both´;

Esta parte serve para configurarmos como será enviado o e-mail. Se terá formato html, texto ou ambos(both)

$this->Email->layout = ´contact´;

Nesta parte informamos ao componente Email qual será o layout utilizado neste envio.

Lembrando que o layout deverá ser salvo dentro da pasta

/app/view/elements/email/html/contact.ctp e /app/view/elements/email/text/contact.ctp

respectivamente, para os layouts dos e-mails texto ou html.

Bom, espero que este artigo ajude vocês a inserir em seus sites/projetos os formulários de contato, sem que haja a necessidade de utilizar algum script externo (phpMailer, SwiftMailer, etc), para um simples formulário de contato.


?>

?>

sexta-feira, 19 de setembro de 2008

Validação de CPF e CNPJ Online

Validando um CPF / CNPJ Online via WebService e AJAX

Este artigo tem como finalidade mostrar como consumir um webservice em ASP.NET AJAX para fazer uma validação Online na base de dados do SERASA e receber a informação Nome/Razao Social do documento consultado.

Pré-Requisitos:

Visual Studio 2005

Conhecimentos de ASP.NET

Conta para consulta no www.consultacpf.com (Gratuita para abertura, porém necessita créditos para consultas reais)

Dúvidas:

Encaminhar suas dúvidas para webmaster@consultacpf.com.

O Código fonte deste artigo está disponível aqui
Passo a Passo:

Assumindo que você já possui um projeto criado no Visual Studio, crie um Webform em seu Visual Studio com nome de consultacpf.aspx

Criando campos para consulta e resultados:

1. Criar um Label para Numero do Documento

2. Criar um TextBox fldDocumento para receber o numero do Documento

3. Criar um Botão para executar a consulta

4. Criar um Label fldNomepara receber a resposta do WebService

5. Criar um Label fldDatapara receber a resposta do WebService
Adicionando o WebService no seu projeto

No Menu Website do VS2005 utilizar a opção Add Web Reference...

Endereço para adicionar o webservice: http://www.consultacpf.com/webservices/consultacpf.asmx

Após inserir a Web Reference, você deverá ver a referência no painel ao lado.

Código para Invocar o WebService

Código para ser usado no evento do botão:

Imports com.consultacpf.www
Partial Class _Default
Inherits System.Web.UI.Page

Protected Sub Consultar(ByVal sender As Object, ByVal e As System.EventArgs)
' Declara as instâncias
Dim oWS As New ConsultaCPFWebService
Dim oResultado As New SinteseCadastral
Dim Email As String = ConfigurationManager.AppSettings("Email")
Dim Senha As String = ConfigurationManager.AppSettings("Senha")


' Invoca o WebService passando os parâmetros
'e recebe a resposta no Object oResultado
oResultado = oWS.ConsultaSinteseCadastralSERASA(Email, Senha, Me.Documento.Text)

' Move os dados do Object oResultado para os Campos da tela
Me.fldNome.Text = oResultado.Nome
Me.fldData.Text = oResultado.DataNasc

' Tudo ok!

End Sub
End Class
Visualizando em seu navegador

Não esquecer de atualizar o web.config com suas credenciais!

Buscar CEP online com XAJAX

Olá amigos. Gostaria de compartilhar com todos um assunto procurado por muitos e poucas vezes solucionado de uma forma eficiente. Como buscar ceps online, de forma fácil, com XAJAX.

O que você precisa?

  • Conhecimentos básicos em PHP;
  • Conhecimentos básicos na utilização do XAJAX;
  • Um web service online de ceps: www.buscarcep.com.br.

Com um web service conhecido, basta saber como enviar o cep, e receber o retorno dos dados do mesmo. No nosso caso, utilizaremos o www.buscarcep.com.br onde podemos buscar o cep de duas formas:

  • Query string;
  • ou XML.

Neste primeiro momento iremos tratar a forma mais simples, por retorno de uma string, que será tratada por funções do PHP e então adicionado aos campos via XAJAX, sem que seja necessário recarregar nossa página. Vamos ao 1º arquivo:


// Função que busca o cep e retorna array
function busca_cep($cep){
$resultado = file_get_contents('http://www.buscarcep.com.br/?cep='.urlencode($cep).'&formato=string');
if(!$resultado){
$resultado = "&resultado=0&resultado_txt=erro+ao+buscar+cep";
echo "";
}
parse_str($resultado, $retorno);
return $retorno;
}

?>

Esta função acima faz algo bem simples. Ela recebe o parâmetro $cep e com ele faz uma leitura de um link (o qual obtivemos olhando a documentação do site www.buscarcep.com.br) utilizando a função file_get_contents() do PHP. Esta função, por sua vez, recebe os parâmetros em formato de texto, e os mesmos são atribuidos a variável $resultado. Em seguida utilizamos a funcão parse_str() do PHP para converter a string recebida em uma variável do tipo array e retornamos esse array.

2º arquivo:


require "./ajax/xajax_core/xajax.inc.php"; // XAJAX
require "./funBuscarCep.php"; // Função que faz a busca do cep

$ajax = new xajax();
$ajax->registerFunction("buscaCep");

##################################### BUSCA CEP #####################################
function buscaCep($cep, $endereco, $bairro, $cidade, $estado){

//Instancia o objeto XAJAX response
$objResponse = new xajaxResponse('ISO-8859-1');

if(empty($cep)){
return $objResponse;
}

$cep = str_replace("-", "", $cep);

$resultado_busca = busca_cep($cep); // Retorna um array

// Coloca os valores dos arrays nos campos do formulário
$objResponse->assign($endereco, "value", $resultado_busca['tipo_logradouro']." ".$resultado_busca['logradouro']);
$objResponse->assign($bairro, "value", $resultado_busca['bairro']);
$objResponse->assign($cidade, "value", $resultado_busca['cidade']);
$objResponse->assign($estado, "value", $resultado_busca['uf']);

// Retorna a resposta de XML gerada pelo objeto do xajaxResponse
return $objResponse;
}

// Manda o ajax processar os pedidos acima
$ajax->processRequest();

$ajax->printJavascript('./ajax/');
?>

Neste arquivo temos uma função em xajax chamada buscarCep(), a qual é responsável por receber do formulário o cep e os nomes dos campos de endereço, bairro, cidade e estado, para que, após o retorno da função que busca o cep no web service, os dados sejam atribuidos aos campos sem precisar recarregar a página. Simples assim!

Veja neste link esse código funcionando.

Clique aqui ou aqui e faça download dos scripts.

12 dicas para otimizar seus códigos PHP

É sempre útil ler algumas dicas rápidas para melhorar a sua codificação. Geralmente temos vícios que adquirimos no dia-a-dia que, sem sabermos, tornam o nosso código mais lento.

Seguem abaixo 12 dicas para melhorar o processamento dos seus códigos PHP.

1. Se um método pode ser static, declare-o como static! O desempenho aumenta 4 vezes;

2. Evite utilizar metódos mágicos como __get, __set e __autoload, se possível;

3. require_once() é dispensável e demanda bastante memória;

4. Use caminhos completos (full path) nos includes e requires, pois é gasto menos tempo resolvendo os caminhos do sistema operacional;

5. Se você quer descobrir o tempo em que o script começou a ser executado, é preferível utilizar $_SERVER[´REQUEST_TIME´] do que time();

6. Veja se pode utilizar strncasecmp, strpbrk e stripos ao invés de regex;

7. str_replace é mais rápido que preg_replace, mas strtr é 4 vezes mais rápido que str_replace;

8. Se uma função, como de substituição de strings, aceitar tanto arrays como caracteres simples como argumentos, e se a sua lista de argumentos não é muito longa, considere fazer algumas declarações redundantes de substituição, passando um caractere por vez, ao invés de uma linha de código que aceita arrays como argumentos de busca e substituição;

9. Supressão de erro com @ é muito lento;

10. $row[´id´] é 7 vezes mais rápido que $row[id];

11. Mensagens de erro demandam mais processamento;

12. Não utilize funções dentro de loops, como por exemplo: for ($x=0; $x <>. A função count() é chamada todas as vezes que o loop é executado.;

terça-feira, 16 de setembro de 2008

Função para cálculo de frete dos correios

1.
2.

3. define('FRETE_PAC', '41106');
4. define('FRETE_SEDEX', '40010');
5. define('FRETE_SEDEX_10', '40215');
6. define('FRETE_SEDEX_HOJE', '40290');
7. define('FRETE_E_SEDEX', '81019');
8. define('FRETE_MALOTE', '44105');
9.
10. /**
11. * calcula_frete
12. *
13. * @param mixed $servico
14. * @param mixed $origem CEP da origem
15. * @param mixed $destino CEP do destino
16. * @param mixed $peso Peso em Kg
17. * @access public
18. * @return array
19. */
20. function calcula_frete ($servico, $origem, $destino, $peso) {
21. if (!$sock = fsockopen('www.correios.com.br', 80, $errornro, $error, 60)) {
22. throw new Exception($error, $errornro);
23. }
24.
25. $msg = "GET /encomendas/precos/calculo.cfm?"
26. ."Servico={$servico}&cepOrigem={$origem}&cepDestino={$destino}"
27. ."&peso={$peso}&resposta=localhost HTTP/1.1\n"
28. ."Host: www.correios.com.br\nConnection: Close\n\n";
29.
30. fwrite($sock, $msg);
31.
32. while (!feof($sock)) {
33. $line = fgets($sock);
34. if (!preg_match('/^Location: \w+\?(.*)$/i',$line, $match)) continue;
35.
36. $data = array();
37. foreach(split('&', $match[1]) as $item) {
38. $t = split('=', $item);
39. $data[$t[0]] = trim($t[1]);
40. }
41.
42. break;
43. }
44. $data['Servico'] = urldecode($data['Servico']);
45. $data['erro'] = urldecode($data['erro']);
46.
47. return $data;
48. }
49.
50. $result = calcula_frete(FRETE_SEDEX, '20512170', '78053378', '2');
51. var_dump($result);



----------------------------------------------------------------------------------------------


Bem simples, não é? Agora, $result contém a seguinte estrutura:

array(13) {
["Servico"]=>
string(5) "SEDEX"
["cepOrigem"]=>
string(8) "20512170"
["cepDestino"]=>
string(8) "78053378"
["UFOrigem"]=>
string(2) "RJ"
["LocalOrigem"]=>
string(7) "Capital"
["UFdestino"]=>
string(2) "MT"
["LocalDestino"]=>
string(7) "Capital"
["Peso"]=>
string(1) "1"
["MaoPropria"]=>
string(1) "0"
["AvisoRecebimento"]=>
string(1) "0"
["valorDeclarado"]=>
string(1) "0"
["Tarifa"]=>
string(4) "27.5"
["erro"]=>
string(0) ""
}

Como se protejer contra SQL INJECTION


SQL Injection no PHP: O que é e como se proteger

A segurança das informações é um assunto que exige atenção especial, principalmente em se tratando de informações armazenadas em bancos de dados acessados via web.

Uma das técnicas de fraude mais conhecida pelos desenvolvedores web é a SQL Injection. Trata-se da manipulação de uma instrução SQL através das variáveis quem compõem os parâmetros recebidos por um script server-side, tal como PHP, ASP, ColdFusion e outros.

O principal motivo pelo qual deve-se impossibilitar a utilização da SQL Injection está no fato de que, através de uma simples instrução SQL, como por exemplo, uma projeção de dados, outras operações podem ser executadas, podendo impactar sobre o esquema das tabelas, os dados armazenados, e até mesmo sobre elementos do sistema operacional, tendo em vista que alguns bancos de dados permitem a execução de comandos do shell do próprio sistema operacional.

Detectando a vulnerabilidade de um sistema

Para ilustrar o conceito de SQL Injection, a seguinte simulação pode ser realizada. Imaginemos que um script de validação de acesso de usuários tenha sido desenvolvido como segue:


Nas linhas 3 e 4, as variáveis $usuario e $senha, respectivamente, recebem o conteúdo submetido por um formulário através do método POST. Eis a fonte do problema.

Suponha que a seguinte entrada tenha sido informada no campo usuário no formulário chamador do script de validação.

Se nenhuma outra validação for realizada, o usuário mal intencionado terá efetuado login no sistema, sem ao menos informar um usuário contido na tabela. Isto foi possível pois o valor de entrada informado não recebeu o tratamento devido, sendo adicionado à instrução para ser executado. Vale ressaltar que as validações apresentadas no exemplo são apenas ilustrativas, havendo a necessidade de checagens mais eficazes para um script de validação de acesso.

Impossibilitando o uso de SQL Injection

Para que se esteja livre da utilização da SQL Injection, certas providências devem ser tomadas. Algumas das ações serão realizadas no servidor de banco de dados, outras devem ser garantidas pelo código fonte.

Deve-se tomar cuidado com a configuração do usuário que estabelece a conexão com o banco de dados. O ideal é que as permissões de acesso deste usuário estejam restritamente limitadas às funções que irá realizar, ou seja, para a exibição de um relatório, a conexão com o banco de dados deve ser realizada por um usuário com permissões de leitura e acesso somente às tabelas necessárias para sua operação.

Todos os valores originados da coleta de dados externos, devem ser validadas e tratadas a fim de impedir a execução de eventuais instruções destrutivas ou operações que não sejam as esperadas.

Um tratamento básico para a execução de querys com variáveis contendo valores informados pelo usuário:



Com a utilização da função addslashes() será adicionada uma barra invertida antes de cada aspa simples e aspa dupla encontrada, processo conhecido como escape. Se a diretiva de configuração do PHP magic_quotes_gpc estiver ativada, o escape é realizado automaticamente sobre os dados de COOKIES e dados recebidos através dos métodos GET e POST. Neste caso, não deve ser efetuado o tratamento com addslashes(). A função get_magic_quotes_gpc(), disponível nas versões do PHP a partir da 3.0.6, retorna a configuração atual da diretiva magic_quotes_gpc.

Abaixo, a query string resultante da aplicação do tratamento mencionado:



Em muitos bancos de dados, existem funções específicas para o tratamento de variáveis em query strings, o que diminui a compatibilidade do código fonte para operação com outros sistemas de banco de dados.

Outra dica importante é evitar a exibição das mensagem de erro em um servidor de aplicação em produção, pois geralmente nos erros ou alertas são exibidos caminhos de diretórios do sistema de arquivos e informações à respeito do esquema do banco de dados, podendo comprometer a segurança do sistema.

Para ocultar a exibição de erros e alertas do PHP, é necessária a configuração da diretiva display_errors para Off no arquivo de configurações do PHP.

Cabe ao desenvolvedor estar atento às possíveis brechas de segurança existentes nos códigos fonte que produz, principalmente quando o que está em jogo é um bem de grande valia: a informação. Tenha consciência. Isto evita futuras dores de cabeça e atritos desnecessários com o cliente.