Hoe kan ik voorkomen dat mijn formulier gehackt wordt?

Veel gestelde vragen (en antwoorden) over WYSIWYG Web Builder.
Locked
User avatar
Pablo
 
Posts: 22472
Joined: Sun Mar 28, 2004 12:00 pm
Location: Europe
Contact:

Hoe kan ik voorkomen dat mijn formulier gehackt wordt?

Post by Pablo »

Een veel voorkomend probleem met online formulieren is dat hackers proberen spam te verzenden door gebruik te maken van 'lekken' in formulier.
Dit artikel introduceert een mogelijke oplossing om dit te voorkomen.
Dit artikel is een uitbreiding op het bestaande FAQ onderwerp 'Hoe gebruik ik PHP om data uit een formulier te verzamelen?'
viewtopic.php?t=1370
Dus lees eerst dit artikel voor meer details.

De volgende aanpassingen zijn gedaan aan het bestaande script:
1. Indien het script niet werd geactivateerd door een form-POST, dan wordt een redirect gedaan naar de opgegeven URL. Vervang '/index.html' door de gewenste pagina.
2. De functie 'Valid_Input' controleert of de header velden geen 'injected' code bevatten zoals 'CC:', 'BCC:' enz.
3. De functie 'Valid_Email' controleert het e-mailadres. Het voorkomt email reeksen of andere ongeldige data.
4. Een aantal extra header velden zijn toegevoegd om de kans te verkleinen dat de gegenereerde email door spam-filters wordt aangemerkt als spam.

Het volgende PHP script vervangt de huidige feedback.php code:

Code: Select all

<?php
  if ($_SERVER['REQUEST_METHOD'] != 'POST'){
    header('Refresh: 0; URL=/index.html');
    exit;
  }

  $mailto  = "jenaam@jedomein.com";
  $subject = "Feedback formulier";
  $message = "Ingevoerde formulier waarden:";
  $name    = Valid_Input($_POST['name']);
  $email   = Valid_Email($_POST['email']);
  foreach ($_POST as $key => $value){
    if (!is_array($value)){
      $message .= "\n".$key." : ".$value;
    }
    else{
      foreach ($_POST[$key] as $itemvalue){
        $message .= "\n".$key." : ".$itemvalue;
      }
    }
  }
  $header  = "From: ".$name." <".$email.">\n";
  $header .= "Reply-To: ".$email."\n";
  $header .= "MIME-Version: 1.0\n";
  $header .= "Content-Type: text/plain; charset=utf-8\n";
  $header .= "Content-Transfer-Encoding: 8bit\n";
  $header .= "X-Mailer: PHP v".phpversion();

  mail($mailto, $subject, stripslashes($message), $header) or exit('Fatal Mail Error!');

  function Valid_Input($data){
    list($data) = preg_split('/\r|\n|%0A|%0D|0x0A|0x0D/i',ltrim($data));
    return $data;
  }
  function Valid_Email($data){
    $pattern = '/^([0-9a-z]([-.\w]*[0-9a-z])*@(([0-9a-z])+([-\w]*[0-9a-z])*\.)+[a-z]{2,6})$/i';
    if (preg_match($pattern,$data)){
      return $data;
    }
    else{
      return $GLOBALS['mailto'];
    }
  }
?>


Het aangepaste voorbeeld kan hier worden gedowload:
http://www.wysiwygwebbuilder.com/suppor ... secure.zip

Met dank aan Kees voor het insturen van deze oplossing!
Locked