webForumDet fria alternativet

Captcha skickar iväg mail trots fel kod

PHP

10 svar · 693 visningar · startad av maweer

Medlem sedan juli 2012123 inlägg
Frågan#1

Jag hittade en kod som jag hade tänkt att använda mig och enligt den som har skrivit det så skulle det räcka med detta att för det skulle fungera

Add an extra form field to your message form like this:

  <input type="text" name="secCode"> <b>&laquo;</b>
  <img src="seccode.php" width="71" height="21" align="absmiddle">

Sec-Code stores the security code in a session variable, so don't forget to start a session in your script where
you validate the security code. This has to be done before any headers are sent:

  if(!session_id()) session_start();

Here's an example how you can check for a valid security code:

  if($_POST['secCode'] != $_SESSION['secCode']) {
    // wrong security code
    
  }
  else {
    // security code is valid; reset it!
    $_SESSION['secCode'] = rand(100000, 999999);
    
  }

Jag har gjort så här och det funkar bra...förutom att den skickar iväg mailet trots att man angivit fel kod...och det är ju inte rätt :)

<?
  if(!session_id()) session_start();

  header('Cache-control: private, no-cache, must-revalidate');
  header('Expires: 0');
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="sv">
  
  <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
    <title>Mail</title>
<style type="text/css"> 
<!-- 
body { 
   background-color: #908989;
   background-image:url('form_image/main_bg.gif');
   font-family: Arial; 
   font-size: 13px;
   color: #FFFFFF;
} 

fieldset { 
border:0px; 
}

input[type="text"] { 
   width: 150px;
   background: #e8e8e8; 
   border: 1px solid #7b7878;
   font-family: Arial; 
   font-size: 13px;
   color: #000000; 
} 

textarea{
   width:300px;
   border:1px solid #7b7878;
   background-color:#e8e8e8;
   font-family: Arial; 
   font-size: 13px;
   color: #000000; 
}

img
{
vertical-align:middle;
}

--> 
</style>

</head>

<body>
	<form method="post" action="<?php $_SERVER['PHP_SELF']; ?>">
	<fieldset>
		<label>Mitt namn:<br />
		   <input name="name" type="text" /></label><br />

                <label>Telefonnummer:<br />
		   <input name="tfn" type="text" /></label><br />
		                

		<label>Min E-mail: <font size="4">*</font><br />
		   <input name="visitor_email" type="text" /></label><br />
		

		<label>&Auml;mne:<br />
		   <input name="subject" type="text" value="Förfrågan om spelning" /></label><br />
		

		<label>Meddelande:<br />
		   <textarea name="message" rows="7" cols="15"></textarea></label><br />
		

		<label>Ange koden:
  		   <input type="text" name="secCode" maxlength="6" style="width:50px" /> <b>&laquo;</b>
  		     <img src="seccode.php" width="71" height="21" alt="Ange kod" /></label><br />

		<input type="submit" value="Skicka" /><input type="hidden" name="do" value="send" /><input type="reset" value="&Aring;terst&auml;ll" />

	</fieldset>
	</form>

<?php

if($_POST['do']=="send") {

    if($_POST['secCode'] != $_SESSION['secCode']) {
      // wrong security code
      echo '<font color="red"><b>WRONG CODE!</b></font>';
    }
    else {
      // security code is valid; reset it!
      $_SESSION['secCode'] = rand(100000, 999999);
      echo '<b>Thanx!</b>';
    }

		$to = "mail@exempel.com";
		$subject = $_POST['subject'];
		$name = $_POST['name'];
		$tfn = $_POST['tfn'];
		$visitor_email = check_input($_POST['visitor_email'], "Vänligen ange din mailadress");
		$message = $_POST['message'];
		$secCode = check_input($_POST['secCode'], "Ditt mail har inte skickats! För att undvika spam, vänligen ange koden");
		$today = date("d M, Y");
$forminfo =
"Namn: $_POST[name]\n
E-mail: $_POST[visitor_email]\n
Telefonnummer: $_POST[tfn]\n

Skickat den: $today\n\n
OBS! Mailet går inte att svara på!\n";

		$from = "avsändare@exempel.se";
		$headers .= "Reply-To: $visitor_email \r\n";
		$headers = "From:" . $from;

		mail($to,$subject,$forminfo,$message,$headers);
		echo "$name, ditt mail har nu skickats.";

	}

function check_input($data, $problem='')
	{
    		$data = trim($data);
    		$data = stripslashes($data);
    		$data = htmlspecialchars($data);
    		if ($problem && strlen($data) == 0)
    {
        	show_error($problem);
    }
    		return $data;
}

function show_error($myError)
{
?>   
    <b><?php echo $myError; ?></b><br />

<?php
exit();
}
?>

    </body>
    </html>
Medlem sedan juni 20019 519 inlägg
#2

Du skall lägga in koden du vill köras i else satsen... du avslutar din if fråga det ända kommer skrivas ut om du har rätt eller fel är echo "WRONG CODE" eller "Thanks"... men allt annat kommer köras:

<?
  if(!session_id()) session_start();

  header('Cache-control: private, no-cache, must-revalidate');
  header('Expires: 0');
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="sv">
  
  <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
    <title>Mail</title>
<style type="text/css"> 
<!-- 
body { 
   background-color: #908989;
   background-image:url('form_image/main_bg.gif');
   font-family: Arial; 
   font-size: 13px;
   color: #FFFFFF;
} 

fieldset { 
border:0px; 
}

input[type="text"] { 
   width: 150px;
   background: #e8e8e8; 
   border: 1px solid #7b7878;
   font-family: Arial; 
   font-size: 13px;
   color: #000000; 
} 

textarea{
   width:300px;
   border:1px solid #7b7878;
   background-color:#e8e8e8;
   font-family: Arial; 
   font-size: 13px;
   color: #000000; 
}

img
{
vertical-align:middle;
}

--> 
</style>

</head>

<body>
    <form method="post" action="<?php $_SERVER['PHP_SELF']; ?>">
    <fieldset>
        <label>Mitt namn:<br />
           <input name="name" type="text" /></label><br />

                <label>Telefonnummer:<br />
           <input name="tfn" type="text" /></label><br />
                        

        <label>Min E-mail: <font size="4">*</font><br />
           <input name="visitor_email" type="text" /></label><br />
        

        <label>&Auml;mne:<br />
           <input name="subject" type="text" value="Förfrågan om spelning" /></label><br />
        

        <label>Meddelande:<br />
           <textarea name="message" rows="7" cols="15"></textarea></label><br />
        

        <label>Ange koden:
             <input type="text" name="secCode" maxlength="6" style="width:50px" /> <b>&laquo;</b>
               <img src="seccode.php" width="71" height="21" alt="Ange kod" /></label><br />

        <input type="submit" value="Skicka" /><input type="hidden" name="do" value="send" /><input type="reset" value="&Aring;terst&auml;ll" />

    </fieldset>
    </form>

<?php

if($_POST['do']=="send") {

    if($_POST['secCode'] != $_SESSION['secCode']) {
      // wrong security code
      echo '<font color="red"><b>WRONG CODE!</b></font>';
    }
    else {
      // security code is valid; reset it!
      $_SESSION['secCode'] = rand(100000, 999999);
      echo '<b>Thanx!</b>';

		$to = "mail@exempel.com";
        $subject = $_POST['subject'];
        $name = $_POST['name'];
        $tfn = $_POST['tfn'];
        $visitor_email = check_input($_POST['visitor_email'], "Vänligen ange din mailadress");
        $message = $_POST['message'];
        $secCode = check_input($_POST['secCode'], "Ditt mail har inte skickats! För att undvika spam, vänligen ange koden");
        $today = date("d M, Y");
		$forminfo =
			"Namn: $_POST[name]\n
			E-mail: $_POST[visitor_email]\n
			Telefonnummer: $_POST[tfn]\n
			Skickat den: $today\n\n
			OBS! Mailet går inte att svara på!\n";
        $from = "avsändare@exempel.se";
        $headers .= "Reply-To: $visitor_email \r\n";
        $headers = "From:" . $from;
        mail($to,$subject,$forminfo,$message,$headers);
        echo "$name, ditt mail har nu skickats.";
		}
}

function check_input($data, $problem='')
    {
            $data = trim($data);
            $data = stripslashes($data);
            $data = htmlspecialchars($data);
            if ($problem && strlen($data) == 0)
    {
            show_error($problem);
    }
            return $data;
}

function show_error($myError)
{
?>   
    <b><?php echo $myError; ?></b><br />

<?php
exit();
}
?>

    </body>
    </html>
Medlem sedan juli 2012123 inlägg
#3

Aha! :)
Tack så jätte mycket det funkar nu :)

Bara kolla om jag fattat det rätt.
kontrollen av koden går in före kontrollen av mina required field va?

Går det att få så det blir tvärt om?
Alltså så att man kollar att alla fält är ifyllda och sen kontroll av koden?

Jag kan ju leva med det som är nu också hahaha
Men, jag bara undrar om det går

Medlem sedan juni 20019 519 inlägg
#4

Går det att få så det blir tvärt om?
Alltså så att man kollar att alla fält är ifyllda och sen kontroll av koden?

det gör ju inte din kod alls idag ändå.

== är lika med och != är skilt från så om du vill ha det mer logiskt så byt ut != med == och byt plats på vid ett positivt värde (att man har skrivit rätt värde) gör så ;)

Medlem sedan juli 2012123 inlägg
#5

Hahaha okej ;)

Det här hängde jag med på == men att byt plats på vid ett positivt värde där tappade du mig hahaha

Medlem sedan juni 20019 519 inlägg
#6

skriv frågan omvänd... men resultatet bli detsamma...

Medlem sedan juli 2012123 inlägg
#7

Jag gjorde så här innan

 if($_POST['do']!="send") {

    if($_POST['secCode'] == $_SESSION['secCode']) {

Men, då blev då som innan, att den skickade iväg mailet trots fel kod

Men, required field meddelande kom först iaf :)

EDIT

Förlåt, så blev det inte alls....

När alla hade == så blev det så

Medlem sedan juni 20019 519 inlägg
#8

Läs if frågan....

Om POST dvs ett formulär med namnet "do" har värdet "send" så skall du göra allt som finns innan för den if blocket.

Det vill du ju ha kvar som det skall....

sen kör du nästa fråga... om secCode är detsamma som secCode i Sessionen då skall du göra XXX annars YYY:

if($_POST['do']=="send") {
	if($_POST['secCode'] == $_SESSION['secCode']) {
		// security code is valid; reset it!
		$_SESSION['secCode'] = rand(100000, 999999);

		$to = "mail@exempel.com";
		$subject = $_POST['subject'];
		$name = $_POST['name'];
		$tfn = $_POST['tfn'];
		$visitor_email = check_input($_POST['visitor_email'], "Vänligen ange din mailadress");
		$message = $_POST['message'];
		$secCode = check_input($_POST['secCode'], "Ditt mail har inte skickats! För att undvika spam, vänligen ange koden");
		$today = date("d M, Y");
		$forminfo =
		"Namn: $_POST[name]\n
		E-mail: $_POST[visitor_email]\n
		Telefonnummer: $_POST[tfn]\n
		Skickat den: $today\n\n
		OBS! Mailet går inte att svara på!\n";
		$from = "avsändare@exempel.se";
		$headers .= "Reply-To: $visitor_email \r\n";
		$headers = "From:" . $from;
		mail($to,$subject,$forminfo,$message,$headers);

		echo "$name, ditt mail har nu skickats.";
	} else {
		// wrong security code
		echo '<font color="red"><b>WRONG CODE!</b></font>';
	}
}

är vad jag menar om du vill skriva if frågorna "Vad skall jag göra om allt är frid och fröjd".

Medlem sedan juli 2012123 inlägg
#9

Jaha förlåt, jag hade hängt upp mig på != och ==

Nu gick den direkt till WRONG CODE

Jag provade att flytta den och lägga den innan function show_error($myError) för att se om det blev samma sak
men det blev serverfel....Du milde här är så många { och } så jag blir snart snurrig :P

Sen skickar den två mail nu också...vad har jag nu gjort.

Medlem sedan juni 20019 519 inlägg
#10

Postar din kod vad du har gjort, ett hett tips är att indentera din kod så bli det betydligt enklare att läsa sina egna koder.

Medlem sedan juli 2012123 inlägg
#11

Jodå, den postar det jag har gjort :)
Som sagt jag kan verkligen leva med detta, det var mest att jag hade tyckt det var "snyggt" om det hade funkat

Jag såg nu varför jag fick två mail. Jag hade lyckats att få med mail($to,$subject,$forminfo,$message,$headers); två gånger

Jo, jag får nog bli bättre på det, fast det är bara sista php stycket som jag inte har gjort så mycket vid det tycker jag :)

Men, tro det eller ej....jag körde den genom http://validator.w3.org/ och denna gången fanns inga anmärkningar :)
Det tar sig....om än dock bara lite :P

Tack så jätte mycket för hjälpen! :)

274 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
127 ms — deklarationer (db)
0 ms — hämta statistik (cache)
142 ms — hämta tråd, inlägg och bilagor (db)
129 ms — ändringar (db)