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.
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?
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.
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.