htmlentities en str_replace
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
<?php
//Vervang tekens door smileys
$tekens = array(
'(B)',
'(b)',
':-)',
':)',
':$',
'(D)',
'(d)',
'(H)',
'(h)',
'(danny)',
'(y)',
'(Y)',
'(a)',
'(A)',
'(env)',
'(l)',
'(L)',
'(liefde)',
'(ilse)',
';-)',
';)',
'(k)',
'(K)',
'(r)',
'(R)',
':p',
':P',
':-p',
':-P',
'(verliefd)',
'xD',
);
$smilies = array(
'<img src="images/emoticons/bier.png">',
'<img src="images/emoticons/bier.png">',
'<img src="images/emoticons/blij.png">',
'<img src="images/emoticons/blij.png">',
'<img src="images/emoticons/bloos.png">',
'<img src="images/emoticons/cocktail.png">',
'<img src="images/emoticons/cocktail.png">',
'<img src="images/emoticons/cool.png">',
'<img src="images/emoticons/cool.png">',
'<img src="images/emoticons/danny.png">',
'<img src="images/emoticons/duim.png">',
'<img src="images/emoticons/duim.png">',
'<img src="images/emoticons/engel.png">',
'<img src="images/emoticons/engel.png">',
'<img src="images/emoticons/enveloppe.png">',
'<img src="images/emoticons/hart.png">',
'<img src="images/emoticons/hart.png">',
'<img src="images/emoticons/hartje.png">',
'<img src="images/emoticons/ilse.png">',
'<img src="images/emoticons/knipoog.png">',
'<img src="images/emoticons/knipoog.png">',
'<img src="images/emoticons/kus.png">',
'<img src="images/emoticons/kus.png">',
'<img src="images/emoticons/ring.png">',
'<img src="images/emoticons/ring.png">',
'<img src="images/emoticons/tong.png">',
'<img src="images/emoticons/tong.png">',
'<img src="images/emoticons/tong.png">',
'<img src="images/emoticons/tong.png">',
'<img src="images/emoticons/verliefd.png">',
'<img src="images/emoticons/xD.png">',
);
$replacebericht = str_replace($tekens,$smilies,$_POST['bericht']);
if(!empty($_POST['naam']))
{
if(!empty($_POST['bericht']))
{
include_once $_SERVER['DOCUMENT_ROOT'] . '/securimage/securimage.php';
$securimage = new Securimage();
if ($securimage->check($_POST['captcha_code']) == false) {
$b = "<font color='#e50a1f'>De code komt niet overeen met de afbeelding.</font>";
} else {
mysqli_query($con,"INSERT INTO gastenboek (naam,bericht,datum,tijd,ipadres) VALUES ('".htmlentities($_POST['naam'])."','".htmlentities($replacebericht)."','".date("Y-m-d")."','".date("H:i:s")."','".$_SERVER['REMOTE_ADDR']."')");
// remove all session variables
session_unset();
// destroy the session
session_destroy();
}
}
else
{
$a = "<font color='#e50a1f'>U heeft nog geen bericht ingevuld.</font>";
}
}
else
{
$a = "<font color='#e50a1f'>U heeft nog geen naam ingevuld.</font>";
}
}
?>
//Vervang tekens door smileys
$tekens = array(
'(B)',
'(b)',
':-)',
':)',
':$',
'(D)',
'(d)',
'(H)',
'(h)',
'(danny)',
'(y)',
'(Y)',
'(a)',
'(A)',
'(env)',
'(l)',
'(L)',
'(liefde)',
'(ilse)',
';-)',
';)',
'(k)',
'(K)',
'(r)',
'(R)',
':p',
':P',
':-p',
':-P',
'(verliefd)',
'xD',
);
$smilies = array(
'<img src="images/emoticons/bier.png">',
'<img src="images/emoticons/bier.png">',
'<img src="images/emoticons/blij.png">',
'<img src="images/emoticons/blij.png">',
'<img src="images/emoticons/bloos.png">',
'<img src="images/emoticons/cocktail.png">',
'<img src="images/emoticons/cocktail.png">',
'<img src="images/emoticons/cool.png">',
'<img src="images/emoticons/cool.png">',
'<img src="images/emoticons/danny.png">',
'<img src="images/emoticons/duim.png">',
'<img src="images/emoticons/duim.png">',
'<img src="images/emoticons/engel.png">',
'<img src="images/emoticons/engel.png">',
'<img src="images/emoticons/enveloppe.png">',
'<img src="images/emoticons/hart.png">',
'<img src="images/emoticons/hart.png">',
'<img src="images/emoticons/hartje.png">',
'<img src="images/emoticons/ilse.png">',
'<img src="images/emoticons/knipoog.png">',
'<img src="images/emoticons/knipoog.png">',
'<img src="images/emoticons/kus.png">',
'<img src="images/emoticons/kus.png">',
'<img src="images/emoticons/ring.png">',
'<img src="images/emoticons/ring.png">',
'<img src="images/emoticons/tong.png">',
'<img src="images/emoticons/tong.png">',
'<img src="images/emoticons/tong.png">',
'<img src="images/emoticons/tong.png">',
'<img src="images/emoticons/verliefd.png">',
'<img src="images/emoticons/xD.png">',
);
$replacebericht = str_replace($tekens,$smilies,$_POST['bericht']);
if(!empty($_POST['naam']))
{
if(!empty($_POST['bericht']))
{
include_once $_SERVER['DOCUMENT_ROOT'] . '/securimage/securimage.php';
$securimage = new Securimage();
if ($securimage->check($_POST['captcha_code']) == false) {
$b = "<font color='#e50a1f'>De code komt niet overeen met de afbeelding.</font>";
} else {
mysqli_query($con,"INSERT INTO gastenboek (naam,bericht,datum,tijd,ipadres) VALUES ('".htmlentities($_POST['naam'])."','".htmlentities($replacebericht)."','".date("Y-m-d")."','".date("H:i:s")."','".$_SERVER['REMOTE_ADDR']."')");
// remove all session variables
session_unset();
// destroy the session
session_destroy();
}
}
else
{
$a = "<font color='#e50a1f'>U heeft nog geen bericht ingevuld.</font>";
}
}
else
{
$a = "<font color='#e50a1f'>U heeft nog geen naam ingevuld.</font>";
}
}
?>
Zet de input gewoon direct in de database beveiligd met mysqli_real_escape_string().
Bij het tonen van de tekst doe je dit:
echo str_replace($tekens,$smilies,htmlentities($tekst_uit_database));
Waarom niet gewoon de tekens ( zoals :-) ) in de database zetten en pas vervangen voor image tags net voordat de inhoud op het scherm getoond wordt? Wil iemand (of jij) een bericht wijzigen dan krijg je tenminste ook het origineel weer voor je neus zonder image tags :-)
_real_escape_string() functies zijn voor het escapen van DATA delen zodat deze niet als SQL geinterpreteerd kunnen worden.
Wat Frank zegt, escape de tekst bij afdrukken (met htmlentities of wellicht beter htmlspecialchars()) en escape de query met _real_escape_string().
En om je probleem op te lossen bij het afdrukken: pas eerst htmlspecialchars() toe (alle code HTML-safe gemaakt) en vervang dan smilies door de bijbehorende HTML.
En "escape-on-input" wat je nu doet als je alles naar de db wegschrijft is niet handig, bijvoorbeeld zoals Frank aanhaalt bij het wijzigen...
Het beste is om alles "rauw" op te slaan, en bewerkingen zoals htmlspecialchars() zo lang mogelijk uit te stellen (in jouw geval tot net voor het afdrukken).
Zo sla ik nu gegevens op in mijn DB:
Code (php)
En zo lees ik het nu uit:
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
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
<?php
// Haal de gegevens op uit de database
$result = mysqli_query($con,"SELECT id,naam,bericht,DATE_FORMAT(datum, '%d-%m-%Y') AS newDate,tijd,ipadres FROM gastenboek ORDER BY id DESC");
while($row = mysqli_fetch_array($result)) {
//Vervang tekens door smileys
$tekens = array(
'(B)',
'(b)',
':-)',
':)',
':$',
'(D)',
'(d)',
'(H)',
'(h)',
'(danny)',
'(y)',
'(Y)',
'(a)',
'(A)',
'(env)',
'(l)',
'(L)',
'(liefde)',
'(ilse)',
';-)',
';)',
'(k)',
'(K)',
'(r)',
'(R)',
':p',
':P',
':-p',
':-P',
'(verliefd)',
'xD',
);
$smilies = array(
'<img src="images/emoticons/bier.png">',
'<img src="images/emoticons/bier.png">',
'<img src="images/emoticons/blij.png">',
'<img src="images/emoticons/blij.png">',
'<img src="images/emoticons/bloos.png">',
'<img src="images/emoticons/cocktail.png">',
'<img src="images/emoticons/cocktail.png">',
'<img src="images/emoticons/cool.png">',
'<img src="images/emoticons/cool.png">',
'<img src="images/emoticons/danny.png">',
'<img src="images/emoticons/duim.png">',
'<img src="images/emoticons/duim.png">',
'<img src="images/emoticons/engel.png">',
'<img src="images/emoticons/engel.png">',
'<img src="images/emoticons/enveloppe.png">',
'<img src="images/emoticons/hart.png">',
'<img src="images/emoticons/hart.png">',
'<img src="images/emoticons/hartje.png">',
'<img src="images/emoticons/ilse.png">',
'<img src="images/emoticons/knipoog.png">',
'<img src="images/emoticons/knipoog.png">',
'<img src="images/emoticons/kus.png">',
'<img src="images/emoticons/kus.png">',
'<img src="images/emoticons/ring.png">',
'<img src="images/emoticons/ring.png">',
'<img src="images/emoticons/tong.png">',
'<img src="images/emoticons/tong.png">',
'<img src="images/emoticons/tong.png">',
'<img src="images/emoticons/tong.png">',
'<img src="images/emoticons/verliefd.png">',
'<img src="images/emoticons/xD.png">',
);
?>
<div class="wrapper">
<p class="color1 pad_bot2"><strong><?php echo str_replace($tekens,$smilies,htmlentities($row['naam'])); ?></strong></p>
<p class="pad_bot2"><?php echo str_replace($tekens,$smilies,htmlentities($row['bericht'])); ?></p>
<p class="color1 pad_bot4"><strong><?php echo $row['newDate'] . " " . $row['tijd']; ?></strong></p>
</div>
<?php
}
?>
// Haal de gegevens op uit de database
$result = mysqli_query($con,"SELECT id,naam,bericht,DATE_FORMAT(datum, '%d-%m-%Y') AS newDate,tijd,ipadres FROM gastenboek ORDER BY id DESC");
while($row = mysqli_fetch_array($result)) {
//Vervang tekens door smileys
$tekens = array(
'(B)',
'(b)',
':-)',
':)',
':$',
'(D)',
'(d)',
'(H)',
'(h)',
'(danny)',
'(y)',
'(Y)',
'(a)',
'(A)',
'(env)',
'(l)',
'(L)',
'(liefde)',
'(ilse)',
';-)',
';)',
'(k)',
'(K)',
'(r)',
'(R)',
':p',
':P',
':-p',
':-P',
'(verliefd)',
'xD',
);
$smilies = array(
'<img src="images/emoticons/bier.png">',
'<img src="images/emoticons/bier.png">',
'<img src="images/emoticons/blij.png">',
'<img src="images/emoticons/blij.png">',
'<img src="images/emoticons/bloos.png">',
'<img src="images/emoticons/cocktail.png">',
'<img src="images/emoticons/cocktail.png">',
'<img src="images/emoticons/cool.png">',
'<img src="images/emoticons/cool.png">',
'<img src="images/emoticons/danny.png">',
'<img src="images/emoticons/duim.png">',
'<img src="images/emoticons/duim.png">',
'<img src="images/emoticons/engel.png">',
'<img src="images/emoticons/engel.png">',
'<img src="images/emoticons/enveloppe.png">',
'<img src="images/emoticons/hart.png">',
'<img src="images/emoticons/hart.png">',
'<img src="images/emoticons/hartje.png">',
'<img src="images/emoticons/ilse.png">',
'<img src="images/emoticons/knipoog.png">',
'<img src="images/emoticons/knipoog.png">',
'<img src="images/emoticons/kus.png">',
'<img src="images/emoticons/kus.png">',
'<img src="images/emoticons/ring.png">',
'<img src="images/emoticons/ring.png">',
'<img src="images/emoticons/tong.png">',
'<img src="images/emoticons/tong.png">',
'<img src="images/emoticons/tong.png">',
'<img src="images/emoticons/tong.png">',
'<img src="images/emoticons/verliefd.png">',
'<img src="images/emoticons/xD.png">',
);
?>
<div class="wrapper">
<p class="color1 pad_bot2"><strong><?php echo str_replace($tekens,$smilies,htmlentities($row['naam'])); ?></strong></p>
<p class="pad_bot2"><?php echo str_replace($tekens,$smilies,htmlentities($row['bericht'])); ?></p>
<p class="color1 pad_bot4"><strong><?php echo $row['newDate'] . " " . $row['tijd']; ?></strong></p>
</div>
<?php
}
?>
Het enigste probleem is nu dat wanneer je een enter in een bericht gebruikt hij dit niet laat zien. Ik kan wel
invullen bij het invoeren van de data in de DB maar dan laat hij het zo zien:
fgdf<br /> df<br /> <br /> <br /> dfdsf<br /> dfd
Gewijzigd op 08/02/2015 19:15:48 door Danny von Gaal
het is een heel stuk handiger om datum en tijd samen in 1 veld van het type DATETIME op te slaan.
dat voorkomt heel wat dubbelingen met ORDER BY datum, tijd, of ook met WHERE.
Daarbij kun je dan trouwens net zo goed NOW() gebruiken als sql-functie.
Zet dat VOOR de loop.
Wederom is dit een kwestie van volgorde van bewerkingen voor het afdrukken (dit hoef je dus wederom niet te doen bij het opslaan):
1. maak je hele tekst HTML-safe door htmlspecialchars()
en daarna kun je in willekeurige volgorde:
2/3. regelovergangen omzetten naar <br /> door middel van nl2br()
2/3. smilies omzetten naar images met str_replace()
Met andere woorden, zorg gewoon dat htmlspecialchars() (of desnoods htmlentities()) je eerste bewerking is.
Ook zou ik me wat gaan verdiepen in character encoderingen, als ik jou was.
Ivo P: bedankt voor de tip zal daar volgende x rekening mee houden.
Thomas: ik snap niet helemaal wat je bedoeld. Ik heb bij het opslaan niets meer toegevoegd dan mysqli_real_escape_string en bij het ophalen staat dit maar werkt nog niet:
Sorry, maar dit is nu het laatste wat ik nog moet. Ik heb nl2br na htmlentities maar maakt schijnbaar niet uit.
Danny von Gaal op 08/02/2015 19:41:24:
Ik heb nl2br na htmlentities maar maakt schijnbaar niet uit.
Nee, het staat IN de function.
htmlentities(nl2br($row['bericht']))
moet zijn
nl2br(htmlentities($row['bericht'])
Ja dat had ik gedaan omdat Thomas zei dat het na htmlentities moest maar bedankt San. Nu werkt me gastenboek helemaal goed. :)
Wanneer je haakjes gebruikt, moet je van binnen naar buiten denken. Bij nl2br(htmlentities($row['bericht'])) zal PHP de nl2br dus uitvoeren ná de htmlentities.
Bedankt Willem dat wist ik niet en goed om te weten.