login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Formulier hervullen (Opgelost)

Offline DenMette - 22/07/2014 14:21
Avatar van DenMettePHP gevorderde Dag

Hoe kan ik op een veilige manier mijn formulier opnieuw invullen? Wanneer een gebruiker toch een veld zou vergeten zijn?

Alvast bedankt

6 antwoorden

Gesponsorde links
Offline Thomas - 22/07/2014 14:38 (laatste wijziging 22/07/2014 15:26)
Avatar van Thomas Moderator Dit hangt van een aantal zaken af:

1. De navigatie door je formulier-pagina('s)
Dit bepaalt mede hoe je informatie bewaart en overdraagt. Als je bijvoorbeeld een script formulier.php naar zichzelf laat POSTen, zou je ook meteen het formulier weer kunnen vullen indien er een fout is opgetreden. Dit heeft het voordeel dat je dat direct kunt doen via $_POST (met de nodige escaping uiteraard, zie hieronder). Een nadeel is dat als iemand de pagina dan probeert te verversen je een (lelijk) bericht krijgt met de vraag of je de informatie opnieuw wilt versturen.
Een alternatief is dat je je formulier-functionaliteit meer uit elkaar trekt. Je stopt het (vullen en) afdrukken en het verwerken in aparte acties. Voordeel is meer overzicht door het scheiden van deze acties. Een mogelijk nadeel is dat je je POST informatie na het verwerken in principe kwijt bent. Als er dan een fout is opgetreden, dan moet je er op een of andere manier voor zorgen dat je deze onthoudt, bijvoorbeeld door deze informatie tijdelijk in een sessie te zetten.

2. De character encoding die je gebruikt
Je kunt een formulier "veilig" initialiseren met gebruikersdata door het escapen van deze uitvoer. Dit doe je doorgaans met htmlspecialchars(). Maar hierbij moet je wel aangeven welke character encoding je document gebruikt, anders werkt je escaping mogelijk niet goed. Het is sowieso een goede zaak om overal dezelfde character encoding te gebruiken, en als het kan bij voorkeur UTF-8.

EDIT: Daarnaast zou je ook met de volgende zaken rekening moeten houden:

Input filtering
Bij het verwerken van je formulier zou je ook je invoer moeten valideren voordat je deze opslaat / verder verwerkt. Hiervoor kun je de filter_ functies van PHP gebruiken.

Output escaping
Dit geldt voor informatie die je opnieuw afdrukt omdat deze onvolledig of fout is, maar dit zou je ook moeten doen als je deze uit je database haalt. Enkel omdat informatie was gevalideerd voor het opslaan wil niet zeggen dat deze informatie veilig is om af te drukken! Eigenlijk zou je ALTIJD output moeten escapen, tenzij je een special reden hebt om dit niet te doen.

Gebruik tokens
Als je van formulieren gebruik maakt kan het ook verstandig zijn om van tokens gebruik te maken. Dit voorkomt dat iemand (eenvoudig) vanaf een externe site data kan POSTen (dit wordt ook wel Cross Site Request Forgery (CSRF) genoemd). Het principe is simpel: bij het laden van het formulier genereer je een random string (het token). Deze geef je enerzijds mee via een hidden veld, en anderzijds via een sessie-variabele. Wanneer je het formulier verwerkt vergelijk je deze twee waarden. Indien deze hetzelfde zijn zet je de verwerking voort, anders breek je deze af. Het token in de sessie moet na de controle ook meteen ongeldig gemaakt worden (is dus slechts voor één submit geldig).

addslashes en magic_quotes_gpc (met name in combinatie met database-gebruik)
Vertrouw hier niet op (magic_quotes_gpc is deprecated in PHP 5.3.0 en is verdwenen in 5.4.0) en als je hier nog (onbewust) gebruik van maakt (controleer dit met phpinfo()) dan ooooh boy, dan heb je misschien nog wat opschoonwerk te doen voordat je PHP-versie geupgrade wordt en je applicaties veranderen in een gatenkaas . Zie ook mijn MySQLi tutorial.

Als je een voorbeeld wilt waarbij deze principes worden toegepast hoor ik het wel.
Bedankt door: DenMette
Offline Wijnand - 22/07/2014 16:37
Avatar van Wijnand Moderator 1. 'gewoon' de $_POST['fieldname'] echoën op deze manier: <?php echo (!empty($_POST['fieldname'])?$_POST['fieldname']:false);?>

2. Eerst de gegevens in een sessie zetten (nadat je ze gefilterd hebt (zie hierboven het bericht van FangorN)), dan deze op dezelfde manier als optie 1 weergeven: <?php echo (!empty($_SESSION['fieldname'])?$_SESSION['fieldname']:false);?>
Offline Thomas - 22/07/2014 16:42 (laatste wijziging 22/07/2014 16:54)
Avatar van Thomas Moderator NEEEEEEEEEEEEEEEEEEEEE :O

DenMette heeft het over informatie terugplaatsen in een formulier. Wat nu als je $_POST data een dubbele quote bevat? Dan is je formulier aan gort.

Sterker nog, wat als er JavaScript in zit? Die je document.cookie ergens naartoe stuurt via een AJAX request?
Ab. So. Luut. Niet. Veilig.

Los daarvan, je moet uitvoer te allen tijde escapen (niet alleen in formulieren), tenzij je een speciale reden hebt om dit niet te doen. Bijvoorbeeld als je data bestaat uit HTML en je het ook als HTML wilt afdrukken.

EDIT: En als je deze HTML dan wilt bewerken, zul je deze moeten escapen lol.

EDIT: Ook: tussentijds informatie filteren lijkt me niet handig, het lijkt mij dat je de informatie teruggeeft aan de gebruiker zoals deze is aangeleverd, onafhankelijk van of deze nu goed is of niet. De formulier-informatie in je sessie zul je wel een aparte plaats moeten geven, zodat je weet dat dat "rauwe" gebruikersdata is. Voordat je zaken opslaat zal de validatie wel gepasseerd moeten worden ja...
Offline DenMette - 22/07/2014 20:01
Avatar van DenMette PHP gevorderde Dankjewel, ik zal starten met htmlspecialchars, maar wat is het verschil met htmlentities?
Offline Thomas - 22/07/2014 20:16 (laatste wijziging 22/07/2014 21:30)
Avatar van Thomas Moderator Use the Google Luke! > htmlentities() vs. htmlspecialchars().

TL;DR gebruik htmlspecialchars(). Vooral indien je UTF-8 gebruikt.

EDIT: Zorg ook vooral dat overal je character sets hetzelfde zijn... anders krijg je encoderingsproblemen zoals in dit topic. Weliswaar enigszins gedateerd maar nog steeds actueel. De "oplossing" hier is waarschijnlijk niet de goede oplossing maar symptoombestrijding. Het lost het (waarschijnlijke) onderliggende probleem (data is met een verkeerde encodering opgeslagen in de database) niet op.
Offline NielsFF - 29/07/2014 14:22
Avatar van NielsFF Nieuw lid FangorN bedankt voor je reactie, had serieus precies dezelfde vraag.

Ik had al een keer hier gekeken:http://stackove...-incorrect maar kwam er helaas niet uit.

Het lukt me nu wel. Dank daarvoor!
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.167s