functie mysql_real_escape_string()
Ik wil mijn gastenboek beveiligen tegen database injecties.
Ik weet alleen niet zeker of ik het wel goed heb gedaan. Klopt dit zo, op de goeie plek? (ik laat een gedeelte van het script zien) Helemaal onderaan die escape functies.
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
<?php
$melding = ""; // Variabele voor foutmeldingen
$tekst = "";
$naam = "";
$emailadres = "";
$website = "";
// Formulier alleen verwerken als op de knop met de naam 'submit'
// EN de waarde 'Toevoegen' is geklikt:
if (isset($_POST['submit'])) {
if ($_POST['submit'] == "Toevoegen") {
$datum = date("Y-m-d");
$tijd = date("H:i:s");
$tekst = $_POST['t'];
$naam = $_POST['n'];
$emailadres = $_POST['e'];
$website = $_POST['w'];
// HTML-tags verwijderen uit de tekst met strip_tags() en
// pas DAARNA de tekst omzetten in HTML met htmlentities():
$tekst = strip_tags($tekst);
$tekst = addslashes($tekst);
$tekst = htmlentities($tekst);
// Het voorvoegsel "http://" verwijderen uit de URL van de website:
$website = eregi_replace("^http://", "", $website);
// Overige invoer omzetten in HTML-tekens, vooral voor
// de naam, want voor een e-mailadres of URL hoeft dat niet:
$naam = htmlentities($naam);
$emailadres = htmlentities($emailadres);
$website = htmlentities($website);
// Alleen een tekst van minimaal 4 tekens
// en maximaal 500 woorden toevoegen:
define("MINIMUMAANTAL_TEKENS", 4);
define("MAXIMUMAANTAL_WOORDEN", 500);
$aantal_tekens = strlen($tekst);
$aantal_woorden = str_word_count($tekst);
if (($aantal_tekens >= MINIMUMAANTAL_TEKENS) and ($aantal_woorden <= MAXIMUMAANTAL_WOORDEN)) {
// MySQL-toevoegquery opstellen:
$sql = "INSERT INTO `gastenboek` ";
$sql .= "(`bericht_id`, `datum`, `tijd`, `tekst`, `naam`, `email`, `website`) ";
$sql .= "VALUES ";
$sql .= "('', '$datum', '$tijd', '$tekst', '$naam', '$emailadres', '$website') ";
$sql .= "; ";
// Databaseverbinding openen en query uitvoeren:
require_once('mysql_connect.inc.php');
$verbinding = mysql_connect(MYSQL_SERVER, MYSQL_GEBRUIKERSNAAM, MYSQL_WACHTWOORD) or die(mysql_error());
mysql_select_db("*****") or die(mysql_error());
$toegevoegd = mysql_query($sql) or die(mysql_error());
mysql_close($verbinding);
// Browser omleiden naar het gastenboek
// als de bijdrage is toegevoegd:
if ($toegevoegd) {
header("Location: http://" . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . "/gastenboek.php");
exit;
}
} else {
// Foutmelding weergeven:
if (!($aantal_tekens >= MINIMUMAANTAL_TEKENS)) {
$melding .= "De tekst is te kort.";
}
if (!($aantal_woorden <= MAXIMUMAANTAL_WOORDEN)) {
$melding .= "Uw tekst telt " . $aantal_woorden . " woorden. ";
$melding .= "Kort de tekst in tot maximaal " . MAXIMUMAANTAL_WOORDEN . " woorden. ";
}
else {
$tekst = mysql_real_escape_string(nl2br($tekst));
$naam = mysql_real_escape_string($naam);
$emailadres = mysql_real_escape_string($emailadres);
$website = mysql_real_escape_string($website);
}
}
}
}
// Een eventuele foutmelding opmaken als een alinea:
if (strlen(trim($melding)) > 1) {
$melding = '<p class="w">' . $melding . "</p>\n";
}
$melding = ""; // Variabele voor foutmeldingen
$tekst = "";
$naam = "";
$emailadres = "";
$website = "";
// Formulier alleen verwerken als op de knop met de naam 'submit'
// EN de waarde 'Toevoegen' is geklikt:
if (isset($_POST['submit'])) {
if ($_POST['submit'] == "Toevoegen") {
$datum = date("Y-m-d");
$tijd = date("H:i:s");
$tekst = $_POST['t'];
$naam = $_POST['n'];
$emailadres = $_POST['e'];
$website = $_POST['w'];
// HTML-tags verwijderen uit de tekst met strip_tags() en
// pas DAARNA de tekst omzetten in HTML met htmlentities():
$tekst = strip_tags($tekst);
$tekst = addslashes($tekst);
$tekst = htmlentities($tekst);
// Het voorvoegsel "http://" verwijderen uit de URL van de website:
$website = eregi_replace("^http://", "", $website);
// Overige invoer omzetten in HTML-tekens, vooral voor
// de naam, want voor een e-mailadres of URL hoeft dat niet:
$naam = htmlentities($naam);
$emailadres = htmlentities($emailadres);
$website = htmlentities($website);
// Alleen een tekst van minimaal 4 tekens
// en maximaal 500 woorden toevoegen:
define("MINIMUMAANTAL_TEKENS", 4);
define("MAXIMUMAANTAL_WOORDEN", 500);
$aantal_tekens = strlen($tekst);
$aantal_woorden = str_word_count($tekst);
if (($aantal_tekens >= MINIMUMAANTAL_TEKENS) and ($aantal_woorden <= MAXIMUMAANTAL_WOORDEN)) {
// MySQL-toevoegquery opstellen:
$sql = "INSERT INTO `gastenboek` ";
$sql .= "(`bericht_id`, `datum`, `tijd`, `tekst`, `naam`, `email`, `website`) ";
$sql .= "VALUES ";
$sql .= "('', '$datum', '$tijd', '$tekst', '$naam', '$emailadres', '$website') ";
$sql .= "; ";
// Databaseverbinding openen en query uitvoeren:
require_once('mysql_connect.inc.php');
$verbinding = mysql_connect(MYSQL_SERVER, MYSQL_GEBRUIKERSNAAM, MYSQL_WACHTWOORD) or die(mysql_error());
mysql_select_db("*****") or die(mysql_error());
$toegevoegd = mysql_query($sql) or die(mysql_error());
mysql_close($verbinding);
// Browser omleiden naar het gastenboek
// als de bijdrage is toegevoegd:
if ($toegevoegd) {
header("Location: http://" . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . "/gastenboek.php");
exit;
}
} else {
// Foutmelding weergeven:
if (!($aantal_tekens >= MINIMUMAANTAL_TEKENS)) {
$melding .= "De tekst is te kort.";
}
if (!($aantal_woorden <= MAXIMUMAANTAL_WOORDEN)) {
$melding .= "Uw tekst telt " . $aantal_woorden . " woorden. ";
$melding .= "Kort de tekst in tot maximaal " . MAXIMUMAANTAL_WOORDEN . " woorden. ";
}
else {
$tekst = mysql_real_escape_string(nl2br($tekst));
$naam = mysql_real_escape_string($naam);
$emailadres = mysql_real_escape_string($emailadres);
$website = mysql_real_escape_string($website);
}
}
}
}
// Een eventuele foutmelding opmaken als een alinea:
if (strlen(trim($melding)) > 1) {
$melding = '<p class="w">' . $melding . "</p>\n";
}
Gewijzigd op 08/12/2010 13:58:08 door Nancy Mozer
- Checken wat de waarde van submit is heeft geen zin, aangezien die niet altijd mee gestuurd wordt.
- Datum en tijd horen in één veld in de database. Zie ook de datum en tijd functies van je database.
- Variabelen kopiëren is onzin.
- Strip_tags en htmlentities doe je pas over je data heen als je het uit de database haalt. Niet als je het erin stopt.
- NOOIT addslashes gebruiken, die vernielen je data.
- Eregi is oud. En dit kan ook met een gewone stringfunctie gedaan worden (waarom überhaupt?)
- Haakjes bij tekst lengte check zijn niet nodig. Zie ook operators, let ook op de verschillen tussen && en and.
- Backticks (`) horen niet in SQL thuis.
- SQL injections mogelijk, zie mysql_real_escape_string.
- Variabelen buiten quotes halen.
- Je zet het bericht id niet, dus die hoeft ook niet per se in de query.
- Gebruik geen die, bouw nette foutafhandeling in. Jij valt ook niet dood neer als je wat verkeerd doet.
- Toon nooit php en / of sql fouten aan de gebruiker, deze data kan misbruikt worden.
- Twee keer dezelfde check uitvoeren is niet correct. Denk logisch na. (Dit gaat over de tekst lengte.)
- Waarvoor dient de else?