PHP formulier checken en spam vrij versturen

Status
Niet open voor verdere reacties.

Naughtygirl

Gebruiker
Lid geworden
17 jan 2009
Berichten
174
Hallo,

Wie kan mij helpen mijn contactformulier zo te beveiligen dat, er geen leeg formulier verstuurd kan worden, robots het formulier niet kunnen versturen, de verplichte invulvelden ingevuld zijn en dat er een geldig e-mailadres is ingevuld.
Ik ben nog maar een beginneling in php, en de tutorials op internet wordt ik ook niet wijzer van.

Formulier:
HTML:
<form method="post" action="send.php">
<label for="naam">Naam*:</label>
<input class="text" type="text" id="naam" name="naam" /><br />
<label for="mail">E-mail*:</label>
<input class="text" type="text" id="mail" name="mail" /><br />
<label for="bericht">Bericht*:</label>
<textarea id="bericht" name="bericht"></textarea><br /><br />
		
Velden met een * zijn verplicht.<br /><br />
				
<input class="verz" type="submit" value="Verzenden" name="submit" />
</form>

PHP:
<?php
$name = $_POST['naam'];
$email = $_POST['email'];
$bericht = $_POST['bericht'];

$to = 'a.wal16@chello.nl';
$subject = '';
$msg = "Naam: $name\n" .
"E-mail: $email\n" .
"Bericht: $other";
mail($to, $subject, $msg, 'From:' . $email);
?>

Deze script is nog verre van veilig. Wie kan mij hierbij helpen?
 
PHP:
<?php
$name = htmlentities($_POST['naam']);
$email = htmlentities($_POST['email']);
$bericht = htmlentities($_POST['bericht']);
 
// && == and
// || == or , deze heb ik niet gebruik maar vertel het er even bij
if (!empty($name) && !empty($bericht) && filter_var($email, FILTER_VALIDATE_EMAIL)) {
$to = 'a.wal16@chello.nl';
$subject = '';
$msg = "Naam: $name\n" .
"E-mail: $email\n" .
"Bericht: $other";
mail($to, $subject, $msg, 'From:' . $email);

} else {
    echo 'De gegevens zijn niet correct ingevoerd';
}
?>

Dit moet al iets beter zijn.

voor je mail bericht zou je hierop nog kunnen kijken:
php.net/manual/en/function.mail.php

ik zou nu het e-mail bericht in html versturen aangezien aparte karakters nu worden omgezet naar html tags
 
Laatst bewerkt:
Ik heb het even getest, maar kan hem niet verzenden, als ik alles correct invul. Kan die "echo" ook bij het formulier komen te staan, bv in het rood?
 
Laatst bewerkt door een moderator:
Nou moet die wel werken

PHP:
<?php
$message = '';
if($_SERVER['REQUEST_METHOD'] == 'POST') {
$name = htmlentities($_POST['naam']);
$email = htmlentities($_POST['email']);
$bericht = htmlentities($_POST['bericht']);
 
// && == and
// || == or , deze heb ik niet gebruik maar vertel het er even bij
if (!empty($name) && !empty($bericht) && !filter_var($email, FILTER_VALIDATE_EMAIL) ) {
$to = 'e-mail@e-mail.com';
$subject = '';
$msg = "Naam: $name\n" .
"E-mail: $email\n" .
"Bericht: $other";
mail($to, $subject, $msg, 'From:' . $email);
 
} else {
    $message = 'De gegevens zijn niet correct ingevoerd\n';
}
}
?>

<form method="post" action="test.php">
    <?php echo $message; ?><br>
<label for="naam">Naam*:</label>
<input class="text" type="text" id="naam" name="naam" /><br />
<label for="mail">E-mail*:</label>
<input class="text" type="text" id="mail" name="mail" /><br />
<label for="bericht">Bericht*:</label>
<textarea id="bericht" name="bericht"></textarea><br /><br />
        
Velden met een * zijn verplicht.<br /><br />
                
<input class="verz" type="submit" value="Verzenden" name="submit" />
</form>
 
Laatst bewerkt:
Ik krijg nu een lege pagina, als ik het correct en fout invul.
 
Laatst bewerkt door een moderator:
haha dat klopt.

Ik moest even iets testen dus had ik de action aangepast. Deze aanpassen naar jou pagina en het moet werken :)

en als je de foutmelding in het rood wil moet je nog even wat html toevoegen :)
 
Ik heb alleen regels toegevoegd, ik heb het script niet helemaal gekopieerd en geplakt.
 
Laatst bewerkt door een moderator:
Gedaan, maar nog steeds hetzelfde probleem.
 
Laatst bewerkt door een moderator:
Het probleem is dat ik geen lege pagina krijg.... staat het script ergens online zodat ik het kan zien?
 
Nee, hij staat nog niet online, ik test hem op een locale server.
 
Laatst bewerkt door een moderator:
op je locale kan je niet mailen tenzij dat je dit hebt geinstalleerd.

Maar als je het bestand aanroept krijg je wel je een formulier te zien.

Je zou een aantal echo's in het script kunnen toevoegen zodat je kan zien waar die stopt.
 
Dat heb ik geinstalleerd idd. Waar moet ik die echo's plaatsen dan?
 
Laatst bewerkt door een moderator:
Een meteen na het open van php een na de if statement en een na de mail

Dan kijken of ze alle 3 aan komen of niet. Laat even weten welke wel en welke niet aankomen :)

Verder wil i je vragen of je de quote van 14:30 het e-mail adres te verwijderen /aan te passen
 
Zoiets?
PHP:
<?php
echo 'Openen';

	$message = '';
	if($_SERVER['REQUEST_METHOD'] == 'POST'){
	$name = htmlentities($_POST['naam']);
	$email = htmlentities($_POST['email']);
	$bericht = htmlentities($_POST['bericht']);
	
	echo 'if statement';
	
	// && == and
	// || == or , deze heb ik niet gebruikt maar vertel het er even bij
	if (!empty($name) && !empty($bericht) && !filter_var($email, FILTER_VALIDATE_EMAIL)) {
		$to = 'a.wal16@chello.nl';
		$subject = '';
		$msg = "Naam: $name\n" .
		"E-mail: $email\n" .
		"Bericht: $other";
		mail($to, $subject, 'From:' . $email, $msg);
	} else {
		$message = 'De gegevens zijn niet correct ingevuld.';
	}}
	
	echo 'Mail';
?>

Dan krijg ik precies hetzelfde weer, lege pagina.
 
Laatst bewerkt door een moderator:
Ja dat is wat ik bedoelde zo kan je makkelijk zien of die door de pagina heen loopt. Maar het is wel heel apart... blijf je op de zelfde pagina of ga je naar een andere pagina? Je zou eigenlijk altijd al echo ' Openen'; moeten zien aangezien deze helemaal bovenaan staat. Mocht het dus zo zijn dat je 2 bestanden gebruikt dan kan het dus zo zijn dat die niet bij het andere bestand aankomt. Als je op de zelfde pagina blijft dan zou je het ook gewoon moeten zien.

Hoe zit je structuur in elkaar? 1 of 2 pagina's? als het twee pagina's zijn laat even weten welke en hoe deze eruit zien.
 
Hij gaat naar een andere pagina, nl. send.php. maar die pagina is leeg.
 
Laatst bewerkt door een moderator:
het lijkt er dus op dat die helemaal niet daarop uitkomt..

jouw formulier ziet er dus zo uit:
HTML:
<form method="post" action="send.php">
<label for="naam">Naam*:</label>
<input class="text" type="text" id="naam" name="naam" /><br />
<label for="mail">E-mail*:</label>
<input class="text" type="text" id="mail" name="mail" /><br />
<label for="bericht">Bericht*:</label>
<textarea id="bericht" name="bericht"></textarea><br /><br />
        
Velden met een * zijn verplicht.<br /><br />
                
<input class="verz" type="submit" value="Verzenden" name="submit" />
</form>
LET op hierbij is de action send.php en in mijn stukje html had ik test.php

en je send.php ziet er dan zo uit:
PHP:
<?php
echo 'Openen';
 
    $message = '';
    if($_SERVER['REQUEST_METHOD'] == 'POST'){
    $name = htmlentities($_POST['naam']);
    $email = htmlentities($_POST['email']);
    $bericht = htmlentities($_POST['bericht']);
    
    echo 'if statement';
    
    // && == and
    // || == or , deze heb ik niet gebruikt maar vertel het er even bij
    if (!empty($name) && !empty($bericht) && !filter_var($email, FILTER_VALIDATE_EMAIL)) {
        $to = 'a.wal16@chello.nl';
        $subject = '';
        $msg = "Naam: $name\n" .
        "E-mail: $email\n" .
        "Bericht: $other";
        mail($to, $subject, 'From:' . $email, $msg);
    } else {
        $message = 'De gegevens zijn niet correct ingevuld.';
    }}
    
    echo 'Mail';
?>

Als dit zo is zou het moeten werken. Let wel de melding de gegevens zijn niet correct ingevuld zal je nu niet krijgen aangezien het 2 verschilde bestanden zijn. Maar eerst moet het nu goed werken voordat we dit kunnen oplossen denk ik zo.
 
Laatst bewerkt:
FILTER_VALIDATE_EMAIL kun je beter niet meer gebruiken. sommige e-mailadressen valideert hij niet goed.
je kunt beter regex: preg_match gebruiken want daarmee kun je precies aangeven waar het email adres aan moet voldoen.
(araf!a@live.nl volgens mij mag wel maar wordt niet door gelaten door de functie)
 
Beste "Naughtygirl",

Wanneer je reageert op een bericht direct boven je dan is niet nodig om te quoten. Om die reden heb ik overal de onnodige quotes verwijderd. Graag hier in het vervolg rekening mee houden :)

Met vriendelijke groet,
Stefan (Tha Devil)
Moderator Helpmij.nl
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan