Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[PHP] POST variables met mailform pagina refresh probleem

Pagina: 1
Acties:

  • computer1_up
  • Registratie: December 2012
  • Laatst online: 14-10 20:42
Voor stage moet ik een oefenopdracht maken die het mogelijk moet maken om gegevens te verzenden naar een mailadres dat de gebruiker zelf kan invoeren.

Probleem hierbij is: als de pagina gerefreshed wordt, worden de POST variables opnieuw via de mail verzonden. Een mogelijke oplossing hierbij is: redirect naar een andere pagina. Dat klopt, dat zou goed werken, op één dingetje na. De vorige knop. Iedereen kent het en de meeste mensen gebruiken het. Als je dus op vorige drukt, dan wordt in de meeste gevallen de pagina gerefreshed waar naartoe je terug gaat, met als gevolg dat de form weer gesubmit wordt.

Persoonlijk zat ik te denken om de variablen die gesubmit worden te unsetten of deleten (of hoe je het ook wilt noemen) op het moment dat de pagina wordt verlaten of gerefreshed. Ik heb al geprobeerd met unset();, maar dat werkte bij mij niet.

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
43
44
45
<?php
$connect=mysqli_connect(localhost,"xxxx","xxxx",xxxx);
$ww=rand_string(8);
$vn=$_POST["text1"];
$an=$_POST["text2"];
$mail = ($_POST["text3"]);

function rand_string ($length){
    $characters = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    return substr(str_shuffle($characters),0,$length);
}
if ($_POST["hidden1"] == TRUE){
    if (!filter_var($mail, FILTER_VALIDATE_EMAIL)) {
        $mailerror = "Invalid email format"; 
    }
    define ('MAIL', 'xxx.xxx@xxxxxx.nl');
    mail ($mail, "Login", "Your login information is: Username: " . $mail . "Password: " .  $ww, "From: " .MAIL); 
    //$ww=" ";
    //$vn=" ";
    //$an=" ";
    //$mail=" ";
}


?>

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Signupmagic</title>

</head>

<body>
<form method="post" name="form1" id="form1" action="reloading();">
<input type="text" name="text1" id="text1">Voornaam<br>
<input type="text" name="text2" id="text2">Achternaam<br>
<input type="text" name="text3" id="text3">Mailadres <?php echo $mailerror; ?><br>
<input type="hidden" name="hidden1" id="hidden1" value="TRUE">
<input type="submit" name="submit1" id="submit1" value="Submit">
</form>

</body>
</html>


Er zit inderdaad een mysqli verbinding in, die wordt nog gebruikt in de toekomst.

Iemand die mij hierbij kan helpen?

Did you try turning it off and on again?


  • Saven
  • Registratie: December 2006
  • Laatst online: 09:51

Saven

Administrator

een captcha gebruiken bijvoorbeeld

Verwijderd

$_POST is een array, deze kun je dus ook leeg gooien door simpel:
PHP: filename
1
 $_POST = array();


Wat ook nog mogelijk is, is een redirect dmv een header:
PHP: filename
1
2
    header('Location: http://www.example.com/');
exit;

  • computer1_up
  • Registratie: December 2012
  • Laatst online: 14-10 20:42
Bedankt voor de reacties, hier kan ik denk ik wel wat mee. Ik ga het direct proberen.

Did you try turning it off and on again?


  • TRON
  • Registratie: September 2001
  • Laatst online: 17-11 09:59
Wat je ook zou kunnen doen, is een token genereren voor het indienen van het formulier. Zorg ervoor dat dat het token éénmaal gebruikt mag worden voor de betreffende actie en betreffende bezoeker. Dan kan men refreshen totdat ze een ons wegen zonder dat de mail opnieuw gestuurd wordt :)

Leren door te strijden? Dat doe je op CTFSpel.nl. Vraag een gratis proefpakket aan t.w.v. EUR 50 (excl. BTW)


  • L01
  • Registratie: December 2003
  • Laatst online: 17-11 21:53

L01

Trons suggestie is inderdaad een goede. Kijken eens naar Cross-site request forgery token, http://en.wikipedia.org/wiki/Cross-site_request_forgery. Dat werkt zoals Tron aangeeft en sowieso een goede check op een form.

Hi, I'm a signature virus. Put me in your signature to help me spread.


  • X_lawl_X
  • Registratie: September 2009
  • Laatst online: 17:14
Je moet sowieso ieder formulier standaard beveiligen met tokens, om de reden die L01 aangeeft!

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
Wat ook nog mogelijk is, is een redirect dmv een header:
PHP: filename
1
2
    header('Location: http://www.example.com/');
exit;
volgens mij is dit de beste oplossing... nog nooit problemen gehad op deze manier....

  • Barryvdh
  • Registratie: Juni 2003
  • Laatst online: 14:12
L01 schreef op maandag 01 december 2014 @ 09:09:
Trons suggestie is inderdaad een goede. Kijken eens naar Cross-site request forgery token, http://en.wikipedia.org/wiki/Cross-site_request_forgery. Dat werkt zoals Tron aangeeft en sowieso een goede check op een form.
CSRF tokens zijn niet perse single-use volgens mij. Dat is meer ter bescherming van cross-site requests (zoals de naam al zegt), niet dubbele submits.

Maar wat al gezegd wordt, als je met de header redirect, zou je gewoon terug moeten kunnen gaan naar de vorige pagina zonder opnieuw te submitten.

  • TRON
  • Registratie: September 2001
  • Laatst online: 17-11 09:59
Barryvdh schreef op maandag 01 december 2014 @ 10:28:
[...]

CSRF tokens zijn niet perse single-use volgens mij. Dat is meer ter bescherming van cross-site requests (zoals de naam al zegt), niet dubbele submits.

Maar wat al gezegd wordt, als je met de header redirect, zou je gewoon terug moeten kunnen gaan naar de vorige pagina zonder opnieuw te submitten.
Je kan ze natuurlijk wel single-use maken ;)

Leren door te strijden? Dat doe je op CTFSpel.nl. Vraag een gratis proefpakket aan t.w.v. EUR 50 (excl. BTW)


  • Cartman!
  • Registratie: April 2000
  • Niet online
Verwijderd schreef op zaterdag 29 november 2014 @ 13:52:
$_POST is een array, deze kun je dus ook leeg gooien door simpel:
PHP: filename
1
 $_POST = array();
Daar heb je sowieso helemaal niks aan, bij een refresh begin je gewoon weer van voor af aan ;)

Gewoon die redirect nemen dus :)

Verwijderd

Cartman! schreef op dinsdag 02 december 2014 @ 10:46:
[...]

Daar heb je sowieso helemaal niks aan, bij een refresh begin je gewoon weer van voor af aan ;)

Gewoon die redirect nemen dus :)
Haha klopt helemaal, echter wilde hij de de $_POST leegmaken dus gaf ik hem hier ook maar een optie voor :P

  • Cartman!
  • Registratie: April 2000
  • Niet online
Hij wilde die leegmaken met een bepaalde reden maar t helpt hem niet met zijn probleem dus kun je beter geen loze dingen voorstellen want dat kan ie alleen maar verkeerd opvatten.

  • computer1_up
  • Registratie: December 2012
  • Laatst online: 14-10 20:42
Oeps, beetje vergeten dat ik nog naar reacties moest kijken xD. Maar goed, ik ga eens kijken naar de oplossingen die jullie gegeven hebben. Bedankt hiervoor!

Did you try turning it off and on again?


  • computer1_up
  • Registratie: December 2012
  • Laatst online: 14-10 20:42
De header redirect met een exit heeft inderdaad geholpen, met wat hulp van http://wordpress.stackexc...ubmission-on-page-refresh (laatste antwoord). Hiermee werkt het vlekkenloos. Op zich is het goed om het formulier verder te beveiligen, maar dat gaat voor mij op dit moment nog iets te ver, omdat ik eerst de basis onder de knie moet krijgen.

Iedereen bedankt!

Did you try turning it off and on again?


  • Cartman!
  • Registratie: April 2000
  • Niet online
Beveiligen is onderdeel van de basis (!).

  • EricBruggema
  • Registratie: Maart 2007
  • Laatst online: 17:28
Een truukje die ik altijd toepas om te zorgen dat er geen dubbele emails verstuurd worden;

Ik check iedere keer als ik een formulier verstuur of deze al in een sessie is gezet, zo ja, dan is hij dubbel, zo niet dan niet.. voorbeeld ;)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
session_start();

if ($_SERVER['REQUEST_METHOD'] == "POST") {
    $ok = true;
    // doe je checks hier
    if ($ok) {
        if (!isset($_SESSION['mailform']) OR $_SESSION['mailform'] != serialize($_POST)) {
            // verstuur email
            // zet sessie mailform
            $_SESSION['mailform'] = serialize($_POST);
        } else {
            // dubbel
       }
    }
}


Lekker simpel! :)

  • Cartman!
  • Registratie: April 2000
  • Niet online
Totdat een client cookies heeft uitstaan/negeert. Gewoon die redirect doen dus.

  • EricBruggema
  • Registratie: Maart 2007
  • Laatst online: 17:28
Cartman! schreef op zondag 07 december 2014 @ 10:29:
Totdat een client cookies heeft uitstaan/negeert. Gewoon die redirect doen dus.
Kan, maar beter dubbel dan 1x te weinig checks ;)

  • Cartman!
  • Registratie: April 2000
  • Niet online
Iemand die je wil spammen kan t toch wel. In jouw voorbeeld mist nu de essentiele redirect die het voor een gebruiker weer mogelijk maakt "normaal" te kunnen F5-en zonder ingewikkelde vragen.

  • Saven
  • Registratie: December 2006
  • Laatst online: 09:51

Saven

Administrator

Ik deed vroeger trouwens gewoon een antiflood check (ip opslaan in database) en dan bij elke formsubmit checken of er een record in de DB staat bij dat ip. Heeft als voordeel dat je nog een "succes message" kunt geven.

Kan met die redirect ook wel, maar dan kun je alleen een statische message laten zien, die je ook weer handmatig tevoorschijn kan toveren door de url in te voeren. vind ik niet zo sjiek :P
Pagina: 1