HOSPEDAGEM DE SITES DISCO VIRTUAL CONSTRUTOR BLOG
LOCAMAIL EXCHANGE E-MAIL MARKETING
BANDA LARGA
PC PROTEGIDO
FLASH COMMUNICATION MX WINDOWS STREAMING MEDIA PODCAST
PABX VIRTUAL PORTAL DE VOZ
HOSPEDAGEM
COMÉRCIO
ELETRÔNICO
REGISTRO
DE DOMÍNIO
REVENDA SERVIÇOS
DEDICADOS
SERVIÇOS
DE E-MAIL
SERVIÇOS
DE VOZ
SEGURANÇA
ÁUDIO E
VÍDEO
ACESSO

Protegendo os formulários do seu site

Um modo muito prático e eficiente de comunicação com os internautas que visitam o seu site é a utilização de formulários de contato. Com eles, informações que você deseja obter seguirão para o seu e-mail, facilitando a contratação de serviços, solicitação de produtos, pedidos etc.

Porém, como tudo na Internet, devem-se tomar algumas precauções para evitar o uso indevido por certos usuários mal intencionados. Dependendo de como o formulário for feito, pode-se fazer o envio de e-mail em massa através de brechas de segurança no código fonte.

Vamos descrever como proteger seus formulários, sejam eles criados em ASP ou PHP.

O objetivo é criar um formulário para envio de e-mails em seu site que não permita o seu uso indevido, ou seja, evitar que campos sejam acrescidos além daqueles previstos em sua programação.

O importante é que não seja possível passar mais informações dentro do FROM além de um e-mail válido.

Para quem tem site em plataforma Windows e usa ASP como linguagem de programação, sugerimos que siga o exemplo a seguir.

Conteúdo do arquivo index.asp, que irá tratar as mensagens de erro para campos obrigatórios:

<% If Request.QueryString("erro") <> "" Then %>
<Script>
alert(’Ocorreram os seguintes erros:\n<%=Request.QueryString("erro")%>’);
</Script>
html>
<head>
<title>CDOSYS</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<di<% End If %>
<v align="center">
<font face="Arial, Helvetica, sans-serif" size="2"><b><font color="#FF0000" size="4" face="Times New Roman, Times, serif">CDOSYS</font></b></font>
<form method="post" enctype="multpart/formdata" name="form1" action="envia.asp">
<table width="47%" border="1" cellspacing="2" cellpadding="2">
<tr>
<td width="33%">Servidor:</td>
<td width="67%">
<select name="sel_servidor">
<option value="smtp2.locaweb.com.br">SMTP2</option>
<option value="localhost">LOCALHOST</option>
</select></td>
</tr>
<tr>
<td width="33%"><font face="Times New Roman, Times, serif" size="3">Nome
do Remetente: </font></td>
<td width="67%"><font face="Arial, Helvetica, sans-serif" size="2">
<input type="text" name="nomerem" size="55">
</font></td>
</tr>
<tr>
<td width="33%"><font face="Times New Roman, Times, serif" size="3">E-mail
do remetente: </font></td>
<td width="67%"><font face="Arial, Helvetica, sans-serif" size="2">
<input type="text" name="emailrem" size="55">
</font></td>
</tr>
<tr>
<td width="33%"><font face="Times New Roman, Times, serif" size="3">E-mail
dos Destinatários:</font></td>
<td width="67%"><font face="Arial, Helvetica, sans-serif" size="2">
<input type="text" name="emaildest" size="55">
</font></td>
</tr>
<tr>
<td width="33%"><font face="Times New Roman, Times, serif" size="3">Assunto
do E-mail: </font></td>
<td width="67%"><font face="Arial, Helvetica, sans-serif" size="2">
<input type="text" name="assunto" size="55">
</font></td>
</tr>
<tr>
<td width="33%"><font face="Times New Roman, Times, serif" size="3">Mensagem:</font></td>
<td width="67%">
<textarea name="recado" rows="7" cols="52"></textarea></td>
</tr>
<tr>
<td colspan="2">
<div align="center">
<input type="submit" name="Submit" value="Envia">
<input type="reset" name="reset" value="Cancela"></div></code>
</td>
</tr>
</table>
</form></div>
</body>
</html>

Conteúdo do arquivo envia.asp:
<%
’ declaração das variáveis
Option Explicit
Dim servidor, nomerem, emailrem, emaildest, assunto, mensagem, mail, inv, vetInv, msgerro, i
Dim objCDOSYSMail, objCDOSYSCon
servidor = request.form("sel_servidor")
nomerem = trim(request.form("nomerem"))
emailrem = trim(request.form("emailrem"))
emaildest = trim(request.form("emaildest"))
assunto = trim(request.form("assunto"))
mensagem = trim(request.form("recado"))
inv = "\|,|à|á|ò|ó|ç|õ|ã|é|è|!|#|$|%|¨|&|*|(|)|+|=|’|~|^|`|´|:|;|?|/|>|<|À|Á|Ò|Ó|Ç|Õ|Ã|É|È"
vetInv = split(inv,"|")
’ validação de campos nulos
If nomerem = "" Then msgerro = msgerro & "- Nome do remetente vazio\n"
If emailrem = "" Then msgerro = msgerro & "- E-mail do remetente vazio\n"
If emaildest = "" Then msgerro = msgerro & "- E-mail do destinatário vazio\n"
If assunto = "" Then msgerro = msgerro & "- Assunto vazio\n"
If mensagem = "" Then msgerro = msgerro & "- Mensagem sem corpo\n"
’validação de endereço de e-mail
call validaEmail(emailrem)
call validaEmail(emaildest)
’funcao de validacao de email
Sub validaEmail(byRef mail)
For i=0 to Ubound(vetInv)
If InStr(1,mail,vetInv(i),0) <> 0 Then
msgerro = msgerro & “- E-mail ” & mail & ” contém caracter inválido\n”
Exit Sub
End If
Next
Dim c
c = 0
For i=1 to Len(mail)
If Cstr(mid(mail,i,1)) = “@” Then
c = c + 1
End If
Next
If c <> 1 Then msgerro = msgerro & “- E-mail ” & mail & ” é inválido\n”
If InStr(1,mail,”.”,0) = 0 or InStr(1,mail,”.”,0) = 1 Then msgerro = msgerro & “- E-mail ” & mail & ” é inválido\n”
End Sub
’verifica se tem erro
If msgerro <> “” Then
Response.Redirect “index.asp?erro=” & msgerro
’response.write msgerro
Response.End
Else
’cria o objeto para o envio de e-mail
Set objCDOSYSMail = Server.CreateObject(”CDO.Message”)
’cria o objeto para configuração do SMTP
Set objCDOSYSCon = Server.CreateObject (”CDO.Configuration”)
’SMTP
objCDOSYSCon.Fields(”http://schemas.microsoft.com/cdo/configuration/smtpserver“) = servidor
’”smtp2.locaweb.com.br”
’porta do SMTP
objCDOSYSCon.Fields(”http://schemas.microsoft.com/cdo/configuration/smtpserverport“) = 25
’porta do CDO
objCDOSYSCon.Fields(”http://schemas.microsoft.com/cdo/configuration/sendusing“) = 2
’timeout
objCDOSYSCon.Fields(”http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout“) = 30
objCDOSYSCon.Fields.update
’atualiza a configuração do CDOSYS para o envio do e-mail
Set objCDOSYSMail.Configuration = objCDOSYSCon
’e-mail do remetente
objCDOSYSMail.From = nomerem & “<" & emailrem & ">”
’e-mail do destinatário
objCDOSYSMail.To = emaildest
’anexo
’objCDOSYSMail.AddAttachment(”e:\home\ewbank1\web\teste\anexocdosys.jpg”)
’assunto da mensagem
objCDOSYSMail.Subject = assunto
’conteúdo da mensagem
objCDOSYSMail.HtmlBody = mensagem
’objCDOSYSMail.fields.update
’envia o e-mail
objCDOSYSMail.Send
’destrói os objetos
Set objCDOSYSMail = Nothing
Set objCDOSYSCon = Nothing
response.write “E-mail enviado com Sucesso…”
response.write “via: ” & request.form(”sel_servidor”)
response.write “Voltar
End If
%>
O formulário do index.asp é submetido ao envia.asp, que faz as validações e só recebe requisições do tipo POST, garantindo a segurança dos dados.

O formulário do index.asp é submetido ao envia.asp, que faz as validações e só recebe requisições do tipo POST, garantindo a segurança dos dados.Já para quem tem um site em plataforma Linux e usa PHP, veja como ficaria:

Conteúdo do arquivo formulario.html:
<html>
<head><title>Formulário para envio de e-mail</title>
</head>
<body>
<form method="POST" action="envia.php">
<h1>Formulário para envio usando a função mail</h1>
<!--Caso queira permitir o preenchimento do email de destino descomente a linha abaixo-->
<!--Para:
<input type="text" name="email_para">
-->
De:
<input type="text" name="email_de">
Assunto:
<input type="text" name="assunto">

Mensagem :
<textarea name="mensagem" rows="10" cols="60" lines="20"></textarea>

<input type="submit" name="send" value="Send">
</form>
</body>
</html></code>

Conteúdo do arquivo envia.php:
<code><?php
//PROTEÇÃO ANTES DE ENVIAR
//Verifica se os campos mensagem, email_de e assunto do formulário estão preenchidos
if (empty($_POST[’mensagem’])|| empty($_POST[’email_de’]) || empty($_POST[’assunto’])){
//Não tem mensagem vindo pelo formulário, não manda nada e redireciona para o formulario.html
header(”Location: formulario.html”);
}else{
//Verificação antes do envio;
//ESTA FUNÇÃO SERVE PARA VERIFICAR A CONSISTÊNCIA DE UM ENDEREÇO DE EMAIL
$emailPattern = ’/^[^@\s]+@([-a-z0-9]+\.)+[a-z]{2,}$/i’;
if (!preg_match($emailPattern, $_POST[’email_de’])){
echo ’Por favor verifique o endereço de email.’;
}else{
//Aqui você pode definir para quem vai o email
$to=”<a href=”mailto:webmaster@dominio.com.br” mce_href=”mailto:webmaster@dominio.com.br” >webmaster@dominio.com.br</a>”;
//$to = $_POST[’email_para’];
$from=$_POST[’email_de’];
// Envia o email :
if (mail($to,$_POST[’assunto’],$_POST[’mensagem’],”From: $from\n”)){
// Mostra confirmação de email enviado com sucesso.
echo “Seu email foi enviado com sucesso.”;
//Destroi as variáveis
unset ($_POST[’email_de’]);
unset ($_POST[’assunto’]);
unset ($_POST[’mensagem’]);
}else{
// Envio falhou
echo “Erro! Seu email não foi enviado.”;
}
}
}
?>

O formulário do envia.php só aceita o envio de mensagens através de outro formulário (formulario.html), utilizando a variável global $_POST[variavel].

É verificado se os dados estão vindo de um formulário e se o endereço de e-mail é válido.

Essas informações estão presentes em nosso Sistema de Ajuda nos links a seguir:

ASP
Como proteger as TAGs de formulários criados em ASP

PHP
Como proteger as TAGs de formulários criados em PHP

5 comentários para “Protegendo os formulários do seu site”

  1. JOÃO PRADO disse:

    Sua solução é interessante, mas tratando de uma empresa que deve evitar sobrecarga nos servidores ela não serve.

    A utilização de javascript para validação no cliente realmente pode dar margem para alguém usar um robô para fazer envios maliciosos, mas algumas técnicas simples podem dar conta do recado sem a necessidade de tanto código e validação de campos no servidor.

    Pra citar só uma basta gerar um “token” no servidor e armazená-lo na variável de sessão e setar um com o mesmo valor. No post do formulário compara-se os dois valores e procede-se ao envio do formulário caso sejam iguais (não se esqueça de gerar novo token e colocá-lo na variável de sessão utilizada). Caso a comparação dos valores não produza igualdade basta não proceder ao envio da mensagem.

  2. Rodolfo Andrade disse:

    Acho interessante também para páginas em PHP a utilização da função “strlen()”, que ajuda a evitar que clientes digitem um tamanho muito grande/pequeno em um campo do formulário, além da função “is_numeric”. É importante lembramos disso pois o html pode ser alterado via cliente, isto é, usar não é confiável, pois a propriedade “maxlength” pode ser alterada via JS.

    Exemplo para solução

  3. Felippe disse:

    Acho legal a Locaweb alertar seus desenvolvedores sobre a utilização de SQL Injection…. isso é bem mais perigoso que mandar e-mails por um formulário…

  4. placyo disse:

    muito bom!!!

  5. rogiel disse:

    Gostei muito de suas sugestões

Deixar um comentário