Veilige code
Ik ben bezig met een website, waarbij de bezoeker een vragenlijst in moet vullen. Aan de hand van de antwoorden in deze vragenlijst worden ze doorgestuurd naar een resultaat. Tussen de vragenlijst en het resultaat heb ik een pagina gemaakt, die de ingevulde gegevens in de database verwerkt en daarna kijkt welke antwoord ze op een vraag hebben gegeven, om de bezoeker zo naar de goede uitslag door te verwijzen.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<?php
if (isset($_POST['submit'])) {
$voornaam = $_POST["voornaam"];
$achternaam = $_POST["achternaam"];
$geboortedatum = $_POST["geboortedatum"];
$email = $_POST["email"];
$woonplaats = $_POST["woonplaats"];
$telefoon = $_POST["telefoon"];
$vestiging = $_POST["vestiging"];
$datum = date ('d-m-Y');
$interesse =$_POST["interesse"];
$smaak = $_SESSION['vraag'];
$voorwaarden = $_POST["voorwaarden"];
$query ="INSERT INTO klanten (voornaam, achternaam, geboortedatum, email, woonplaats, telefoon, vestiging, interesse, datum, smaak, voorwaarden)";
$query.="VALUES ('";
$query.= mysql_real_escape_string ($voornaam) ."','";
$query.= mysql_real_escape_string ($achternaam) ."','";
$query.= mysql_real_escape_string ($geboortedatum) ."','";
$query.= mysql_real_escape_string ($email) ."','";
$query.= mysql_real_escape_string ($woonplaats) ."','";
$query.= mysql_real_escape_string ($telefoon) ."','";
$query.= mysql_real_escape_string ($vestiging) ."','";
$query.= mysql_real_escape_string ($interesse) ."','";
$query.= mysql_real_escape_string ($datum)."','";
$query.= mysql_real_escape_string ($smaak)."','";
$query.= mysql_real_escape_string ($voorwaarden) ."');";
$result = mysql_query($query) or die ("FOUT: " .mysql_error());
}
$antwoord_vraag1 = $_SESSION['vraag'];
if (isset($_POST["submit"])){
if($antwoord_vraag1 == 1){
header ("location:uitslag_1.php");
}
if($antwoord_vraag1 == 2){
header ("location:uitslag_2.php");
}
if($antwoord_vraag1 == 3){
header ("location:uitslag_3.php");
}
if($antwoord_vraag1 == 4){
header ("location:uitslag_4.php");
}
}//}
?>
if (isset($_POST['submit'])) {
$voornaam = $_POST["voornaam"];
$achternaam = $_POST["achternaam"];
$geboortedatum = $_POST["geboortedatum"];
$email = $_POST["email"];
$woonplaats = $_POST["woonplaats"];
$telefoon = $_POST["telefoon"];
$vestiging = $_POST["vestiging"];
$datum = date ('d-m-Y');
$interesse =$_POST["interesse"];
$smaak = $_SESSION['vraag'];
$voorwaarden = $_POST["voorwaarden"];
$query ="INSERT INTO klanten (voornaam, achternaam, geboortedatum, email, woonplaats, telefoon, vestiging, interesse, datum, smaak, voorwaarden)";
$query.="VALUES ('";
$query.= mysql_real_escape_string ($voornaam) ."','";
$query.= mysql_real_escape_string ($achternaam) ."','";
$query.= mysql_real_escape_string ($geboortedatum) ."','";
$query.= mysql_real_escape_string ($email) ."','";
$query.= mysql_real_escape_string ($woonplaats) ."','";
$query.= mysql_real_escape_string ($telefoon) ."','";
$query.= mysql_real_escape_string ($vestiging) ."','";
$query.= mysql_real_escape_string ($interesse) ."','";
$query.= mysql_real_escape_string ($datum)."','";
$query.= mysql_real_escape_string ($smaak)."','";
$query.= mysql_real_escape_string ($voorwaarden) ."');";
$result = mysql_query($query) or die ("FOUT: " .mysql_error());
}
$antwoord_vraag1 = $_SESSION['vraag'];
if (isset($_POST["submit"])){
if($antwoord_vraag1 == 1){
header ("location:uitslag_1.php");
}
if($antwoord_vraag1 == 2){
header ("location:uitslag_2.php");
}
if($antwoord_vraag1 == 3){
header ("location:uitslag_3.php");
}
if($antwoord_vraag1 == 4){
header ("location:uitslag_4.php");
}
}//}
?>
Op de uitslag pagina, begin ik met een script die een mail met bijlage verstuurd, zodat ze de uitslag ook via e-mail in pdf formaat binnen krijgen. Daarna wordt de website weer gegeven. Refresh je de pagina, dan wordt je doorgestuurd naar de index, om ze geen dubbele mails te versturen als je op f5 drukt:)
Mijn vraag is, of de code hierboven op een veilige manier is geschreven, om database injecties en spam tegen te gaan. Ik maak gebruik van PHPMailer om de mails te versturen.
Bedankt alvast!
grt.
Quote:
Refresh je de pagina, dan wordt je doorgestuurd naar de index, om ze geen dubbele mails te versturen als je op f5 drukt:)
Hoe heb je dit geregeld?
Denk eraan altijd exit() te gebruiken na een redirect.
Zie de code hieronder:
Je kan dan nog steeds geautomatiseerd spammen, maar de spammer moet dan alleen gewoon steeds eerst het formulier opvragen, zodat de sessie variabele wordt gevuld en dan het formulier verzenden... Een captcha is misschien beter.
Ik dacht hiermee namelijk het probleem te hebben opgelost, omdat ze bij een Refresh terug worden gestuurd naar de eerste pagina.. Om de email dus weer te versturen, dien je eerst heel de test weer te doorlopen, je gegevens invullen en op submit drukken..
Edit: Het is zo te zien mogelijk om helemaal niks in te vullen. Dan wordt het alsnog in de database gezet.
Gewijzigd op 16/08/2011 13:55:31 door - SanThe -
Voor de geboortedatum wordt alleen het jaartal gevraagd. Deze kan je selecteren uit een selectbox. Daarnaast vindt er via een Jquery-script een validatie plaats, waarbij wordt gecontroleerd op juiste telefoonnummer, juist e-mail adres etc etc.. Pas als dit goed is ga je naar bovenstaande pagina, die alles verwerkt.
Ik ben daarom van mening dat ik dit niet nomaals hoef te controleren op deze pagina. Omdat men met onjuiste gegevens deze pagina niet kan bereiken. En er dus ook geen onjuiste gegevens in de database kan komen.
Is de code verder wel database-injection veilig?
Uw code is wel goed beschermt tegen SQL-Injectie.
Net getest door mijn javascript uit te zetten, maar inderdaad.. Men komt dan gewoon op de pagina met onjuiste gegevens...
Wordt het toch nog een validatie schrijven in php, even uitzoeken hoe ik dit het beste kan doen.. bedankt voor de tip!
Waarom maak je op regel 4 t/m variabelen aan?
Je kunt die stap overslaan en direct in de query met $_POST werken.
Waarom geen nette foutafhandeling als de query niet lukt?
Waarom $submit = $_SESSION['submit']; ?
Je code is, zoals Jacco Brandt aangeeft op zich beschermt, maar netjes is het nog niet.