webForumDet fria alternativet

Problem med mailformulär.

5 svar · 489 visningar · startad av hoolaboola

hoolaboolaMedlem sedan mars 200827 inlägg
#1

Jag har ett problem med mitt mailformulär. Jag har börjat fått spam i det och jag har kört Acunetix Web Vulnerability Scanner och sett jag det finns lite säkerhetshål i mitt mailformulär. Vad skulle man kunna göra för att bli av med spam och göra formuläret säkrare utan för mycket arbete. Tacksam för all hjälp jag kan få.

Kontaktsidan

<script language="javascript">
function check()
{
var reg = new RegExp("^[A-Za-z0-9_]{1,}[.]?[A-Za-z0-9_]{1,}@{1}([A-Za-z0-9_]+[.]{1})+[A-Za-z0-9_]{1,}$");
	if(document.to.txt_name.value=="")

 {

  alert("Fyll i ditt namn.");

  document.to.txt_name.focus();

  return false;

 }

 if(document.to.txt_email.value=="")

 {

  alert("Fyll i din e-postadress.");

  document.to.txt_email.focus();

  return false;

 }
 else if(!reg.test(document.to.txt_email.value))
       {
         alert("Felaktig e-post. Försök igen");
         document.to.txt_email.focus();
         return false;
       }

 if(document.to.txt_message.value=="")

 {

  alert("Meddelande kan ej lämnas tom.");

  document.to.txt_message.focus();

  return false;

 }
else
{
 return true;
 }
}
</script><br />
<form action="includes/mail.php" method="post" name="to">
<div id="contactform">
<?php if($_GET[mailmsg]=="1") { ?>
<div id="contact_action" align="center"><?php echo "Meddelandet har skickats.";?></div>
		<?php
		}
		?>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
  <tr>
    <td colspan="2" class="formtitle">Kontaktformulär</td>
    </tr>
	  <tr>
    <td colspan="2" height="10"></td>
    </tr>
  <tr>
    <td width="100" class="leftmessage">Namn:</td>
    <td width="250"><input name="txt_name" type="text" class="msgbox" id="txt_name" width="200px"></td>
  </tr>
  <tr>
    <td class="leftmessage">E-post:</td>
    <td><input type="text" id="txt_email" name="txt_email" width="200px" class="msgbox"></td>
  </tr>
  <tr>
    <td class="leftmessage">Meddelande: </td>
    <td><textarea cols="40" rows="5" name="txt_message" id="txt_message" width="200px" class="msgbox"></textarea></td>
  </tr>
  <tr>
    <td>&nbsp;</td>
    <td height="30"><table width="170" border="0" cellspacing="0" cellpadding="0">
  <tr>
    <td><input name="sendmail" type="submit" class="msgbutton" onclick="return check();" value="Skicka"/></td>
    <td width="10">&nbsp;</td>
    <td><input name="cancel" type="reset" class="msgbutton" value="Radera"></td>
  </tr>
</table>
</td>
  </tr>
</table></div>
</form>

mail.php

<?php session_start();

include("../admin/includes/connection.php"); 

function contains_newlines($str_to_test) {
   if(preg_match("/(%0A|%0D|\\n+|\\r+)/i", $str_to_test) != 0) {
     echo "newline found in $str_to_test. Suspected injection attempt - mail not being sent.<br />";
     //echo "here you must use the exit or die php functions to finish the script.<br /><br />";
     exit;
   }
}

if($_POST)
{
	$adminEmailRes = mysql_fetch_array(mysql_query("SELECT * FROM tbl_admin"));
	$adminEmail = $adminEmailRes[email];//die();
	$NAME_NEW = $_POST['txt_name'];
	$EMAIL_NEW = $_POST['txt_email'];
	$SUBJECT_NEW = "Meddelande från hemsidan";
	$MESSAGE_NEW = $_POST['txt_message'];
	$IP = $_SERVER['REMOTE_ADDR'];
	
	
	if($_SERVER['REQUEST_METHOD'] != "POST"){
	   echo "Unauthorized attempt to access page.<br />";
	   //echo "here you must use the exit or die php functions to finish the script.<br /><br />";
	   exit;
	}
	
	contains_newlines($EMAIL_NEW);
	
	
	$html_message.='<table width="100%" border="0" cellpadding="3" cellspacing="3">';
	$html_message.='<tr><td width="100%">&nbsp;</td></tr>';
	$html_message.='<tr><td width="100%">'.$NAME_NEW.', E-post: '.$EMAIL_NEW.'</td></tr>';
	$html_message.='<tr><td width="100%">IP-nummer: '.$IP.'</td></tr>';
	$html_message.='<tr><td width="100%">'.nl2br($MESSAGE_NEW).'</td></tr>';
	$html_message.='</table>';
	
	$email_from_addr = $EMAIL_NEW; // actual email address of the sender
	$email_from_name = $NAME_NEW;//$from_display_name; // display name, if any, that the sender wishes to use
	$email_subject = $SUBJECT_NEW; // The Subject of the email
	$email_txt = $html_message; // Message that the email has in it
	$email_to = $adminEmail; // Who the email is to
	$headers .= $email_from_name == '' ? "From: ".$email_from_addr : "From: ".$email_from_name." <".$email_from_addr.">";
	$semi_rand = md5(time());
	$mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";
	$headers .= "\nMIME-Version: 1.0\n" .
	"Content-Type: multipart/mixed;\n" .
	" boundary=\"{$mime_boundary}\"";
	$email_message .= "This is a multi-part message in MIME format.\n\n" .
	"--{$mime_boundary}\n" .
	"Content-Type:text/html; charset=\"iso-8859-1\"\n" .
	"Content-Transfer-Encoding: 7bit\n\n" .
	$email_txt .
	//$ok = mail($email_to, $email_subject, $email_message, $headers);
	$ok = mail($email_to,$email_subject,$email_message,$headers);
	
	
	
}
?>
<script language="javascript">location.href="../index.php?pageid=<?php echo $_SESSION['sessPageId'];?>&mailmsg=1";</script>
bwlarenMedlem sedan nov. 20094 inlägg
#2

Du kan ju testa att lägga till en captcha. Det borde minska allt spam i din mail

hoolaboolaMedlem sedan mars 200827 inlägg
#3

Det är ju ett alternativ, men inte det jag eftersöker... jag vill försöka få detta att fungera så bra som möjligt utan att behöva knappa in massa siffror/bokstäver för att få iväg ett mail...

Danne VMedlem sedan aug. 20068 090 inlägg
#4

hoolaboola skrev:

Det är ju ett alternativ, men inte det jag eftersöker... jag vill försöka få detta att fungera så bra som möjligt utan att behöva knappa in massa siffror/bokstäver för att få iväg ett mail...

Tja... om du inte vill ha ett captcha så är du nog ganska rökt. Det är nämligen det enda alternativet (näst efter att anställa någon som granskar varje mail och släpper igenom de du vill ska gå fram).

Men du behöver inte krångla så mycket alls: http://recaptcha.net/

onkelborgMedlem sedan juli 2003555 inlägg
#5

Gör ett enkelt captcha med javascript. Besökaren märker ingenting (som om sidan inte hade captcha ens en gång) sålänge javascript är påslaget. Är javascript avslaget så får besökaren fylla i vad t.ex. 5 + 10 blir i en textruta. Kolla på t.ex. http://curry09.se/gb.php

(Tekniken bakom: kolla att $_POST["hemligthemligt"] == "15" på servern. På klienten har du en div-tagg innehållande instruktionerna om 5 + 10 samt en textruta med namnet hemligthemligt. Om javascript är aktiverat så byter du ut innehållet i div-taggen mot en input-hidden istället med samma namn som textrutan.)

Fördel: Besökaren märker ingenting, vilket är fallet med traditionell captcha som jag fullkomligt hatar när folk lägger in (robotarna däremot, de är duktiga på att klara av dem med lite olika tekniker..)

Annat förslag är att du t.ex. byter namn på namn-textrutan till t.ex. "email", och på email-textrutan så byter du namn till t.ex. "homepage". På servern kollar du sedan om "email" innehåller ett snabel-a: Spam! Om "homepage" innehåller http://: Spam! Fungerar tydligen ganska bra, även om jag misstänker att en del webbläsare med lite smarta funktioner såsom autokomplettering kan störa sig lite på det.. (Robotarna läser ju inte texten, de letar bara efter input-taggar..)

PeddaMedlem sedan juni 20006 032 inlägg
#6

Antar att spammarna inte skriver i ditt formulär, och gör dom det så hjälper ju inte captcha ändå.

Jag brukar lösa det så här:

I kontaktformuläret slumpar du fram en sträng som du dels lägger i en session och även i ett hidden fält i formuläret.
Sen i mail.php kollar du om sessionen stämmer med post datan från hidden fältet.
Stämmer det så skickar du mailet som vanligt, annars gör du det inte. Då vet du med ganska stor säkerhet att det postas från din hemsida.

131 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)