Hallo iedereen!
Ik gebruik in mijn script vaak $_POST['...'] om dingen van form in de database op te slaan.
Nu besef ik net dat, als iemand een eigen php-script maakt met daarop een form, hij de gegevens kan manipuleren.

Een voorbeeld:

Mijn code: add.php

<?php $sql="INSERT INTO table (naam, plaats)
VALUES
('$_POST[myname]','$_POST[myplace]')"; ?>
<form action="add.php" method="post">
<input type="hidden" name="myname" value=$usernaam>
<input type="hidden" name="myplace" value=$userplaats>
<input type="submit" value="Bewaar"></form>


Op het eerste zicht heeft de gebruiker geen optie om zelf de waarde van de naam en plaats te bepalen.
Maar als hij zelf een script runt, bv. dit:

<form action="http://www.mijnwebsite.com/add.php"; method="post">
<input type="hidden" name="myname" value="fake naam">
<input type="hidden" name="myplace" value="fake plaats">
<input type="submit" value="Bewaar"></form>


Dan zal mijn script daar niks mis zien, en die valse waarden in de table zetten. Dat mag natuurlijk niet!

Mijn vraag: hoe kan ik dit oplossen? Is $_POST['...'] een slechte manier om gegevens in een database te zetten?

Bedankt!
Gerhard l op 02/07/2011 18:02:18

Maar wat is je probleem? Je controleert je input toch nadat een formulier gepost is, dus uiteindelijk maakt het niet uit of ze van een andere site komen.

Hoe bedoel je, je controleert je input toch nadat een formulier gepost is?
Wat bedoel je met controleren? Kan je een voorbeeld geven?
Je kunt sowieso controleren op refererer. Als die niet leeg is en ongelijk aan jouw website, dan kunnen ze wel posten maar dan doe je niks met het resultaat.

Verder zou je een code kunnen inbouwen, bijv. een random nummer, die je in je sessie opslaat. Die code stuur je mee in het formulier en daar controleer je dan telkens op. Iemand die van buitenaf jouw formulier aanroept weet op voorhand niet wat de code is dus dat maakt het al moeilijker. Die code kun je dan ook nog laten wisselen zodra je de pagina ververst.
Referer is gewoon een header, en kun je niet op vertrouwen.
Het is wel een extra beveiliging, in het geval de referer ongelijk is aan jouw website.
Niet alle browsers sturen een referer mee, en zo zou je mogelijk gebruikers kunnen uitsluiten.
Ik zie het punt niet. Wat maakt het uit of mensen van mijn site een post maken bij jou? Als je dit zou blokkeren, zijn er echt nog andere mogelijkheden, zoals de referer wijzigen, of via bv. firefox addons toch de hidden-fields schrijfbaar te maken. Er zijn ontelbaar mogelijkheden om toch met je gegevens te knoeien en daarom is het dus altijd zaak om alle variabelen die van buitenaf komen te controleren.

Met controleren bedoelen we toetsen op juistheid. Zo verwacht je bij een naam veld, meer dan 0 karakters. De captcha verwacht je dat deze is ingevuld en dat deze dezelfde waarde heeft als de originele captcha.
Bij gevoelige data kun je idd beter sessions gebruiken, want dan houd je de data op je server, maar identificeer je deze wel met een gebruiker.

Captcha voorbeeld:


<?php
if (!isset($_SESSION['encrypted_captcha']) || !isset($_POST['captcha']) || md5($_POST['captcha']) !== $_SESSION['encrypted_captcha'])
{
// error, captcha is niet correct of aangemaakt.
}
?>
Jacco Brandt op 17/08/2011 12:36:36

Niet alle browsers sturen een referer mee, en zo zou je mogelijk gebruikers kunnen uitsluiten.

Lees mijn eerste post:

"Je kunt sowieso controleren op refererer. Als die niet leeg is en ongelijk aan jouw website, dan kunnen ze wel posten maar dan doe je niks met het resultaat."
Ozzie PHP op 17/08/2011 13:24:19

Lees mijn eerste post:

"Je kunt sowieso controleren op refererer. Als die niet leeg is en ongelijk aan jouw website, dan kunnen ze wel posten maar dan doe je niks met het resultaat."


In dat geval heb ik niets gezegd.
vooruit dan ;-)

Reageren