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!
je zou het script kunnen runnen via $_server['request_method']
<? If ($_server['request_method']=="POST"){
}
?>

En dan haal je form action weg
@Johnno, jouw methode is goed maar helpt niet bij het probleem van Sure IS

@Sure Is, je moet de gegevens controleren en escapen voordat je het de databse in stopt.
Ook is het gebruik van hidden fiels om data door te geven altijd gevaarlijk. Je kunt ook sessie gebruiken.
Zo heb ik er nog nooit over nagedacht. Wat is dan inderdaad de veiligste oplossing?

@TJVB, er is toch ook een functie in je php.ini dat je kan blokkeren dat als er iets van een andere site komt, dit geblokkeerd wordt?
@Rolf, je moet je values escapen met (bij mysql) mysql_real_escape_string.
Die $username en $userpage komen ook ergens vandaan. (De manier hierboven klopt ook niet, je moet de variabelen buiten je html houden.)
Ik heb het nu zo:

$naam1 = $_POST['myname'];

if(get_magic_quotes_gpc())
{
$naam1= stripslashes($naam1);

}
if($_POST['myname']!='')
{
$naam = mysql_real_escape_string($naam1);


$sql='INSERT INTO table (naam)
VALUES
("'.$naam.'")';
}


Maar probleem nog steeds niet opgelost...
@Sure Is, [php]mysql_real_escape_string[/php] zou voldoende moeten zijn.
TJVB tvb op 20/06/2011 13:54:41

Die $username en $userpage komen ook ergens vandaan. (De manier hierboven klopt ook niet, je moet de variabelen buiten je html houden.)

Off-topic: Sorry, beetje snel geweest bij overtypen :) , maar daar zit nu het probleem niet.



[size=xsmall]Toevoeging op 20/06/2011 14:03:05:[/size]

Mebus vg op 20/06/2011 14:01:42

@Sure Is, [php]mysql_real_escape_string[/php] zou voldoende moeten zijn.

Ik heb dit geprobeerd (zie code hierboven) maar een extern script kan nog steeds de gegevens manipuleren...
Mysql_real_escape_string zorgt er toch alleen voor dat er geen mysql-injection plaats kan vinden.

Als iemand vanaf zijn eigen site een script runt voor jouw formulier, kan hij op die manier toch ook b.v. captcha omzeilen?

Rolf van der Horst op 20/06/2011 14:03:39

Als iemand vanaf zijn eigen site een script runt voor jouw formulier, kan hij op die manier toch ook b.v. captcha omzeilen?


Nee, daar wordt toch op gecontroleerd neem ik aan.
- SanThe - op 20/06/2011 14:06:30

[quote="Rolf van der Horst op 20/06/2011 14:03:39"]
Als iemand vanaf zijn eigen site een script runt voor jouw formulier, kan hij op die manier toch ook b.v. captcha omzeilen?


Nee, daar wordt toch op gecontroleerd neem ik aan.
[/quote]
Mijn script is wat ik gepost heb, dus ik denk niet dat ik hier op gecontroleerd heb... misschien is dat het probleem? Hoe doe ik dit?

Reageren