Gastenboek
Ik hoor je denken, alweer een gastenboek. Ja, weer een gastenboek. Ik heb dit gastenboek gemaakt om te kijken of het goed gescript is en of iemand er iets mee kan. De beveiliging is volgens mij wel goed.
Getest op:
- XSS Injection;
- SQL Injection;
- Velden niet ingevuld;
- Spam interval
De bovenstaande dingen zijn beveiligd om ervoor te zorgen dat bezoekers geen rotzooi uithalen met je website. De gegevens worden gefilterd opgeslagen in de database, en er wordt stripslashes() en htmlspecialchars() gebruikt om ze te weergeven.
Alles werkt op 1 pagina, je zit dus niet met gedoe met meerdere pagina's.
Wijzingingen
27 maart 2009:
- Gegevens worden gefilterd de database ingezet;
- Maximaal aantal karakters toegevoegd;
- MySQL errors verwijderd, hij geeft nu niet de error zelf;
- Tekst veranderen als er op de knop gedrukt wordt.
28 maart 2009:
- Berichten pas filteren bij het ophalen (dankzij Bas Kreleger);
- Betere beveiliging voor lege velden.
3 april 2009:
- Er is nu ook een interval toegevoegd.
17 mei 2009:
- Maxlength toegevoegd bij naam;
- UBB parser toegevoegd.
5 september 2009:
- XHTML 1.1 gevalideerd;
- Alles stukken sneller gemaakt;
- Foutafhandeling ingebouwd;
- Meerdere lijnen worden nu ondersteund.
16 september 2009:
- Tekst opmaak fout opgelost;
- IP-adres wordt nu ook beveiligd;
- Alles wordt nu geregeld voordat de gebruiker wat te zien krijgt;
- Spam interval verwijderd en vervangen door een niet-waterdichte spamfilter. *
17 oktober 2009:
- Berichten sorteren gaat nu op datum.
Rate & Comment :)
* Let op: deze beveiliging is niet optimaal veilig. Een niet al te simpele spambot gaat hier gewoon doorheen.
SQL Code:
2
3
4
5
6
7
8
`id` int(11) NOT NULL auto_increment,
`naam` varchar(16) NOT NULL default '',
`bericht` text NOT NULL,
`datum` datetime NOT NULL default '0000-00-00 00:00:00',
`ip` varchar(15) NOT NULL default '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;
Code gastenboek:
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
error_reporting(E_ALL);
$host = ""; // Je host
$user = ""; // Je MySQL gebruikersnaam
$pass = ""; // Je MySQL wachtwoord
$datb = ""; // Je MySQL database
// Verbinding maken
mysql_connect($host, $user, $pass) or die ("Er is iets mis gegaan");
mysql_select_db($datb) or die ("Er is iets mis gegaan");
// UBB aanmaken
function ubb($string) {
$string = htmlspecialchars($string); // Beveiligen voor XSS injection
$string = stripslashes($string); // Slashes verwijderen
$string = nl2br($string); // Zorgen dat er meerdere regels gebruikt kunnen worden
$string = preg_replace("#\[b\](.+?)\[/b\]#is", "<b>\\1</b>", $string); // [b][/b] => <b></b>
$string = preg_replace("#\[i\](.+?)\[/i\]#is", "<i>\\1</i>", $string); // [i][/i] => <i></i>
$string = preg_replace("#\[u\](.+?)\[/u\]#is", "<u>\\1</u>", $string); // [u][/u] => <u></u>
$string = preg_replace("#\[s\](.+?)\[/s\]#is", "<s>\\1</s>", $string); // [s][/s] => <s></s>
return $string;
}
$dagen = Array("zondag", "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Gastenboek - Gemaakt door Roel</title>
</head>
<body>
<h1>Reactie plaatsen</h1>
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// Als er een veld niet ingevuld is
if (empty($_POST['naam']) || empty($_POST['bericht'])) {
echo '<span style="color:red; font-weight: bold">Je hebt niet alle velden ingevuld!</span>';
} elseif (strlen($_POST['naam']) > 16 || strlen($_POST['bericht']) > 500) {
echo '<span style="color:red; font-weight: bold">De ingevulde velden hebben te veel karakters (naam maximaal 16, bericht maximaal 500)</span>';
} elseif ($_POST['dag'] != $dagen[date('w')]) {
echo '<span style="color:red; font-weight: bold">De ingevulde dagnaam klopt niet!</span>';
} else {
// Als alle velden ingevuld zijn wordt het bericht gefilterd toegevoegd
if (mysql_query("INSERT INTO gastenboek (naam, bericht, datum, ip) VALUES ('".trim(mysql_real_escape_string($_POST['naam']))."', '".trim(mysql_real_escape_string($_POST['bericht']))."', NOW(), '".mysql_real_escape_string($_SERVER['REMOTE_ADDR'])."')")) {
echo '<span style="color:green; font-weight: bold"Je reactie is succesvol toegevoegd!</span>';
} else {
echo '<span style="color:green; font-weight: bold">Er is iets fout gegaan en je reactie is niet toegevoegd. Probeer het later opnieuw.</span>';
}
}
}
?>
<form method="post" action=""><p>
Naam: (maximaal 16 karakters)<br />
<input type="text" name="naam" maxlength="16" /><br /><br />
Welke dag is het vandaag:<br />
<input type="text" name="dag" /><br /><br />
Bericht: (maximaal 500 karakters)<br />
<textarea name="bericht" id="tekst" rows="6" cols="37"></textarea><br /><br />
<input type="submit" value="Toevoegen" onclick="this.value='Reactie wordt geplaatst...';" /> <input type="reset" value="Herstel" />
</p></form>
<hr />
<p>
<?php
// Gegevens ophalen uit de database en sorteren op id
$sql = mysql_query("SELECT * FROM gastenboek ORDER BY datum DESC");
if (mysql_num_rows($sql) == 0) {
// Als er nog geen reacties geplaatst zijn
echo 'We hebben nog geen reacties!';
} else {
while($data = mysql_fetch_assoc($sql)) {
// Als er wel reacties zijn geplaatst worden deze nu weergegeven
echo '<b>Naam:</b> '.htmlspecialchars(stripslashes($data['naam'])).'<br />
<b>Datum:</b> '.htmlspecialchars(stripslashes($data['datum'])).'<br />
<b>Bericht:</b><br />'.ubb($data['bericht']).'<br /><br />';
}
}
?>
</p>
</body>
</html>
Gesponsorde koppelingen
PHP script bestanden
Er zijn 40 reacties op 'Gastenboek'
Om te reageren heb je een account nodig en je moet ingelogd zijn.
PHP hulp
0 seconden vanaf nu