Ik stuurde een $_POST van een formulier altijd naar dezelfde pagina en dan ving ik het bovenaan mijn script af.
Alleen doordat je dan dubbele posts kan krijgen door per ongeluk de pagina te verversen wil ik nu mijn formulier waardes doorsturen naar login2.php en dan laten inloggen.

Alleen hoe weet ik dat die gene van mijn loginpagina komt? Is het slim om een hidden $_POST mee te sturen? Maar dat kan weer onderschept worden lees ik?
Hoe pakken jullie dat aan?
Maak een sessie aan op de plek van je formulier, met een md5() hash. En plaats deze ook in een hidden-field.
Controleer op de vervolgpagina of deze overeenkomen. Zo niet, dan is er sprake van een 'CSRF-attack', waarbij iemand de pagina oproept via een illegale manier dan er verwacht wordt.
Wat Aar zegt (token) + dit.

Stel je hebt form.php

Deze post je naar process.php

succes? > success.php
fail? > form.php?errors=1

Dit zou je ook kunnen reduceren tot één script als je deze netjes in acties opdeelt:

form.php (default actie, toon formulier eventueel met fouten/hints/eerdere invoer als ?errors=1)
form.php?action=process (verwerk-actie)
form.php?action=complete (boodschap tonen na verwerken, of je stuurt iemand gelijk ergens anders naartoe en toon je nog ergens dat alles is opgeslagen met een sessie-flash-message ofzo)
Bedankt, ik zal die sessie aanmaken en verifiëren.
Wat wel jammer is dat ik gebruikers meldingen zoals "geen gebruikersnaam ingevuld" niet automatisch kan checken.
Ik moet dit terug sturen met een GET is dat niet wat slordig?
Dat kan je afvangen met HTML5. het required atribute kan je toevoegen aan je input.
dan werkt de submit knop niet zolang dat veld niet is ingevuld.


Je kan prima dergelijke validaties voor gebruikersnamen toevoegen. Je zou dit met Javascript kunnen doen (jQuery validator), via HTML5 wat ietwat beperkt is, en zelfs via AJAX als je interactie moet leggen met je database of een waarde al bestaat.

Zog altijd voor:
Client-side controles, en bij voorkeur met HTML5, dan met JavaScript en dan nog eens serverside.
Ik weet dat dit via andere talen netter afgevangen kan worden. Ik zelf gebruik altijd JQUERY voor dit soort dingen maar als onderlaag doe ik het altijd eerst via PHP mocht iemand javascript uit hebben staan of de library is op een of andere manier onbereikbaar.

Ik zal dus de GET gebruiken voor PHP maar eerst met JQUERY het veld op laten lichten.
Mij lijkt het makkelijkste om op één pagina het formulier te hebben en op die pagina ook de verwerking van het formulier. Is er iets fout, laat je foutmeldingen zien op die pagina (met het formulier nog ingevuld). Is alles goed, DAN PAS stuur je de bezoeker door naar een andere pagina.

Alleen doordat je dan dubbele posts kan krijgen door per ongeluk de pagina te verversen

Daar zit eigenlijk je probleem, niet in het doorsturen naar een andere pagina.

Dus als je dat afvangt, is het opgelost.

[code]<?php

if($_SERVER['REQUEST_METHOD'] == 'POST'){

// foutcontrole


if(geen fouten){

// verwerking formulier

header('Location: /nieuwepagina');
exit;
}



}
Dat is ook wel slim Ramon, bedankt.
Klopt, zo vernietig je de POST-request na het correct versturen, maar het voorkomt niet dat anderen de pagina alsnog op een externe wijze kunnen aanroepen.

Reageren