htmlentities en str_replace

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Danny von Gaal

Danny von Gaal

03/02/2015 23:02:01
Quote Anchor link
Ik heb smileys beschikbaar gesteld in mijn gastenboek dmv str_replace alleen werkt dat niet goed i.c.m. htmlentities omdat hij nu de images code <img src=""> in html laat zien. Hieronder mijn code, als ik htmlentities weg haal werkt het wel alleen kan iemand dan helaas een foto in mijn gastenboek plaatsen met html codes en dat wil ik niet.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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>";
}

}

?>
 
PHP hulp

PHP hulp

16/01/2025 17:05:14
 
- SanThe -

- SanThe -

03/02/2015 23:14:52
Quote Anchor link
Dit: htmlentities($_POST['..']) is geen beveiliging.
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));
 
Frank Nietbelangrijk

Frank Nietbelangrijk

04/02/2015 00:11:22
Quote Anchor link
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 :-)
 
Thomas van den Heuvel

Thomas van den Heuvel

04/02/2015 02:27:53
Quote Anchor link
htmlentities() is voor de escaping van speciale elementen bij het afdrukken van HTML.
_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).
 
Danny von Gaal

Danny von Gaal

08/02/2015 19:07:16
Quote Anchor link
Bedankt voor jullie tips en het werkt nu goed.

Zo sla ik nu gegevens op in mijn DB:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
mysqli_query($con,"INSERT INTO gastenboek (naam,bericht,datum,tijd,ipadres) VALUES ('".mysqli_real_escape_string($con,$_POST['naam'])."','".mysqli_real_escape_string($con,$_POST['bericht'])."','".date("Y-m-d")."','".date("H:i:s")."','".$_SERVER['REMOTE_ADDR']."')");
?>


En zo lees ik het nu uit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
mysqli_real_escape_string($con,nl2br($_POST['bericht']))
?>


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
 
Ivo P

Ivo P

08/02/2015 19:16:33
Quote Anchor link
tip:
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.
 
- SanThe -

- SanThe -

08/02/2015 19:26:32
Quote Anchor link
Nooit vaststaande variabelen of array's in een loop definieren.
Zet dat VOOR de loop.
 
Thomas van den Heuvel

Thomas van den Heuvel

08/02/2015 19:31:14
Quote Anchor link
@Danny
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.
 
Danny von Gaal

Danny von Gaal

08/02/2015 19:41:24
Quote Anchor link
-SanThe- Ik heb mijn array met smiley e.d. voor me loop geplaatst.
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
<?php
echo str_replace($tekens,$smilies,htmlentities(nl2br($row['bericht']))); ?>

Sorry, maar dit is nu het laatste wat ik nog moet. Ik heb nl2br na htmlentities maar maakt schijnbaar niet uit.
 
- SanThe -

- SanThe -

08/02/2015 19:45:35
Quote Anchor link
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'])
 
Danny von Gaal

Danny von Gaal

08/02/2015 19:59:32
Quote Anchor link
Ja dat had ik gedaan omdat Thomas zei dat het na htmlentities moest maar bedankt San. Nu werkt me gastenboek helemaal goed. :)
 
Willem vp

Willem vp

09/02/2015 01:20:00
Quote Anchor link
> Ja dat had ik gedaan omdat Thomas zei dat het na htmlentities moest

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.
 
Danny von Gaal

Danny von Gaal

09/02/2015 08:37:06
Quote Anchor link
Bedankt Willem dat wist ik niet en goed om te weten.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.