Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

rafaeloliveira83

Form Mail Seguro?

Recommended Posts

Olá pessoal achei um form mail na internet que diz ser seguro.

Como não entendo muito de segurança em PHP e sei apenas que o POST é mais seguro que o GET alguem pode me ajudar se esse form é seguro mesmo???

 

 

envia_mail.php

 

<?php
//-----------------------------------------------------------------------------------
// Projeto.: Formulario para envio de emails com proteção contra injeção de dados.
// Autor...: Sandalo (Dega Hosting)
// Versão..: 1
// Revisão.: 2
//---------------------------------------------------------------------------------------------
if ( $_SERVER['REQUEST_METHOD'] == 'POST' ) { // foi feito um post no formulario
$nome_site = 'Formulario Site Degahosting.com.br'; // Nome do formulario
$email_site = 'seuemail@seusite.com.br'; // Coloque aqui o email que vai receber o formulario
$email_user = $_POST['email']; // campo e-mail retirado do formulario
$nome_user = $_POST['nome']; // campo nome
if ( strpos( $_SERVER['HTTP_REFERER'], $_SERVER['SERVER_NAME'] ) > 0 ) { // verifica se o servidor que ta o formulario é o mesmo que o chamou, se for um ataque de injeção de dados este valor será diferente
ini_set( 'sendmail_from', $email_site );
$msg = "Formulario Preenchido em ".date("d/m/Y")." as ".date("H:i:s").", seguem abaixo os dados:<br><br>";
while( list( $campo, $valor ) = each( $HTTP_POST_VARS ) ) {
$msg .= "<b>".ucwords($campo).":</b> ".$valor."<br>";
}
$cabecalho = "Return-Path: ".$nome_user." <".$email_user.">\r\n";
$cabecalho .= "From: ".$nome_user." <".$email_user.">\r\n";
$cabecalho .= "X-Priority: 3\r\n";
$cabecalho .= "X-Mailer: Formmail [version 1.0]\r\n";
$cabecalho .= "MIME-Version: 1.0\r\n";
$cabecalho .= "Content-Transfer-Encoding: 8bit\r\n";
$cabecalho .= 'Content-Type: text/html; charset="iso-8859-1"';
mail( $email_site, 'Formulario do site', $msg, $cabecalho );
echo('<meta http-equiv="REFRESH" content="0;url=http://[coloque aqui a url do site destino]">');
} else {
die( 'Detectada tentativa de injeção de dados, seu ip foi logado e tomaremos as providencias legais' );
}
}
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa valeu mesmo, da um medo usar formulário, mas mesmo assim valeu

hehehehe

 

Que medo é este mano?

 

Coisa simples

 

Qualquer coisa procure por criptografia "Chave Privada"

Compartilhar este post


Link para o post
Compartilhar em outros sites

Negativo, não é seguro, e o primeiro falha já está aqui:

 

 

hile( list( $campo, $valor ) = each( $HTTP_POST_VARS ) ) {

 

Isso aqui:

$HTTP_POST_VARS
não se usa mais, apenas $_POST, a partir do PHP6 por exemplo, essa opção será totalmente desabilitada... e conseqüentemente sistemas como este ficarão sem funcionar.

 

mais atenção.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Negativo, não é seguro, e o primeiro falha já está aqui:

 

 

hile( list( $campo, $valor ) = each( $HTTP_POST_VARS ) ) {

 

Isso aqui:

$HTTP_POST_VARS
não se usa mais, apenas $_POST, a partir do PHP6 por exemplo, essa opção será totalmente desabilitada... e conseqüentemente sistemas como este ficarão sem funcionar.

 

mais atenção.

 

Como ficaria então o código corrigido se não for pedir muito???

Compartilhar este post


Link para o post
Compartilhar em outros sites

seu ip foi logado e tomaremos as providencias legais - mentira : eu não vi neste código a ação que armazena ip que fez injeção de dados.

 

<?php
//-----------------------------------------------------------------------------------
// Projeto.: Formulario para envio de emails com proteção contra injeção de dados.
// Autor...: Sandalo (Dega Hosting)
// Versão..: 1
// Revisão.: 2
//---------------------------------------------------------------------------------------------
if ( $_SERVER['REQUEST_METHOD'] == 'POST' ) { // foi feito um post no formulario
$nome_site = 'Formulario Site Degahosting.com.br'; // Nome do formulario
$email_site = 'seuemail@seusite.com.br'; // Coloque aqui o email que vai receber o formulario
$email_user = $_POST['email']; // campo e-mail retirado do formulario
$nome_user = $_POST['nome']; // campo nome
if ( strpos( $_SERVER['HTTP_REFERER'], $_SERVER['SERVER_NAME'] ) > 0 ) { // verifica se o servidor que ta o formulario é o mesmo que o chamou, se for um ataque de injeção de dados este valor será diferente
ini_set( 'sendmail_from', $email_site );
$msg = "Formulario Preenchido em ".date("d/m/Y")." as ".date("H:i:s").", seguem abaixo os dados:<br><br>";
while( list( $campo, $valor ) = each( $_POST ) ) {
$msg .= "<b>".ucwords($campo).":</b> ".$valor."<br>";
}
$cabecalho = "Return-Path: ".$nome_user." <".$email_user.">\r\n";
$cabecalho .= "From: ".$nome_user." <".$email_user.">\r\n";
$cabecalho .= "X-Priority: 3\r\n";
$cabecalho .= "X-Mailer: Formmail [version 1.0]\r\n";
$cabecalho .= "MIME-Version: 1.0\r\n";
$cabecalho .= "Content-Transfer-Encoding: 8bit\r\n";
$cabecalho .= 'Content-Type: text/html; charset="iso-8859-1"';
mail( $email_site, 'Formulario do site', $msg, $cabecalho );
echo('<meta http-equiv="REFRESH" content="0;url=http://[coloque aqui a url do site destino]">');
} else {
die( 'Detectada tentativa de injeção de dados, seu ip foi logado e tomaremos as providencias legais' );
}
}
?>

Opa valeu mesmo, da um medo usar formulário, mas mesmo assim valeu

hehehehe

 

Que medo é este mano?

 

Coisa simples

 

Qualquer coisa procure por criptografia "Chave Privada"

 

 

 

você quis dizer https? Não encontrei no google "chave privada" + php

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sem contar que o trecho abaixo é totalmente desnecessário:

echo('<meta http-equiv="REFRESH" content="0;url=http://[coloque aqui a url do site destino]">');

Por que raios se processa uma saída HTML apenas para redirecionar a página, sendo que se pode fazer isso com o próprio PHP?

header("Location: site_destino.php")
exit;
Estou certo? http://forum.imasters.com.br/public/style_emoticons/default/assobiando.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sem contar que o trecho abaixo é totalmente desnecessário:

echo('<meta http-equiv="REFRESH" content="0;url=http://[coloque aqui a url do site destino]">');

Por que raios se processa uma saída HTML apenas para redirecionar a página, sendo que se pode fazer isso com o próprio PHP?

header("Location: site_destino.php")
exit;
Estou certo? http://forum.imasters.com.br/public/style_emoticons/default/assobiando.gif

 

Como seria um Form Seguro então??

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estudando mais um pouco, estudando principalmente nossas dicas, saberá como fazer um seguro... tem mais coisa errada ai.

 

Com relação a sua pergunta a mim, basta usar no lugar de

$HTTP_POST_VARS
sempre o
$_POST
ou
$_GET
dependendo de sua necessidade.

 

Paulo, o EXIT no final do header é desnecessário.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Paulo, o EXIT no final do header é desnecessário.

É verdade... Eu ía perguntar porque, mas, ao acessar a própria página da função no php.net, vi que, logo no primeiro exemplo, ele não tem o exit... Mas, se você observar, no último exemplo:
<?php
/* Redirect to a different page in the current directory that was requested */
$host  = $_SERVER['HTTP_HOST'];
$uri   = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
$extra = 'mypage.php';
header("Location: http://$host$uri/$extra");
exit;
?>
Por que aqui nesse script ele usa o exit? Ou aqui também é desnecessário? :mellow:

Compartilhar este post


Link para o post
Compartilhar em outros sites

1

está faltando tratamento dos dados

 

if ( $_SERVER['REQUEST_METHOD'] == 'POST' ) { // foi feito um post no formulario

$nome_site = 'Formulario Site Degahosting.com.br'; // Nome do formulario

$email_site = 'seuemail@seusite.com.br'; // Coloque aqui o email que vai receber o formulario

$email_user = $_POST['email']; // campo e-mail retirado do formulario

$nome_user = $_POST['nome']; // campo nome

sugestão:

verificar se "$_POST['email']" existe e se possui formato de email

verificar se "$_POST['nome']" existe e se possui quantidade minima e maxima de caracters. Também verificar se é uma string válida, verificando consoantes e vogais.

 

2 impedir envios duplicados

- pode usar session para verificar se jpá foi finalizado

 

3 impedir robots

- aplicação CAPTCHA

 

4

ocultar o nome do arquivo

<form action="formMail.php">

sugestão

- criar pasta qualquer "formMail" e dentro da pasta criar um arquivo index.php que conterá o script de envio de email

<form action="formMail/">

5

a dica 4 pode ser facilmente detectada usando scanners de rede. que coletam informações do webserser.

para reforçar a segurança configure o webserver para não mostrar cabeçalhos detalhados, informando qual tecnologia está sendo usada.

 

 

 

basicamente isso...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Paulo, o EXIT no final do header é desnecessário.

É verdade... Eu ía perguntar porque, mas, ao acessar a própria página da função no php.net, vi que, logo no primeiro exemplo, ele não tem o exit... Mas, se você observar, no último exemplo:
<?php
/* Redirect to a different page in the current directory that was requested */
$host  = $_SERVER['HTTP_HOST'];
$uri   = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
$extra = 'mypage.php';
header("Location: http://$host$uri/$extra");
exit;
?>
Por que aqui nesse script ele usa o exit? Ou aqui também é desnecessário? :mellow:

 

Sim, é desnecessário além de não fazer sentido ai, presta atenção, se a ação do hedaer é redirecionar, logo nem chegará a executar o exit, a não ser que dê um erro no header, ai pararia ali, mesmo assim é desnecessário, pois mesmo sem o exit, com um erro de header o script iria parar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

2 impedir envios duplicados

- pode usar session para verificar se jpá foi finalizado

hinom,

Fiquei interessado em impedir envio duplo... será que você poderia dar um exemplo +/- de como usá-lo?

Abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

4

ocultar o nome do arquivo

QUOTE

<form action="formMail.php">

 

 

sugestão

- criar pasta qualquer "formMail" e dentro da pasta criar um arquivo index.php que conterá o script de envio de email

QUOTE

<form action="formMail/">

Ou url amigavel, q até você pode mudar o nome.

Compartilhar este post


Link para o post
Compartilhar em outros sites

hinom,

Fiquei interessado em impedir envio duplo... será que você poderia dar um exemplo +/- de como usá-lo?

Abs

]

 

 

raciocínio lógico,

 

 

- ao entrar no formulario inicialize uma sessão, caso já exista, exclua

- ao enviar os dados, verifique se existe uma sessão e qual a data e hora que foi criada. se a hora for mais que 3 horas por exemplo, exclua a sessão e bloqueie.

- ao finalizar o envio dos dados sem erros, adicione um parâmetro para identificar que foi finalizado

 

 

[FORMUMLARIO]

SE sessao existir ENTAO

excluir sessao

FIM SE

 

gera nova sessao como um array,

indice 0 => contendo data e hora em formato timestamp

indice 1 => valor booleano. TRUE: foi finalizado, FALSE: continua ativo

 

$_SESSION[ 'formSID' ] = array( time(), false );

 

[perform] "página que recebe os dados"

 

SE sessao nao existir ENTAO
	bloqueie

	mostrar motivo do bloqueio ou redirecionar para pagina do formulario.. ou qualquer outra pagina

SENAO

   SE tempo de criação for maior que X minutos ENTAO

	  bloqueie..

	  SE sessao estiver finalizada ENTAO
		  excluir sessao, bloquear e direcionar para formulario
	  FIM SE

   FIM SE

FIM SE

Compartilhar este post


Link para o post
Compartilhar em outros sites

hinom,

Fiquei interessado em impedir envio duplo... será que você poderia dar um exemplo +/- de como usá-lo?

Abs

]

 

 

raciocínio lógico,

 

 

- ao entrar no formulario inicialize uma sessão, caso já exista, exclua

- ao enviar os dados, verifique se existe uma sessão e qual a data e hora que foi criada. se a hora for mais que 3 horas por exemplo, exclua a sessão e bloqueie.

- ao finalizar o envio dos dados sem erros, adicione um parâmetro para identificar que foi finalizado

 

 

[FORMUMLARIO]

SE sessao existir ENTAO

excluir sessao

FIM SE

 

gera nova sessao como um array,

indice 0 => contendo data e hora em formato timestamp

indice 1 => valor booleano. TRUE: foi finalizado, FALSE: continua ativo

 

$_SESSION[ 'formSID' ] = array( time(), false );

 

[perform] "página que recebe os dados"

 

SE sessao nao existir ENTAO
	bloqueie

	mostrar motivo do bloqueio ou redirecionar para pagina do formulario.. ou qualquer outra pagina

SENAO

   SE tempo de criação for maior que X minutos ENTAO

	  bloqueie..

	  SE sessao estiver finalizada ENTAO
		  excluir sessao, bloquear e direcionar para formulario
	  FIM SE

   FIM SE

FIM SE

 

Até ai tudo bem, lógica de programação, mas e como fica minha pergunta la em cima?

Ninguem tem um Form seguro pra postar pra mim??

Compartilhar este post


Link para o post
Compartilhar em outros sites

seu ip foi logado e tomaremos as providencias legais - mentira : eu não vi neste código a ação que armazena ip que fez injeção de dados.

 

<?php
//-----------------------------------------------------------------------------------
// Projeto.: Formulario para envio de emails com proteção contra injeção de dados.
// Autor...: Sandalo (Dega Hosting)
// Versão..: 1
// Revisão.: 2
//---------------------------------------------------------------------------------------------
if ( $_SERVER['REQUEST_METHOD'] == 'POST' ) { // foi feito um post no formulario
$nome_site = 'Formulario Site Degahosting.com.br'; // Nome do formulario
$email_site = 'seuemail@seusite.com.br'; // Coloque aqui o email que vai receber o formulario
$email_user = $_POST['email']; // campo e-mail retirado do formulario
$nome_user = $_POST['nome']; // campo nome
if ( strpos( $_SERVER['HTTP_REFERER'], $_SERVER['SERVER_NAME'] ) > 0 ) { // verifica se o servidor que ta o formulario é o mesmo que o chamou, se for um ataque de injeção de dados este valor será diferente
ini_set( 'sendmail_from', $email_site );
$msg = "Formulario Preenchido em ".date("d/m/Y")." as ".date("H:i:s").", seguem abaixo os dados:<br><br>";
while( list( $campo, $valor ) = each( $_POST ) ) {
$msg .= "<b>".ucwords($campo).":</b> ".$valor."<br>";
}
$cabecalho = "Return-Path: ".$nome_user." <".$email_user.">\r\n";
$cabecalho .= "From: ".$nome_user." <".$email_user.">\r\n";
$cabecalho .= "X-Priority: 3\r\n";
$cabecalho .= "X-Mailer: Formmail [version 1.0]\r\n";
$cabecalho .= "MIME-Version: 1.0\r\n";
$cabecalho .= "Content-Transfer-Encoding: 8bit\r\n";
$cabecalho .= 'Content-Type: text/html; charset="iso-8859-1"';
mail( $email_site, 'Formulario do site', $msg, $cabecalho );
echo('<meta http-equiv="REFRESH" content="0;url=http://[coloque aqui a url do site destino]">');
} else {
die( 'Detectada tentativa de injeção de dados, seu ip foi logado e tomaremos as providencias legais' );
}
}
?>

Opa valeu mesmo, da um medo usar formulário, mas mesmo assim valeu

hehehehe

 

Que medo é este mano?

 

Coisa simples

 

Qualquer coisa procure por criptografia "Chave Privada"

 

 

 

você quis dizer https? Não encontrei no google "chave privada" + php

 

http://pt.wikipedia.org/wiki/Chave_p%C3%BAblica

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.