Brugere lige nu: 1
Herunder ser du en formular, der fungerer via et php-script: Når brugere klikker på Send mail, sender formularen det indtastede til et phpscript på serveren. Her sker den videre ekspedition (heri ligger modtagerens emailadresse - bekvemt uden for spamrobotternes rækkevidde).
Dette script er udformet således, at spambotters forsøg på injection bliver fanget og blokeret.
Formularen er helt enkel, ikke noget hokuspokus her:
<form method="post" action="sender.php">
<fieldset>
<legend>Husk at udfylde alle felter</legend>
<label for="t1">Navn:</label>
<input id="t1" type="text" name="name" /><br />
<label for="t2">Email:</label>
<input id="t2" type="text" name="email" /><br />
<label for="t3">Emne:</label>
<input id="t3" type="text" name="emne" /><br />
<!-- næste input skjules med css for almindelige brugere, kun spambotter ser (og udfylder sandsynligvis) feltet -->
<span class="ikkese"><label for="t7">Subject:</label>
<input id="t7" type="text" name="subject" /></span>
<label for="t4">Besked:</label>
<textarea id="t4" name="besked" rows="10" cols="49"></textarea><br />
<label for="t5">Ønskes kopi?</label>
<input type="checkbox" id="t5" name="customer_copy" checked="checked" />
<label for="t6"> </label><input id="t6" type="submit" name="submit" value=" Send mail " />
<input type="reset" value=" Slet alt " />
</fieldset>
</form>
Feltet med class-definitionen "ikkese" gør du i din css-fil usynlig for almindelige brugere sådan:
.ikkese {
display: none;
}
Resultatet af den definition er, at kun spambotter ser feltet - og de lokkes med feltets name til at udfylde feltet. Derved bliver de sorteret fra.
Øverst i sender.php - før der sendes noget til browseren, hvilket også betyder før din DocType - lægger du denne kode. Koden tjekker, om der er skrevet noget i det "forbudte" felt og dermed om det er en spambot, der har udfyldt formularen:
<?
if (!empty($_POST['subject'])) {
header ("Location: blokeret.php");
exit;
}
?>
Udtykket !empty($_POST['subject']) betyder "hvis feltet subject ikke er tomt". Er det tilfældet, at dette felt ikke er tomt, viderestilles til blokeret.php, ellers kører scriptet bare videre nede i sidens <body>.
Husk at få lavet en fejlside blokeret.php, som spambotten kan sendes til. Fejlsiden må ikke indeholde brugbar information om, hvorfor mailen ikke blev sendt - bedst vil det være at skrive den engelske tekst Message was successfully sent. - "Meddelelsen er blevet sendt uden problemer".
Det php-script, der behandler det indtastede i formularen og sender det til modtageren (dig), indsætter du i body på sender.php (siden, der øverst tjekker for spambotter):
<?php
if (isset($_POST['submit']))
{
if (!empty($_POST['name']) && // tjek, at der er skrevet et navn
!empty($_POST['email']) && // tjek, at der er skrevet en e-mail-adresse
!empty($_POST['emne']) && // tjek, at der er skrevet et emne
!empty($_POST['besked']) && // tjek, at der er skrevet en besked
// her følger sikringen mod spambotter
!strpos($_POST['name'], "dit_domain.dk") && // tjek, at dit domæne ikke er skrevet i feltet "navn"
!strpos($_POST['email'], "dit_domain.dk") && // tjek, at dit domæne ikke er skrevet i feltet "email"
!strpos($_POST['name'], "@") && // tjek, at der ikke er et @ i "navn"
!preg_match('/\r/',$_POST['name']) && // tjek, at der ikke er "vogn-retur" i "navn"
!preg_match('/\n/',$_POST['name']) && // tjek, at der ikke er "linjeskift" i "navn"
!preg_match('/\r/',$_POST['email']) && // tjek, at der ikke er "vogn-retur" i "email"
!preg_match('/\n/',$_POST['email'])) // tjek, at der ikke er "linjeskift" i "email"
// er alt ok, fortsættes med afsendelse af mailen
{
$headers="From: ".$_POST['name']."<".$_POST['email'].">";
if (@$_POST['customer_copy'])
{
$headers .= "\r\nBcc: ".$_POST['email'];
}
$body .= "Den " . date("d/m y") . " kl. " . date("G:i") . " skrev " . $_POST['name'] . ":\r\n\r\n" . $_POST['besked'];
if (@mail("dit.navn@dit_domain.dk", strip_tags($_POST['emne']),
stripslashes(strip_tags($body)), $headers))
{
echo "<p>Tak for din henvendelse. Jeg svarer så hurtigt som muligt.</p>";
}
else
{
echo "<p>E-mailen blev ikke sendt. Der skete en fejl. Prøv igen!</p>";
}
}
else
{
echo "<p>Mailen kunne ikke sendes, alle felter skal udfyldes korrekt!</p>";
}
}
?>
De kodelinjer, hvor der i kommentaret står "Tjek, at dit domæne ..." og "Tjek, at der ikke ..." har det formål at fange eventuelle forsøg på injection fa spammere.
Kodelinjen if (@$_POST['customer_copy']) tjekker, om afsenderen ønsker en kopi af den sendte mail og den efterfølgende kodelinje $headers .= "\r\nBcc: ".$_POST['email'] sender i så fald denne mail-kopi til den email-adresse, som afsenderen har indtastet.
I de to linjer, hvor kommentaren lyder "Tjek, at dit domæne ...", indsætter du dit domæne, hvor der i koden står dit_domain.dk.
I sekstende kodelinje udskifter du dit.navn@dit_domain.dk med din egen mail-adresse.
Jeg skrev før kodeboksen med php-koden, at scriptet skal lægges ind i <body></body> på sender.php.
Hvis du vil gøre det lidt mere elegant, lægger du yderligere omkring scriptet en <div id="indhold"></div>. Du skal så med css gøre plads over eller ved siden af denne div, så du kan få plads til en menu. Menuen tilføjer du sidens kildekode mellem <body> og <div id="indhold>:
body i sender.php:
<body>
Indsæt din menukode her
<div id="indhold>
Her indsætter du dit php-script
</div>
</body>