Geen melding na versturen formulier
- Ariën - op 13/03/2019 11:17:44:
Het voorkomt ook een berichtenflood.
Nee, dat doet het niet. Bots maken doorgaans niet zulke nette/uitgebreide HTTP-requests. Cookies worden dus naar alle waarschijnlijkheid niet meegestuurd. De link naar je sessie is dus elke POST weg. Dus de teller begint bij elke aanroep opnieuw te lopen. Deze antiflood aanpak biedt dus geen enkele bescherming. Mede omdat je met deze aanpak niet afhankelijk bent van de sessie.
Je zou sessies wel kunnen gebruiken in combinatie met een CRSF-token, dat helpt waarschijnlijk stukken beter. In dit geval kun je namelijk niets POSTen zonder de aanwezigheid van een sessie, in deze opzet kun je dus niet zonder.
Gewijzigd op 13/03/2019 17:01:35 door Thomas van den Heuvel
Berichtfloodings hoeven niet alleen van botjes vandaan te komen.
Het is puur bedoeld tegen vervelio's of mensen die vaak blijven klikken.
Tegen bots is het inderdaad niet bedoeld. CSRF zou een stuk netter zijn, maar ook re-Captcha zou niet misstaan. Die pikt de meeste botjes er wel uit aan de hand van hun gedrag.
Gewijzigd op 13/03/2019 17:48:26 door - Ariën -
Marina Koster op 13/03/2019 16:07:55:
Ik heb het nu werkend, het formulier wordt verstuurd en ik krijg een melding op de plek van het formulier, dus dat is ook goed. Alleen verspringt de site na het verzenden weer naar het begin van de pagina. Is er een manier om te zorgen dat de site op #contact blijft staan na verzenden?
Dat kan door dit aan te passen:
<form method="post" action="/test/index.php">
Naar:
<form method="post" action="/test/index.php#contact">
Maar als je toch op de zelfde pagina blijft, kun je de action ook prima weglaten.
EDIT: Daarnaast zou ik de 'foutmeldingen' opsparen en allemaal weergeven. Niet alleen 'Uw voornaam is niet ingevuld' terwijl de rest ook niet is ingevuld.
Gewijzigd op 13/03/2019 17:49:20 door Michael -
- Ariën - op 13/03/2019 17:42:36:
Het is puur bedoeld tegen vervelio's of mensen die vaak blijven klikken.
En die kunnen geen cookies weggooien? :/
Thomas van den Heuvel op 13/03/2019 17:51:02:
En die kunnen geen cookies weggooien? :/
- Ariën - op 13/03/2019 17:42:36:
Het is puur bedoeld tegen vervelio's of mensen die vaak blijven klikken.
En die kunnen geen cookies weggooien? :/
Die kunnen dat ook wel als ze willen. Onder normale omstandigheden werkt het prima.
Misschien kan ik het eens 'forken' (kopiëren en aanpassen) naar iets wat van deze tijd is.
Gewijzigd op 13/03/2019 18:37:41 door - Ariën -
De huidige antispam beveiliging is gebaseerd op (een) normale operatie (van browsers), maar spam volgt dit uitgangspunt zelden tot nooit. Daarom heeft deze oplossing op voorhand al de verkeerde insteek en is daarom gewoon ongeschikt als beveiliging.
het script is ook gedateerd, en daar moet verandering in komen, vind ik.
Gewijzigd op 13/03/2019 19:35:17 door - Ariën -
Michael - op 13/03/2019 17:46:57:
EDIT: Daarnaast zou ik de 'foutmeldingen' opsparen en allemaal weergeven. Niet alleen 'Uw voornaam is niet ingevuld' terwijl de rest ook niet is ingevuld.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?php
// naam controle
if (empty($_POST['voornaam']))
$voornaam_fout = 1;
// achternaam controle
if (empty($_POST['achternaam']))
$achternaam_fout = 1;
// bedrijfsnaam controle
if (empty($_POST['bedrijfsnaam']))
$bedrijfsnaam_fout = 1;
// e-mail controle
if (function_exists('filter_var') && !filter_var($_POST['mail'], FILTER_VALIDATE_EMAIL))
$email_fout = 1;
// antiflood controle
if (!empty($_SESSION['antiflood']))
{
$seconde = 20; // 20 seconden voordat dezelfde persoon nog een keer een e-mail mag versturen
$tijd = time() - $_SESSION['antiflood'];
if($tijd < $seconde)
$antiflood = 1;
}
}
// Kijk of alle velden zijn ingevuld - naam mag alleen uit letters bestaan en het e-mailadres moet juist zijn
if (($_SERVER['REQUEST_METHOD'] == 'POST' && (!empty($antiflood) || empty($_POST['voornaam']) || !empty($voornaam_fout) || empty($_POST['achternaam']) || !empty($achternaam_fout) || empty($_POST['bedrijfsnaam']) || !empty($bedrijfsnaam_fout) || empty($_POST['mail']) || !empty($email_fout) || empty($_POST['bericht']))) || $_SERVER['REQUEST_METHOD'] == 'GET')
{
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
if (!empty($voornaam_fout))
echo '<p>Uw voornaam is niet ingevuld.</p>';
elseif (!empty($achternaam_fout))
echo '<p>Uw achternaam is niet juist.</p>';
elseif (!empty($bedrijfsnaam_fout))
echo '<p>Uw bedrijfsnaam is niet juist.</p>';
elseif (!empty($email_fout))
echo '<p>Uw e-mailadres is niet juist.</p>';
elseif (!empty($antiflood))
echo '<p>U mag slechts één bericht per ' . $seconde . ' seconde versturen.</p>';
else
echo '<p>U bent uw naam, bedrijfsnaam, e-mailadres of bericht vergeten in te vullen.</p>';
}
?>
// naam controle
if (empty($_POST['voornaam']))
$voornaam_fout = 1;
// achternaam controle
if (empty($_POST['achternaam']))
$achternaam_fout = 1;
// bedrijfsnaam controle
if (empty($_POST['bedrijfsnaam']))
$bedrijfsnaam_fout = 1;
// e-mail controle
if (function_exists('filter_var') && !filter_var($_POST['mail'], FILTER_VALIDATE_EMAIL))
$email_fout = 1;
// antiflood controle
if (!empty($_SESSION['antiflood']))
{
$seconde = 20; // 20 seconden voordat dezelfde persoon nog een keer een e-mail mag versturen
$tijd = time() - $_SESSION['antiflood'];
if($tijd < $seconde)
$antiflood = 1;
}
}
// Kijk of alle velden zijn ingevuld - naam mag alleen uit letters bestaan en het e-mailadres moet juist zijn
if (($_SERVER['REQUEST_METHOD'] == 'POST' && (!empty($antiflood) || empty($_POST['voornaam']) || !empty($voornaam_fout) || empty($_POST['achternaam']) || !empty($achternaam_fout) || empty($_POST['bedrijfsnaam']) || !empty($bedrijfsnaam_fout) || empty($_POST['mail']) || !empty($email_fout) || empty($_POST['bericht']))) || $_SERVER['REQUEST_METHOD'] == 'GET')
{
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
if (!empty($voornaam_fout))
echo '<p>Uw voornaam is niet ingevuld.</p>';
elseif (!empty($achternaam_fout))
echo '<p>Uw achternaam is niet juist.</p>';
elseif (!empty($bedrijfsnaam_fout))
echo '<p>Uw bedrijfsnaam is niet juist.</p>';
elseif (!empty($email_fout))
echo '<p>Uw e-mailadres is niet juist.</p>';
elseif (!empty($antiflood))
echo '<p>U mag slechts één bericht per ' . $seconde . ' seconde versturen.</p>';
else
echo '<p>U bent uw naam, bedrijfsnaam, e-mailadres of bericht vergeten in te vullen.</p>';
}
?>
Hoe zou ik dat kunnen oplossen? Heeft dat met 'elseif' te maken?
Toevoeging op 14/03/2019 08:50:39:
- Ariën - op 13/03/2019 16:22:08:
Is een bericht dat 'het versturen gelukt is' niet veel praktischer. Nu kom ik op de index uit, wat verwarrend is.
Ik heb het nu zo neergezet dat je na verzenden op het kopje contact blijft staan. Maar hoe zou jij het oplossen? Als een popup geen slimme zet is, wat zou ik dan kunnen doen?
Het opsparen kan door de elseif'jes te vervangen door ifjes. En dan elke foutmelding in een array laten zetten. En deze na versturen controlen met count() op het aantal: Is dit 0, dan is alles prima. Is het meer dan 0, dan doorloop je de foutmeldingen met foreach.