hallo iedereen, kan iemand dit form beveiligen tegen sql injection?


bedankt


<?php



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

// process form
$db = mysql_connect("localhost", "user", "pswrd");
mysql_select_db("databse",$db);

$sql = "INSERT INTO vragenlijst (voornaam,familienaam,geslacht,geboortedatum,straat,nr,postcode,gemeente,voornaammoeder,familienaammoeder,voornaamvader,familienaamvader,voornaampartner,familienaampartner,telefoonprive,gsm,emailprive,telefoonwerk,emailwerk) VALUES ('$voornaam','$familienaam','$geslacht','$geboortedatum','$straat','$nr','$postcode', '$gemeente','$voornaammoeder','$familienaammoeder','$voornaamvader','$familienaamvader','$voornaampartner','$familienaampartner','$telefoonprive','$gsm','$emailprive','$telefoonwerk','$emailwerk')";

$result = mysql_query($sql);

echo "Bedankt voor de gegevens in te vullen, klik op index om terug naar de hoofdpagina te gaan.\n";

} else{



// display form



?>


<table>
<tr>
<td colspan="2" class="style1">

Beste familieleden,<br/><br/>


Hier dus onze vragenlijst. Zoals je ziet verzamelen we de personalia van alle leden van onze familie.<br/>
Graag zouden we hebben dat per tante, nonkel, nicht, kozijn, kind, kleinkind &#233;&#233;n zo&rsquo;n formulier wordt ingevuld.<br/>
We willen immers op termijn ook een stamboom met foto&rsquo;s maken.<br/><br/>

Velden die niet van toepassing zijn of die je niet wil invullen laat je gewoon blanco.<br/>
Als iedereen meewerkt hebben we meteen een hele recente adressenlijst van de familie die altijd actueel kan gehouden worden.<br/><br/>

Dank u <br/><br/><br/><br/>
</td>


</tr>
<tr>
<form method="post" action="">

<td class="style1">Voornaam:</td><td><input type="Text" name="voornaam"><br></td></tr>

<tr><td class="style1">Familienaam:</td><td width="40%"><input type="Text" name="familienaam"><br></td></tr>

<tr><td class="style1">Geslacht:</td><td width="40%"><input type="Text" name="geslacht"><br></td></tr>

<tr><td class="style1"> Geboortedatum:</td><td width="40%"><input type="Text" name="geboortedatum"><br></td></tr>

<tr><td class="style1"> Straat:</td><td width="40%"><input type="Text" name="straat"><br></td></tr>

<tr><td class="style1"> Nr:</td><td width="40%"><input type="Text" name="nr"><br></td></tr>

<tr><td class="style1"> Postcode:</td><td width="40%"><input type="Text" name="postcode"><br></td></tr>

<tr><td class="style1"> Gemeente:</td><td width="40%"><input type="Text" name="gemeente"><br></td></tr>

<tr><td class="style1"> Voornaam moeder:</td><td width="40%"><input type="Text" name="voornaammoeder"><br></td></tr>

<tr><td class="style1"> Familienaam moeder:</td><td width="40%"><input type="Text" name="familienaammoeder"><br></td></tr>

<tr><td class="style1"> Voornaam vader:</td><td width="40%"><input type="Text" name="voornaamvader"><br></td></tr>

<tr><td class="style1"> Familienaam vader:</td><td width="40%"><input type="Text" name="familienaamvader"><br></td></tr>

<tr><td class="style1"> Voornaam partner:</td><td width="40%"><input type="Text" name="voornaampartner"><br></td></tr>

<tr><td class="style1"> Familienaam partner:</td><td width="40%"><input type="Text" name="familienaampartner"><br></td></tr>

<tr><td class="style1"> Telefoon prive:</td><td width="40%"><input type="Text" name="telefoonprive"><br></td></tr>

<tr><td class="style1"> Gsm nummer:</td><td width="40%"><input type="Text" name="gsm"><br></td></tr>

<tr><td class="style1"> Email prive:</td><td width="40%"><input type="Text" name="emailprive"><br></td></tr>

<tr><td class="style1"> Telefoon werk:</td><td width="40%"><input type="Text" name="telefoonwerk"><br></td></tr>

<tr><td class="style1"> Email werk:</td><td width="40%"><input type="Text" name="emailwerk"><br></td></tr>

</table>



<input type="Submit" name="submit" value="Verzend">

</form>



<?php



} // end if



?>
Een formulier kun je niet beveiligen (iedereen kan deze aanpassen in zijn browser), de input die jij op de server ontvangt, kun je wel beveiligen. Lees het volgende artikel eens en ga er mee aan de slag: http://www.phphulp.nl/php/tutorials/3/244/

En begin je script met
<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);

// rest van je script
?>
Ik include meestal dit bestand bovenin pagina's die formulierinfo moeten verwerken:
<?php
// bescherming tegen mysql injection
function quote_smart($value)
{
if (get_magic_quotes_gpc()) {
$value = stripslashes($value);
}
if (version_compare(phpversion(), "4.3.0") == "-1") {
return mysql_escape_string($value);
} else {
return mysql_real_escape_string($value);
}
}

function check_array(&$array)
{
foreach ($array as $key => $value) {
$value = quote_smart($value);
$array[$key] = $value;
}
}

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
check_array($_POST);
}
if ($_SERVER['REQUEST_METHOD'] == 'GET') {
check_array($_GET);
}
?>
@ Jan, als ik nou bijv een pagina heb met:
Jou bericht:
$_GET['bericht']

dan is dit bericht gelijk 'veilig'?

Wel erg handig dan en scheelt een heleboel typ werk!
Probeer het zelf eens uit, zet eens een ' of / in de url (?bericht=23' ) en kijk wat het resultaat is.

Dit is een redelijk eenvoudig, maar zeer doeltreffend stuk script, maar je kunt nooit zomaar een script van een ander vertrouwen. Iedereen kan fouten maken, ook Jan.

Maar het is een fraai stukje code, kun je niets van zeggen! Tot het tegendeel is bewezen...
dat is waar ;) Maar alles $_GET['iets'] maak ik altijd htmlspecialchars($_GET['iets']) van.. met dit script zou dat dus niet nodig zijn?

edit: bij mij doet ie het trouwens niet. Ik krijg het volgende:

Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'ODBC'@'localhost' (using password: NO) in C:\AppServ\www\test.php on line 11

Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in C:\AppServ\www\test.php on line 11
htmlspecialchars() converteert &, <, >, ' en " naar hun html-entiteiten. Dat wil je zelden of nooit in je database hebben, deze dat is niet bruikbaar voor een ander medium. Of wil jij graag &amp; in je bijvoorbeeld je pdf-jes hebben waar een & hoort te staan? Ik niet.

htmlspecialchars() heb je dus niets aan.
Ik zet het niet met htmlspecialchars in de db, maar haal het er zo uit. Maar goed. Wat kan ik daarvoor beter gebruiken dan? Want ik wil niet alleen Mysql injection tegen gaan, maar ook dat je geen scripts kunt uitvoeren.

url: iets=<script>alert("hehe");</script>

echo $_GET['iets'];

moet dus zowieso niet werken, en dit heb ik dus met htmlspecialchars nu wel voorkomen.
hm, apparte functie. Hij stript dus letterlijk alle tags.

<?php
$string = strip_tags($_GET['iets']);
echo $string;
?>
Url: iets=<script>alert("test");</script>
Echo: alert(\"test\");
Url daarna: iets=%3Cscript%3Ealert(%22test%22);%3C/script%3E

Dit betekent ook dat als je dit voor het forum en gb enzo gebruikt dat je niet eens een stukje code kan laten zien zoals op dit forum. Ook wel weer lastig, maar wel veilig natuurlijk. Ik denk dat ik dit zowieso voor titels en andere kleine input velden gebruik maar voor bericht niet echt handig.

Reageren