Hallo,

Hoop dat ik dit op de juiste plek zet.

Ik ben bezig met een nieuw contactformulier voor de website van het werk van mijn vrouw, omdat de vorige pagina met Recaptha V3 niet goed werkte.

De nieuwe versie heb ik wel werkend, maar er duikt een probleem op met de optie "Stuur kopie".
Deze wordt wel afgehandeld, maar bij de bedanktekst blijft de optie (incl. verzenden / wis knoppen staan).
Van alles geprobeerd, maar ik zie het niet. Script heb ik niet zelf geschreven. Zo ervaren ben ik nu ook weer niet.

Of de Recaptcha nu wel werkt blijft even afwachten.

Hopelijk zien jullie het probleem. P.s. Testen mag... https://boefjesenelfjes.nl/contact_test6_-page.php
Mails zal ik verwijderen en zeker niet (mis)gebruiken.


<?php
define('SITE_KEY', '__SITEKEY__');
define('SECRET_KEY', '__SECRETKEY__');
?>

//in de head
    <title>ReCaptcha V3</title>
    <script src='https://www.google.com/recaptcha/api.js?render=<?php echo SITE_KEY; ?>'></script>
    <script>
function myFunction(x) { document.getElementById("mySidenav").classList.toggle("open");
    x.classList.toggle("change");
}
</script>


</header>
<?php

// Config Gedeelte
$cfg['url'] = "www.boefjesenelfjes.nl";// Site waarnaar je terug gaat als je een bericht hebt achtergelaten
$cfg['naam'] = "Rob";                // Webmaster naam
$cfg['email'] = "__mijn e-mail__";        // Webmaster E-mail
$cfg['spam'] = 0;                        // Anti Spam Tijd in Minuten ( Voer "0" om de Spam Beveiliging uit te zetten )
$cfg['text'] = TRUE;                    // Bij Fout Text Rood maken ( TRUE voor aan, FALSE voor uit )
$cfg['input'] = TRUE;                    // Bij Fout Border om Vakje Rood maken ( TRUE voor aan, FALSE voor uit )
$cfg['HTML'] = TRUE;                    // Een HTML email ( TRUE voor aan, FALSE voor uit )

// Hieronder niks meer veranderen
// E-mail Checker / Validator
function checkmail($email)
{
    if(preg_match("^[0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\\.[a-z]{2,4}$", $email))
    {
        return TRUE;
    }
    return FALSE;
}

$formulier = TRUE;

if(!isset($_COOKIE['formulier']))
{
    if(isset($_POST['wis']) && ($_SERVER['REQUEST_METHOD'] == "POST"))
    {
        foreach($_POST as $key => $value)
        {
            unset($value);
        }
        header("Location: ".$_SERVER['PHP_SELF']."");
    }
        
    if(isset($_POST['verzenden']) && ($_SERVER['REQUEST_METHOD'] == "POST"))
    {
        $aFout = array();
        
        $naam = trim($_POST['naam']);
        $email = trim($_POST['email']);
        $onderwerp = trim($_POST['onderwerp']);
        $bericht = trim($_POST['bericht']);
        
       if(empty($naam) || (strlen($naam) < 3) || ( preg_match("[<>]", $naam) ) )
        {
            $aFout[] = "Er is geen naam ingevuld.";
            unset($naam);
            $fout['text']['naam'] = TRUE;
            $fout['input']['naam'] = TRUE;
        }
        if(empty($email))
        {
            $aFout[] = "Er is geen e-mail adres ingevuld.";
            unset($email);
            $fout['text']['email'] = TRUE;
            $fout['input']['email'] = TRUE;
        }
        elseif(!filter_var($email, FILTER_VALIDATE_EMAIL)) 
        {
            $aFout[] = "Er is geen correct e-mail adres ingevuld.";
            unset($email);
            $fout['text']['email'] = TRUE;
            $fout['input']['email'] = TRUE;
        }
        if(empty($onderwerp))
        {
            $aFout[] = "Er is geen onderwerp ingevuld.";
            unset($onderwerp);
            $fout['text']['onderwerp'] = TRUE;
            $fout['input']['onderwerp'] = TRUE;
        }
        if(empty($bericht))
        {
            $aFout[] = "Er is geen bericht ingevuld.";
            unset($bericht);
            $fout['text']['bericht'] = TRUE;
            $fout['input']['bericht'] = TRUE;
        }
        if(!$cfg['text'])
        {
            unset($fout['text']);
        }
        if(!$cfg['input'])
        {
            unset($fout['input']);
        }
        if(!empty( $aFout ))
        {
            $errors = '
            <div id="errors">
            <ul>';
            foreach($aFout as $sFout)

            {
                $errors .= "    <li>".$sFout."</li>\n";
            }
            $errors .= "</ul>
            </div>";
        }
        else
        {
            $formulier = FALSE;
            
            
            if($cfg['HTML'])
            {
                // Headers
                $headers = "From: \"Contact Formulier\" <".$cfg['email'].">\r\n"; 
                $headers .= "Reply-To: \"".$naam."\" <".$email.">\n";
                $headers .= "Return-Path: Mail-Error <".$cfg['email'].">\n";
                $headers .= "MIME-Version: 1.0\n";
                $headers .= "Content-Transfer-Encoding: 8bit\n";
                $headers .= "Content-type: text/html; charset=iso-8859-1\n";
                
                
                $bericht = '
                <br />
                <b>Naam:</b> '.$naam.'<br />
                <b>Email:</b> <a href=\"mailto:'.$email.'\">'.$email.'</a><br />
                <br />
                <b>Bericht:</b><br />
                '.$bericht.'
                <br />
                <br />
                <br />
                --------------------------------------------------------------------------<br />
                <b>Datum:</b> '.date("d-m-Y @ H:i:s").'<br />
                <b>IP:</b> <a href=\"http://sunny.nic.com/cgi-bin/whois?domain='.$_SERVER['REMOTE_ADDR'].'\">'.$_SERVER['REMOTE_ADDR'].'</a><br />
                <b>Host:</b> '.gethostbyaddr($_SERVER['REMOTE_ADDR']).'<br />
                </body>
                </html>';
            }
            else 
            {
                $bericht_wrap = wordwrap ($bericht, 40, "\n", 1);
                // Headers
 //tijdelijk uit  $headers = "From: \"Contact Formulier\" <".$cfg['email'].">\n"; 
 //               $headers .= "MIME-Version: 1.0\n";
 //               $headers .= "Content-type: text/plain; charset='iso-8859-1'\n"; 
            
                // Bericht
                $message = "Naam: ".$naam."        \n";
                $message .= "E-mail: ".$email."     \n";
                $message .= "Bericht:\n".$bericht_wrap."     \n ";
                $message .= "               \n ";
                $message .= "Datum: ".date("d-m-Y H:i:s")." \n";
                $message .= "------------------------------------------------------- \n ";
                $message .= "IP: ".$_SERVER['REMOTE_ADDR']."                    \n ";
                $message .= "Host: ".gethostbyaddr($_SERVER['REMOTE_ADDR'])."                \n ";
            
            }
        
            if(mail($cfg['email'], "[Contact] ".$onderwerp, $bericht, $headers)) 
            {
                if(isset($_POST['stuurkopie']))
                {
 //tijdelijk uit      $headers = "From: \"Contact Formulier\" <".$email.">\r\n"; 
 //                   $headers .= "Reply-To: \"".$naam."\" <".$email.">\n";
 //                   $headers .= "Return-Path: Mail-Error <".$email.">\n";
 //                   $headers .= "MIME-Version: 1.0\n";
 //                   $headers .= "Content-Transfer-Encoding: 8bit\n";
 //                   $headers .= "Content-type: text/html; charset=iso-8859-1\n";
                    
                    mail($email, "[Contact] ".$onderwerp, $bericht, $headers );
                
                }
                
                unset($naam, $email, $onderwerp, $bericht);
//tijdelijk uit                setcookie("formulier", 1, time() + ( $cfg['spam'] * 60 ) );
        
                echo "
                <p>
                Uw bericht is succesvol verzonden, er word zo snel mogelijk gereageerd.<br />
                <br />
                Met vriendelijke groeten,<br />
                <b>".$cfg['naam']."</b>
                </p>
                ";    
            }
            else
            {
                echo "Er is een fout opgetreden bij het verzenden van de email";
            }
//tijdelijk uit            header("refresh:3;url=".$cfg['url']."");
        }
    }
    if($formulier)
    {
    ?>
    <body>
    <div id="container">   
    <?php
    if(isset($errors)) {
        echo $errors;
    }
    ?>

        <form method="post" action="<?php $_SERVER['PHP_SELF']; ?>">
        <p>
        <label <?php if(isset($fout['text']['naam'])) { echo 'class="fout"'; } ?>>Naam:</label>
        <input type="text" id="naam" name="naam" maxlength="30" <?php if(isset($fout['input']['naam'])) { echo 'class="fout"'; } ?> value="<?php if (!empty($naam)) { echo stripslashes($naam); } ?>" /><b>
        
        <label <?php if(isset($fout['text']['email'])) { echo 'class="fout"'; } ?>>Email:</label>
        <input type="text" id="email" name="email" maxlength="255" <?php if(isset($fout['input']['email'])) { echo 'class="fout"'; } ?> value="<?php if (!empty($email)) { echo stripslashes($email); } ?>" /><br />
        
        <label <?php if(isset($fout['text']['onderwerp'])) { echo 'class="fout"'; } ?>>Onderwerp:</label>
        <input type="text" id="onderwerp" name="onderwerp" maxlength="40" <?php if(isset($fout['input']['onderwerp'])) { echo 'class="fout'; } ?> value="<?php if (!empty($onderwerp)) { echo stripslashes($onderwerp); } ?>" /><br />
        
        <label <?php if(isset($fout['text']['bericht'])) { echo 'class="fout"'; } ?>>Bericht:</label>
        <textarea id="bericht" name="bericht" <?php if(isset($fout['input']['bericht'])) { echo 'class="fout"'; } ?> cols="35" rows="6"><?php if (!empty($bericht)) { echo stripslashes($bericht); } ?></textarea><br />

        <?php 
        }
        ?>
        <label for="stuurkopie">Stuur mij een kopie</label><input type="checkbox" id="stuurkopie" name="stuurkopie" value="1" /><br />
        
        <label></label>
        <input type="submit" id="verzenden" name="verzenden" value="verzenden" />
        <input type="submit" id="wis" name="wis" value="Wis velden" />
        </p>
        </form>
    </div>
    <?php
    }
else 
{
    echo "
    <p>
    U kunt maar eens in de ".$cfg['spam']." minuten een e-mail versturen!<br />
    U wordt nu automatisch doorgestuurd.
    </p>";
    header("refresh:3;url=".$cfg['url']."");
}
?> 
<script>
    grecaptcha.ready(function() {
    grecaptcha.execute('<?php echo SITE_KEY; ?>', {action: 'homepage'})
    .then(function(token) {
        //console.log(token);
        document.getElementById('g-recaptcha-response').value=token;
    });
    });
    </script>
<?php 
if($_POST){
    function getCaptcha($SecretKey){
        $Response = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=".SECRET_KEY."&response={$SecretKey}");
        $Return = json_decode($Response);
        return $Return;
    }
    $Return = getCaptcha($_POST['g-recaptcha-response']);
    //var_dump($Return);
    if($Return->success == true && $Return->score > 0.5){
        echo "Succes!";
    }else{
        echo "You are a Robot!!";
    }
}
?>

	
</body>
</html>
Kan je het script beperken tot relevante code, en deze tussen code-tags zetten? Zie ook de Veelgestelde Vragen.
- Ariën - op 20/10/2019 15:11:57

Kan je het script beperken tot relevante code, en deze tussen code-tags zetten? Zie ook de Veelgestelde Vragen.


Ik zie dat mijn code niet helemaal overgekomen zoals ik wilde. Excuus.

@ariën : Had het hele script tussen code en /code tags gezet, echter alle ?php automatisch gescheiden. Hoe pas ik dit aan?
Fixxed, je mistte een php-starttag.

Oplossing voor je probleem:
Zet die formuliervelden in het if-statement erboven, waar ook de andere velden staan.

[size=xsmall]Toevoeging op 21/10/2019 13:28:02:[/size]

Nog iets: Ik zie net dat de mail die ik kreeg in mijn spambox terecht is gekomen. Blijkbaar omdat je headers uitstaan, als dat ook in je code zo is?

Veder kan je het beste met filter_var controleren of een mail-adres correct is. Nu sluit je lange extenties, zoals bijvoorbeeld: [email protected] al uit.

Ook raad ik aan om bij location-headers een exit() erna te plaatsen. Je wilt immers je script stoppen.
- Ariën - op 20/10/2019 15:39:32

Oplossing voor je probleem:
Zet die formuliervelden in het if-statement erboven, waar ook de andere velden staan.

Opgelost.
- Ariën - op 20/10/2019 15:39:32

Nog iets: Ik zie net dat de mail die ik kreeg in mijn spambox terecht is gekomen. Blijkbaar omdat je headers uitstaan, als dat ook in je code zo is?

Headers stonden uit, vanwege foutmeldingen. Kwam erachter dat het formulier zich voordeed dat de mail via je eigen adres werd verzonden. Script aangepast en headers weer aangezet.
- Ariën - op 20/10/2019 15:39:32

Veder kan je het beste met filter_var controleren of een mail-adres correct is. Nu sluit je lange extenties, zoals bijvoorbeeld: [email protected] al uit.

Neem aan dat de meeste gewoon met een .nl, .com adres mailen.
Volgens mij zijn adressen met een lange extentie niet echt meer van deze tijd of is dat nog steeds hip?

- Ariën - op 20/10/2019 15:39:32

Ook raad ik aan om bij location-headers een exit() erna te plaatsen. Je wilt immers je script stoppen.

Opgelost. Location headers verwijderd.

Bedankt voor de hulp.
De testpagina is offline.

[size=xsmall]Toevoeging op 24/10/2019 21:41:46:[/size]

Rob Valkenburg op 20/10/2019 14:55:02

Testen mag... https://boefjesenelfjes.nl/contact_test6_-page.php


Testpagina bestaat inmiddels niet meer.
Mailadressen met lange extenties (TLD's) zie je niet vaak, maar ze zijn er wel. Dus het is een kleine moeite om er rekening mee te houden :-)

je hebt ook .musea, .website .hosting en nog een hele hoop.
- Ariën - op 24/10/2019 21:50:00

Mailadressen met lange extenties (TLS's) zie je niet vaak, maar ze zijn er wel. Dus het is een kleine moeite om er rekening mee te houden :-)

je hebt ook .musea, .website .hosting en nog een hele hoop.


Hoe zou ik dit eventueel kunnen aanpassen?
Door filter_var() te gebruiken, waar ik eerder naar heen linkte.
Deze zal per PHP-versie wel een update krijgen als het nodig is. Dan hoef je niet steeds zelf een reg-ex te zoeken of te maken die in de meeste gevallen niet voldoet aan de voorgeschreven RFC :-P
Moet wel gezegd worden dat filter_var() -in zijn algemeenheid- geen wondermiddel is *kuch*unicode*kuch*. Desalniettemin zal deze filter (FILTER_VALIDATE_EMAIL) voor de meeste gevallen (waarschijnlijk) wel voldoen.

Dat gezegd hebbende, misschien is een alternatieve of aanvullende controle misschien ook interessant: je zou kunnen controleren of het domein een MX record heeft. Een e-mail adres kan namelijk volgens filter_var() wel een syntactisch valide e-mailadres zijn, maar deze kan nog steeds onzin bevatten.

filter_var() kan dus nog steeds "false positives" opleveren, maar met een extra check wordt de kans dat iemand een onzin-adres invult weer kleiner.

Bijvoorbeeld dus zoiets:
<?php
// @note have to add a dot at the end to make it a Fully Qualified Domain Name, otherwise it might check a relative domain?
// @see https://www.php.net/manual/en/function.checkdnsrr.php#119969
$domain = substr($emailAddress, strpos($emailAddress, '@') + 1).'.'; // @todo UTF-8 compatibiliteit
$test = checkdnsrr($domain, 'MX');
if ($test === false) {
    // verzamel foutmeldingen op een of andere manier
    $errors[] = 'no MX record found for domain of e-mail address';
}
?>


En de ultieme check is natuurlijk een bevestigingsconstructie via het desbetreffende e-mailadres.
Oké, bedankt voor jullie toelichting.

Ga erna kijken. :)
Potentiële verbetering (betere UTF-8 support):
<?php
$domain = idn_to_ascii(mb_substr($emailAddress, mb_strpos($emailAddress, '@') + 1).'.');
$test = checkdnsrr($domain, 'MX');
if ($test === false) {
    $errors[] = 'no MX record found for domain of e-mail address';
}
?>

Reageren