Hallo allemaal,

Ik heb een website gemaakt voor de winkel van mijn vrouw, en op de html-pagina met haar contactgegevens heb ik een php-contactformulier gezet dat ik ergens op het internet vond.

Nu stel ik vast dat je dit kan verzenden ook als je niks hebt ingevuld. Kan iemand mij helpen om dit te beveiligen. Ik heb zelf weinig kaas gegeten van php, vandaar mijn postje op dit forum.

Het php bestandje mail.php ziet er zo uit :

<?php
$name = $_POST['name'];
$email = $_POST['email'];
$phone = $_POST['phone'];
$message = $_POST['message'];
$formcontent="From: $name \n Message: $message";
$formcontent="From: $name \n Telefoon; $phone \n Message: $message"; 

//verander hieronder je emailadres
$recipient = "[email protected]";


//verander hieronder evt de teksten en de html
$subject = "Aanvraag via de website van ArteShop";
$mailheader = "From: $email \r\n";
mail($recipient, $subject, $formcontent, $mailheader) or die("Error!");
echo "
<h3>Bedankt! Uw bericht werd goed verzonden. We nemen zo snel mogelijk contact met u op.<br />
<a href='index.html'>Terug naar de website van ArteShop</a></h3>
";
?>



En het html-bestand contact.html ziet er zo uit :

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8" name="keywords" content="ArteShop, lederwaren, juwelen, jewels, bags, fashion">
	<title>Arte Shop</title>
	<link rel="stylesheet" href="css/style.css" type="text/css">
	<style type="text/css">
<!--
.style5 {font-family: Arial, Helvetica, sans-serif}
.style6 {color: #333333}
.style3 {
	color: #333333;
	font-family: Arial, Helvetica, sans-serif;
	font-size: 13px;
	font-weight: bold;
}
.style7 {font-size: 12px}
.style12 {font-weight: bold}
.style14 {color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 20px; font-weight: bold; }
-->
    </style>

</head>
<body>
<div class="header" style="display:block;">
	  <div>	  
	  <img src="images/logoarteshop2.png" alt="" width="327">
	  <ul>
				<li>
					<a href="index.html">Home</a>
				</li>
				<li>
					<a href="about.html">About</a>
				</li>
				<li>
					<a href="#">Collections</a>
					<ul>
						<li>
							<a href="jewels.html">Jewels</a>
						</li>
						<li>
							<a href="handbags.html">Bags</a>
						</li>
						<li>
							<a href="fashion.html">Fashion</a>
						</li>
					 </ul>
				  </li>
				        <li>
					<a href="shop.html">Shop</a>
				</li>
				<li>
				    <a href="contact.html">Contact</a>			      
				</li>
		</ul>
  	  </div>
	</div>
	<div class="body">
	  <div>
		<div class="collections">
			<div class="navigation">
				<ul>
					<li class="selected">
					<a href="#">CONTACT ARTESHOP</a>
					</li>
				</ul>
			</div>
	
		  <div>
		    <table width="100%" height="100%" border="0">
              <tr>
                <td height="86" colspan="5"><div align="center"><span class="style14"><br>ARTESHOP- Straat 12 - 9999 De Gemeente- Tel. 059 99 99 99</span></div></td>
              </tr>
            </table>
		    <table width="100%" height="100%" border="0">
                 <tr>
                   <td width="266" rowspan="10"><img src="images/figure34.jpg" alt="" width="218" style="border:1px solid white"></td>
                          <td>&nbsp;</td>
                          <td colspan="3"><span class="style3">OPENINGSUREN </span></td>
              </tr>
                 <tr>
                   <td>&nbsp;</td>
                          <td colspan="3">&nbsp;</td>
              </tr>
                 <tr>
                   <td>&nbsp;</td>
                          <td>&nbsp;</td>
                          <td colspan="2">&nbsp;</td>
              </tr>
                 <tr>
                   <td width="8">&nbsp;</td>
                          <td width="143"><span class="style7 style6 style5 style12"><strong>Maandag</strong></span></td>
                          <td colspan="2"><span class="style7 style6 style5"><strong>gesloten</strong></span></td>
              </tr>
                 <tr>
                   <td>&nbsp;</td>
                          <td><span class="style7 style6 style5 style2"><strong>Dinsdag</strong></span></td>
                          <td width="135"><span class="style7 style6 style5 style2"><strong>10:00-12:30</strong></span></td>
                          <td width="370"><span class="style7 style6 style5 style2"><strong>14:00-18:00</strong></span></td>
              </tr>
                 <tr>
                   <td>&nbsp;</td>
                          <td><span class="style7 style6 style5 style2"><strong>Woensdag</strong></span></td>
                          <td><span class="style7 style6 style5 style2"><strong>10:00-12:30</strong></span></td>
                          <td><span class="style7 style6 style5 style2"><strong>14:00-18:00</strong></span></td>
              </tr>
                 <tr>
                   <td>&nbsp;</td>
                          <td><span class="style7 style6 style5 style2"><strong>Donderdag</strong></span></td>
                          <td><span class="style7 style6 style5 style2"><strong>10:00-12:30</strong></span></td>
                          <td><span class="style7 style6 style5 style2"><strong>14:00-18:00</strong></span></td>
              </tr>
                 <tr>
                   <td>&nbsp;</td>
                          <td><span class="style7 style6 style5 style2"><strong>Vrijdag</strong></span></td>
                          <td><span class="style7 style6 style5 style2"><strong>10:00-12:30</strong></span></td>
                          <td><span class="style7 style6 style5 style2"><strong>14:00-18:00</strong></span></td>
              </tr>
                 <tr>
                   <td>&nbsp;</td>
                          <td><span class="style7 style6 style5 style2"><strong>Zaterdag</strong></span></td>
                          <td><span class="style7 style6 style5 style2"><strong>10:00-12:30</strong></span></td>
                          <td><span class="style7 style6 style5 style2"><strong>14:00-18:00</strong></span></td>
              </tr>
                 <tr>
                   <td>&nbsp;</td>
                          <td><span class="style7 style6 style5 style2"><strong>Zondag</strong></span></td>
                          <td colspan="2"><span class="style7 style6 style5 style2"><strong>10:00-13:00 (enkel tijdens schoolvakanties)</strong></span></td>
              </tr>
                 <tr>
                   <td>&nbsp;</td>
                          <td>&nbsp;</td>
                          <td>&nbsp;</td>
                          <td colspan="2">&nbsp;</td>
              </tr>
                 <tr>
                   <td height="86" colspan="5"><div align="center"><span class="style3"><br>
                   Hebt u een vraag, een klacht of een opmerking ? ArteShop staat klaar om ze te beantwoorden. <br>
                   U kunt ons bereiken per telefoon of door gebruik te maken van onderstaand contactformulier.</span></div></td>
              </tr>
            </table>
		    <style>
input, textarea {
	padding:5px; 
	border:2px solid #ccc; 
	border-radius: 5px;
	width="60";
	font:12px Verdana;
	margin-bottom:10px;
}

input[type=submit] {
	padding:5px 15px; 
	background:#ccc; 
	border:0 none;
	cursor:pointer;
	width:100px;
	border-radius: 5px; }
	
input[type=submit]:active {
	padding:5px 15px; 
	background:#cdc; 
}
            </style>
            <form name="contactform" method="post" action="mail.php">
  
            <div align="center">
      <input type="text" name="name" placeholder="Naam"  size="60"/>
      <br />
      
  <input type="email" name="email" placeholder="Email"  size="60"/>
      <br />
      
  <input type="text" name="phone" placeholder="Telefoonnummer"  size="60"/>
      <br />
      
  <textarea name="message" placeholder="Bericht" cols="60" rows="6"></textarea>
      <br />
      <br />
      <input type="submit" value="Verzenden" />													  
              </div>
            </form>
            <table width="870" height="49%" border="0"> 
<tr>
 
   <td width="614"><iframe src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d2496.132492806767!2d3.0341832000000113!3d51.27188020000002!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x47dcaafb4d232d9b%3A0x6d658c1be745677e!2sArte+Mio!5e0!3m2!1snl!2sbe!4v1440675281009" width="100%" height="349" frameborder="0" style="border:1px solid white" allowfullscreen></iframe></t>
   <td width="22">   
   <td width="220"> <img src="images/figure5.jpg" width="218" height="349" style="border:1px solid white">
</tr>
</table>


				
		  </div>
		</div>
	  </div>
</div>
	<div class="footer">
		<div>
			<p>
				&#169; 2015 DIRK DE COSTER</p>
			<div class="connect">			    <a href="index.html" id="facebook">Facebook</a> <a href="https://www.google.be/maps/place/Arte+Shop/@51.2719902,3.0341832,17z/data=!3m1!4b1!4m2!3m1!1s0x47dcaafb4d232d9b:0x6d568c1be745677e" id="googleplus">Google+</a>
			</div>
		</div>
	</div>
</body>
</html>




Voor alle duidelijkheid : ik heb hier en daar wat gegevens (mail adres - telefoonnummer, etc ...) gewijzigd in dit script om de privacy te bewaren.


Hopelijk kan iemand mij helpen ?

Alvast bedankt,
Dirk
Je kan prima controleren of er iets in ingevuld door te kijken naar de $_POST variabelen.

<?php
if(trim($_POST['naam'])=='') {
	// het veld is leeg
}
?>


Verder zou ik de structuur aanpassen, en eerst kijken of het formulier verstuurd is via POST:

<?php
if($_SERVER['REQUEST_METHOD']=="POST") {
	// er is gepost, voer hier de invoercontrole(s) uit
	// als deze gepasseerd zijn, dan kan je de mail versturen
}
?>


Verder zou ik ook even kijken naar de juiste mailheaders:
http://phpwiki.santhe.nl/index.php?title=De_juiste_mailheaders
Bedankt, Ariën.

Moet ik dit script dan opnemen in mijn php-code ?

Ja, maar zorg dat wel enige kennis van de basis hebt. Anders kan ik wel even een opzetje maken.
Oké, ik probeer het uit. Mag ik dit script gewoon onderaan toevoegen ? Of moet dit helemaal bovenaan ? Sorry Ariën, maar ik heb geen enkele php-kennis. Bij mij is 't meestal trial and error :-)

Groeten,
Dirk
Het belangrijkste is dat je de juiste opbouw hanteert, bij ene puzzel passen de stukjes immers ook maar op één juiste manier tot je een mooie afbeelding ziet. Ik ga even wat knutselen...

Het is een simpele validatie zonder controle op de soort invoer.
Verder is het script ongetest... ;-)


<?php
// Geef GELDIGE adressen op
// Een korte benaming voor jouw website
$website_naam = 'Mijn Site';
// Jouw eigen geldige emailadres
$eigen_emailadres = 'mijn_emailadres@mijn_domein.nl';
// Een geldig emailadres voor errors
$error_emailadres = 'mijn_emailadres@mijn_domein.nl';
// De naam van de verzender
$naam_verzender = 'Afzender';
// Het geldige emailadres van de afzender
$email_verzender = 'emailadres_van_verzender@zijn_domein.nl';
// Een geldig emailadres of helemaal leeg laten
$bcc_emailadres = 'geldig_emailadres@geldig_domein.nl';
// HTML mail? True/False
$html = true;

if($_SERVER['REQUEST_METHOD']=="POST") { // controleer hier of het formulier verstuurd is via de POST-method
	$errors = array(); // we initialiseren een array met de foutmeldingen!
	if(trim($_POST['name']) == "") {
		$errors[] = "Er is geen naam ingevuld";
	} 
	if(trim($_POST['email']) == "") {
		$errors[] = "Er is geen email ingevuld";
	}
	if(trim($_POST['phone']) == "") {
		$errors[] = "Er is geen telefoonnummer ingevuld";
	}
	if(trim($_POST['message']) == "") {
		$errors[] = "Er is geen bericht ingevuld";
	}

	if(count($errors)>0) { // er zijn één of meerdere errors
			echo 'De volgende fouten zijn opgetreden:<ul>';
			foreach($errors as $error) {
				echo "<li>".$error."</li>".PHP_EOL;
			}
			echo '</ul>';
	} else {
			// alle validaties zijn goed, we kunnen hier mailen
			
			$headers	 = 'From: ' . $website_naam . ' <' . $eigen_emailadres . '>' . "\r\n";
			$headers	.= 'Reply-To: ' . $naam_verzender . ' <' . $email_verzender . '>' . "\r\n";
			$headers	.= 'Return-Path: Mail-Error <' . $error_emailadres . '>' . "\r\n";
			$headers	.= ($bcc_emailadres != '') ? 'Bcc: ' . $bcc_emailadres . "\r\n" : '';
			$headers	.= 'X-Mailer: PHP/' . phpversion() . "\r\n";
			$headers	.= 'X-Priority: Normal' . "\r\n";
			$headers	.= ($html) ? 'MIME-Version: 1.0' . "\r\n" : '';
			$headers	.= ($html) ? 'Content-type: text/html; charset=iso-8859-1' . "\r\n" : '';
			$message = 
"Bericht: ".$_POST['message'].PHP_EOL .
"Telefoon :".$_POST['phone'].PHP_EOL .
"Naam: ".$_POST['name'];
			if(mail($eigen_emailadres, "Een bericht vanaf je contactformulier", $message, $headers)) {
				echo "De mail is verzonden";
			} else {
				echo "De mail is niet verzonden, mogelijk vanwege een configuratiefout";
			}
		}
	}
?>
Bedankt Ariën, ik probeer het morgen eens uit.

Alvast bedankt voor je hulp.

Groeten,
Dirk
Ik zou het verwerken van het formulier echt opnemen in een aparte, afzonderlijke stap. En de terugkoppeling opnemen in een andere, afzonderlijke stap.

Daarnaast zou ik het mailformulier op zijn minst beveiligen met een (CSRF) token, zodat dit formulier niet vanaf een andere website verstuurd kan worden. Of meteen voor een oplossing gaan met een CAPTCHA functionaliteit.

Bij het afwezig zijn van een van twee, of beide, bovenstaande voorzieningen is je formulier mogelijk nog steeds gevoelig voor misbruik.

Ook wordt de formulierdata in het bovenstaande voorbeeld voor het grootste deel niet doorgegeven, enkel "message"?

:/
Het ging mij even om een simpel voorbeeld. Het laatste heb ik in ieder geval aangepast. Gewoon een foutje van mij, geen ':/' voor nodig ;-)
Ariën, ik heb het php-script opgenomen en bij $eigen_emailadres en $error_emailadres mijn e-mail adres ingegeven. Vervolgens heb ik het php-bestand op de internetserver gezet en via de website het contactformulier ingevuld. De mail kwam toe in mijn post-bus. So far so good ...

Maar als ik één van de velden niet invulde dan kwam ik op de pagina http://ArteShop/mail.php terecht, een blanco webpagina. Er werd geen mail verstuurd, dat is goed, maar is het niet mogelijk om ergens een pop-up in te bouwen die zegt dat je "alle velden moet invullen" ?

Groeten,
Dirk
Er mist een </ul> aan de lijst van de getoonde errors.

Verder zijn popups niet meer van de tijd, en is het beter om ze te verzamelen.

Reageren