askIT

Spam sperre på skjema

Du har et kontaktskjema eller annet og ønsker at dette kun skal kunne sendes en gang. F.eks. hvis brukeren trykker Oppdater (F5) i nettleseren vil dette bli sendt på nytt, noe som man ønsker å unngå. Dette kan løses ved å lagre informasjon om brukeren på serveren, s slik at hvis brukerens informasjon ligger lagret vil ikke skjemaet være mulig å sende på nytt.

Test Spam sperre på skjema | Last ned

Først oppretter vi en mappe med navnet _cache. Her skal vi lagre midletidlig filer.

<?php
/*- Temporary directory --------------------- */
$tmp_dir "_cache";
if(!(
is_dir("$tmp_dir"))){
    
mkdir("$tmp_dir");
}
?>

Nå skal vi generere gyldig bilett. Denne biletten består av en tilfeldig streng tall og bokstaver. Til slutt legger vi på dagens dato i formatet År-Måned. Dette gjør at biletten er gyldig ut denne måneden.

<?php
/* Ticket */
$length 10;
$characters '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$charactersLength strlen($characters);
$randomString '';
for (
$i 0$i $length$i++) {
    
$randomString .= $characters[rand(0$charactersLength 1)];
}
$date date("ym");
$ticket_file $date "_" $randomString;

?>

Der hvor skjemaet skal sendes lager vi først biletten i den midletidlige mappen. I tillegg sender vi inn variabelen inp_ticket sammen med skjemaet. Denne variabelen skal vi hente ut der hvor skjemaet behandles.

<?php

/* Create a ticket */
$fh fopen("$tmp_dir/schema_$ticket_file.dat""w") or die("can not open file");
fwrite($fh"");
fclose($fh);

/* Show schema */
echo"
<h2>Demostrasjon av et skjema</h2>
    
<form method=\"post\" action=\"test_spam_sperre.php?action=sendmail\" enctype=\"multipart/form-data\">


<p>Felt:
<input type=\"hidden\" name=\"inp_ticket\" value=\"
$ticket_file\" />
<input class=\"contact\" type=\"text\" name=\"inp_field_a\" size=\"50\" value=\""
; if(isset($inp_field_a)){ echo"$inp_field_a"; } echo"\" class=\"form\" />
<input type=\"submit\" value=\"Send skjema\" class=\"form\" /></p>
</form>
"
;
?>

Der hvor skjemaet skal behandles tar vi i mot POST-variabelen inp_ticket. Vi sjekker da om denne biletten er gyldig ved hjelp av file_exists. Hvis biletten godkjennes sletter vi denne fra den midletidlige mappen.

<?php
// Get post variable 
$inp_ticket $_POST['inp_ticket'];    
$inp_ticket output_html($inp_ticket);
    
if(
file_exists("$tmp_dir/schema_$inp_ticket.dat")){
    
// Delete ticket
    
unlink("$tmp_dir/schema_$inp_ticket.dat");

    echo
"
    <p>Skjema sendt!</p>
    "
;
}
else{
    echo
"
    <p>Det er ikke tillatt å oppdatere siden. Vennligst gå tilbake og bruk skjemaets send-knapp.</p>
    "
;
}
?>

mark_down.png Annonse

Akuratt nå: Ask IT bruker og anbefaler one.com for domener, e-post og webhotell!
hva-er-ditt-nye-domene.com
Besøk oss på one.com