Htmlspecialchar of escape voor pdo gebruiken?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Johan de wit

johan de wit

24/09/2016 23:00:37
Quote Anchor link
Hallo, allemaal is htmlspecialchar of escape voor pdo nodig? Ik wil een formulier maken dat bezoekers via front end kunnen invullen zodat in de database wordt opgeslagen.
 
PHP hulp

PHP hulp

04/05/2024 16:35:21
 
Ben van Velzen

Ben van Velzen

24/09/2016 23:08:01
Quote Anchor link
escaping uiteraard wel, tenzij je prepared statements gebruikt. htmlspecialchars is NOOIT nodig bij database toegang. Dat is een weergave functie.
 
Johan de wit

johan de wit

25/09/2016 15:26:04
Quote Anchor link
Hallo ben, eerst wil ik je bedanken. Zelf volg ik tutorial van PDO zou ik dan de code ook bij plaatsen? Dat meer zicht geeft en dan kan je nog misschien andere adviezen geven.
 
Ben van Velzen

Ben van Velzen

25/09/2016 15:34:57
Quote Anchor link
Je kunt uiteraard altijd code plaatsen. Dan is het in ieder geval duidelijk wat je doet.
 
Johan de wit

johan de wit

25/09/2016 16:37:45
Quote Anchor link
Onderstaande script gebruik ik nu.
Gewijzigd op 26/09/2016 00:12:29 door johan de wit
 
- SanThe -

- SanThe -

25/09/2016 16:58:06
Quote Anchor link
$_POST['wachtwoord'] zal niet bestaan, staat niet in het formulier.
 
Ben van Velzen

Ben van Velzen

25/09/2016 17:16:15
Quote Anchor link
Correct. Maar om de vraag te beantwoorden, je gebruikt hier prepared statements dus is escaping niet nodig. Zoals eerder gemeld moet je buiten escaping nooit andere dingen doen zoals htmlspecialchars, strip_tags oid. Ik kom die achterlijkheid veel te vaak tegen, met daarbij de vraag "waarom doet mijn query niet wat ik wil" ;-)
 
Johan de wit

johan de wit

25/09/2016 17:39:57
Quote Anchor link
SanThe: Ik heb meteen aangepast.

Ben: Dat zal ik onthouden.
 
Marthijn Buijs

Marthijn Buijs

25/09/2016 19:44:09
Quote Anchor link
De functie htmlspecialchars of strip_tags zou je pas moeten gebruiken als je data uit de database gaat weergeven.

Filter input, escape output..
 
Johan de wit

johan de wit

25/09/2016 20:05:58
Quote Anchor link
Goedenavond Maarten,

Eerst wil ik je bedanken. Weet je misschien waarom bovenstaande script een blanco scherm geeft en als je melding aan zet krijg je ook geen meldingen te zien. Kan dat aan hosting zitten? Zo ja, dan wil ik bovenstaande script met mysql werken maar daar krijg ik lege waarde mee verstuurd.
 
Koen Hollander

Koen Hollander

25/09/2016 21:54:14
Quote Anchor link
Laat me je eens uitleggen waar de functies voor dienen.

htmlspecialchars
Dit dient om unieke of rare karakters om te zetten HTML entiteiten. Hierdoor is het leesbaar voor de browser zonder al te veel rompslomp. Dit is tevens uiterst handig ter beveiliging van een script. Omdat het verschillende HTML tekens omzet naar normale tekens. Zo wordt een < (kleiner dan) omgezet naar &lt; en een > (groter dan) naar een &gt;
De aanhalingstekens worden ook gefilterd.

Hierover kan je meer lezen op http://php.net/manual/en/function.htmlspecialchars.php

escaping
In de uitleg op php.net staat het volgende:
Quote:
This function is used to create a legal SQL string that you can use in an SQL statement. The given string is encoded to an escaped SQL string, taking into account the current character set of the connection.


Dat houdt simpelweg in dat waardes in MySQL(i) omgezet worden naar legale karakters kijkend naar de huidige karakterset zodat de string makkelijk plaatsbaar is voor de database.

Dit alles betekend in het kort dat een escape vooral wordt gebruikt om SQL injectie tegen te gaan en een htmlspecialchars wordt gebruikt om HTML tekens te filteren om bijvoorbeeld een Cross site scripting (XSS) tegen te gaan. Daarnaast ondersteund PDO ook geen escape.

Hier nog wat leesvoer om alles beter te begrijpen.

http://php.net/manual/en/mysqli.real-escape-string.php
http://php.net/manual/en/book.pdo.php
http://php.net/manual/en/function.htmlspecialchars.php

Succes!
Gewijzigd op 25/09/2016 23:17:47 door Koen Hollander
 
Johan de wit

johan de wit

25/09/2016 22:27:46
Quote Anchor link
Hartstikke bedankt Koen! Dit is veel duidelijk geworden.

Ik wil een formulier maken dat de bezoekers formulier kunnen invullen zoals NAW gegevens etc etc, daarom kwam ik zo`n vraag.

Nu loop ik tegen een fout aan waar ik niet uit kan komen, moet ik hiervoor een nieuwe topic openen of hier met een nieuwe titel verder gaan?

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
<?php
error_reporting(E_ALL);
ini_set('display_errors',true);
?>

<?php
/*
Allows the user to both create new records and edit existing records
*/

// connect to the database

include("config.php");

// creates the new/edit record form
// since this form is used multiple times in this file, I have made it a function that is easily reusable

?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
</head>
<body>

<form action="" method="post">
<div>
<strong>First Name: *</strong> <input type="text" name="voornaam"
<br/>
<strong>Last Name: *</strong> <input type="text" name="achternaam"
/>
<p>* required</p>
<input type="submit" name="submit" value="Submit" />
</div>
</form>
</body>
</html>

<?php
// if the form's submit button is clicked, we need to process the form
if (isset($_POST['submit']))
{

// get the form data
$voornaam = mysqli_real_escape_string($_POST['voornaam']);
$achternaam = mysqli_real_escape_string($_POST['achternaam']);

// check that voornaam and achternaam are both not empty
if ($voornaam == '' || $achternaam == '')
{

// if they are empty, show an error message and display the form
$error = 'ERROR: Please fill in all required fields!';
renderForm($voornaam, $achternaam, $error);
}

else
{
// insert the new record into the database
if ($stmt = $mysqli->prepare("INSERT formulier (voornaam, achternaam) VALUES (?, ?)"))
{

$stmt->bind_param("ss", $voornaam, $achternaam);
$stmt->execute();
$stmt->close();
}

// show an error if the query has an error
else
{
echo "ERROR: Could not prepare SQL statement.";
}


// redirec the user
header("Location: view.php");
}
}


// close the mysqli connection
$mysqli->close();
?>
Gewijzigd op 26/09/2016 00:11:31 door johan de wit
 
Ben van Velzen

Ben van Velzen

25/09/2016 23:13:41
Quote Anchor link
Ik zie dit alvast:
$voornaam = htmlentities($_POST['voornaam'], ENT_QUOTES);
Dit moet je dus heel erg niet doen! htnlentities etc gebruik je bij WEERGAVE, nooit in je query.
 
Koen Hollander

Koen Hollander

25/09/2016 23:17:16
Quote Anchor link
Johan de wit op 25/09/2016 22:27:46:
Hartstikke bedankt Koen! Dit is veel duidelijk geworden.

Ik wil een formulier maken dat de bezoekers formulier kunnen invullen zoals NAW gegevens etc etc, daarom kwam ik zo`n vraag.

Nu loop ik tegen een fout aan waar ik niet uit kan komen, moet ik hiervoor een nieuwe topic openen of hier met een nieuwe titel verder gaan?

Hierbij een script wat goed werkt alleen ik kan een deel "wijzigen" niet verwijderen dan krijg ik een witte scherm zonder foutmeldingen (staat ook aan).

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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
<?php
error_reporting(E_ALL);
ini_set('display_errors',true);
?>

<?php
/*
Allows the user to both create new records and edit existing records
*/

// connect to the database

include("config.php");

// creates the new/edit record form
// since this form is used multiple times in this file, I have made it a function that is easily reusable

function renderForm($first = '', $last ='', $error = '', $id = '')
{
?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>
<?php if ($id != '') { echo "Edit Record"; } else { echo "New Record"; } ?>
</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
</head>
<body>
<h1><?php if ($id != '') { echo "Edit Record"; } else { echo "New Record"; } ?></h1>
<?php if ($error != '') {
echo "<div style='padding:4px; border:1px solid red; color:red'>" . $error
. "</div>";
}
?>


<form action="" method="post">
<div>
<?php if ($id != '') { ?>
<input type="hidden" name="id" />
<p>ID: <?php echo $id; ?></p>
<?php } ?>

<strong>First Name: *</strong> <input type="text" name="voornaam"
<br/>
<strong>Last Name: *</strong> <input type="text" name="achternaam"
/>
<p>* required</p>
<input type="submit" name="submit" value="Submit" />
</div>
</form>
</body>
</html>

<?php }



/*

EDIT RECORD

*/
// if the 'id' variable is set in the URL, we know that we need to edit a record

if (isset($_GET['id']))
{

// if the form's submit button is clicked, we need to process the form
if (isset($_POST['submit']))
{

// make sure the 'id' in the URL is valid
if (is_numeric($_POST['id']))
{

// get variables from the URL/form
$id = $_POST['id'];
$voornaam = htmlentities($_POST['voornaam'], ENT_QUOTES);
$achternaam = htmlentities($_POST['achternaam'], ENT_QUOTES);

// check that voornaam and achternaam are both not empty
if ($voornaam == '' || $achternaam == '')
{

// if they are empty, show an error message and display the form
$error = 'ERROR: Please fill in all required fields!';
renderForm($voornaam, $achternaam, $error, $id);
}

else
{
// if everything is fine, update the record in the database
if ($stmt = $mysqli->prepare("UPDATE players SET voornaam = ?, achternaam = ?
WHERE id=?"
))
{

$stmt->bind_param("ssi", $voornaam, $achternaam, $id);
$stmt->execute();
$stmt->close();
}

// show an error message if the query has an error
else
{
echo "ERROR: could not prepare SQL statement.";
}


// redirect the user once the form is updated
header("Location: view.php");
}
}

// if the 'id' variable is not valid, show an error message
else
{
echo "Error!";
}
}

// if the form hasn't been submitted yet, get the info from the database and show the form
else
{
// make sure the 'id' value is valid
if (is_numeric($_GET['id']) && $_GET['id'] > 0)
{

// get 'id' from URL
$id = $_GET['id'];

// get the recod from the database
if($stmt = $mysqli->prepare("SELECT * FROM players WHERE id=?"))
{

$stmt->bind_param("i", $id);
$stmt->execute();

$stmt->bind_result($id, $voornaam, $achternaam);
$stmt->fetch();

// show the form
renderForm($voornaam, $achternaam, NULL, $id);

$stmt->close();
}

// show an error if the query has an error
else
{
echo "Error: could not prepare SQL statement";
}
}

// if the 'id' value is not valid, redirect the user back to the view.php page
else
{
header("Location: view.php");
}
}
}




/*

NEW RECORD

*/
// if the 'id' variable is not set in the URL, we must be creating a new record

else
{
// if the form's submit button is clicked, we need to process the form
if (isset($_POST['submit']))
{

// get the form data
$voornaam = htmlentities($_POST['voornaam'], ENT_QUOTES);
$achternaam = htmlentities($_POST['achternaam'], ENT_QUOTES);

// check that voornaam and achternaam are both not empty
if ($voornaam == '' || $achternaam == '')
{

// if they are empty, show an error message and display the form
$error = 'ERROR: Please fill in all required fields!';
renderForm($voornaam, $achternaam, $error);
}

else
{
// insert the new record into the database
if ($stmt = $mysqli->prepare("INSERT formulier (voornaam, achternaam) VALUES (?, ?)"))
{

$stmt->bind_param("ss", $voornaam, $achternaam);
$stmt->execute();
$stmt->close();
}

// show an error if the query has an error
else
{
echo "ERROR: Could not prepare SQL statement.";
}


// redirec the user
header("Location: view.php");
}

}

// if the form hasn't been submitted yet, show the form
else
{
renderForm();
}
}


// close the mysqli connection
$mysqli->close();
?>


Kan je mij in een duidelijke tree structuur laten zien welke gegevens je van gebruikers wilt krijgen en wat je naamgeving is in de database. Wellicht dat ik je wat verder kan helpen.
Gewijzigd op 25/09/2016 23:20:40 door Koen Hollander
 
Johan de wit

johan de wit

25/09/2016 23:21:50
Quote Anchor link
Ben van Velzen op 25/09/2016 23:13:41:
Ik zie dit alvast:
$voornaam = htmlentities($_POST['voornaam'], ENT_QUOTES);
Dit moet je dus heel erg niet doen! htnlentities etc gebruik je bij WEERGAVE, nooit in je query.


Regel 54 tot 141 wil ik weg hebben.

Toevoeging op 25/09/2016 23:27:32:

Koen Hollander op 25/09/2016 23:17:16:
Johan de wit op 25/09/2016 22:27:46:
Hartstikke bedankt Koen! Dit is veel duidelijk geworden.

Ik wil een formulier maken dat de bezoekers formulier kunnen invullen zoals NAW gegevens etc etc, daarom kwam ik zo`n vraag.

Nu loop ik tegen een fout aan waar ik niet uit kan komen, moet ik hiervoor een nieuwe topic openen of hier met een nieuwe titel verder gaan?

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
<?php
error_reporting(E_ALL);
ini_set('display_errors',true);
?>

<?php
/*
Allows the user to both create new records and edit existing records
*/

// connect to the database

include("config.php");

// creates the new/edit record form
// since this form is used multiple times in this file, I have made it a function that is easily reusable

?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
</head>
<body>

<form action="" method="post">
<div>
<strong>First Name: *</strong> <input type="text" name="voornaam"
<br/>
<strong>Last Name: *</strong> <input type="text" name="achternaam"
/>
<p>* required</p>
<input type="submit" name="submit" value="Submit" />
</div>
</form>
</body>
</html>

<?php
// if the form's submit button is clicked, we need to process the form
if (isset($_POST['submit']))
{

// get the form data
$voornaam = mysqli_real_escape_string($_POST['voornaam']);
$achternaam = mysqli_real_escape_string($_POST['achternaam']);

// check that voornaam and achternaam are both not empty
if ($voornaam == '' || $achternaam == '')
{

// if they are empty, show an error message and display the form
$error = 'ERROR: Please fill in all required fields!';
renderForm($voornaam, $achternaam, $error);
}

else
{
// insert the new record into the database
if ($stmt = $mysqli->prepare("INSERT formulier (voornaam, achternaam) VALUES (?, ?)"))
{

$stmt->bind_param("ss", $voornaam, $achternaam);
$stmt->execute();
$stmt->close();
}

// show an error if the query has an error
else
{
echo "ERROR: Could not prepare SQL statement.";
}


// redirec the user
header("Location: view.php");
}
}


// close the mysqli connection
$mysqli->close();
?>


Kan je mij in een duidelijke tree structuur laten zien welke gegevens je van gebruikers wilt krijgen en wat je naamgeving is in de database. Wellicht dat ik je wat verder kan helpen.


Ik wil alleen een formulier maken dat je na bevestigen NAW gegevens wordt opgeslagen, in de script heb ik alleen even voornaam en achternaam gelaten dat overzichtelijker blijft anders wordt de regels alleen maar langer en langer. Verder wordt er niks aangepast dus edit stuk wil weg hebben en verder wil ik gewoon zo veilig mogelijk maken. Met jullie tips wil ook blijven verbeteren zolang ik dat kan doen.

Voornaam
Tussenvoegsel
Achternaam
Geslacht
Adres
Huisnummer
Toevoeging
Postcode
Woonplaats
Telefoon/mobiel
E-mail
Datum

Dit is nu wat ik heb:
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
<?php
error_reporting(E_ALL);
ini_set('display_errors',true);
?>

<?php
/*
Allows the user to both create new records and edit existing records
*/

// connect to the database

include("config.php");

// creates the new/edit record form
// since this form is used multiple times in this file, I have made it a function that is easily reusable

?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
</head>
<body>

<form action="" method="post">
<div>
<strong>First Name: *</strong> <input type="text" name="voornaam"
<br/>
<strong>Last Name: *</strong> <input type="text" name="achternaam"
/>
<p>* required</p>
<input type="submit" name="submit" value="Submit" />
</div>
</form>
</body>
</html>

<?php
// if the form's submit button is clicked, we need to process the form
if (isset($_POST['submit']))
{

// get the form data
$voornaam = mysqli_real_escape_string($_POST['voornaam']);
$achternaam = mysqli_real_escape_string($_POST['achternaam']);

// check that voornaam and achternaam are both not empty
if ($voornaam == '' || $achternaam == '')
{

// if they are empty, show an error message and display the form
$error = 'ERROR: Please fill in all required fields!';
renderForm($voornaam, $achternaam, $error);
}

else
{
// insert the new record into the database
if ($stmt = $mysqli->prepare("INSERT formulier (voornaam, achternaam) VALUES (?, ?)"))
{

$stmt->bind_param("ss", $voornaam, $achternaam);
$stmt->execute();
$stmt->close();
}

// show an error if the query has an error
else
{
echo "ERROR: Could not prepare SQL statement.";
}


// redirec the user
header("Location: view.php");
}
}


// close the mysqli connection
$mysqli->close();
?>


Er draait PHP versie 7.0.2.

Alles werkt goed tot dat ik Escape gebruik, nadat ik de waarde verstuur krijg ik onderstaande foutmeldingen. Als bij deze script ook niet nodig is dan haal ik Escape weg. Dan blijft nog server side controle nog over, ben ik dan misschien iets vergeten?

Warning: mysqli_real_escape_string() expects exactly 2 parameters, 1 given in
Gewijzigd op 26/09/2016 07:38:15 door johan de wit
 
Koen Hollander

Koen Hollander

26/09/2016 09:39:35
Quote Anchor link
Warning: mysqli_real_escape_string() expects exactly 2 parameters, 1 given in

Je hebt in PHP 2 manieren van programmeren, grof genomen.

OOP en procedural.

Met OOP maak je objecten die elkaar uitbreiden, dus kan je $mysqli->real_escape_string() gebruiken
Jij gebruikt dat en daarom werkt mysqli_real_escape_string() niet. Die verwacht de connectiestring als in
mysqli_real_escape_string($mysqli,$value)

Zodoende

$voornaam = $mysqli->real_escape_string($_POST['voornaam']);
$achternaam = $mysqli->real_escape_string($_POST['achternaam']);

Maar weet wel, je pleurt PDO en MySQLi door elkaar.
 
Ben van Velzen

Ben van Velzen

26/09/2016 11:10:47
Quote Anchor link
Dat, en je maakt gebruik van prepared statements. Als je dan gaat escapen dan doe je de escaping dubbel, waardoor je data vervuild de database in gaat. Prepared statements doen de escaping voor je. Dat maakt ze zo krachtig. Haal de escaping dus gewoon weg. Is nergens goed voor. Het enige dat het nu zal doen is je data verknallen.
Gewijzigd op 26/09/2016 11:12:06 door Ben van Velzen
 
Koen Hollander

Koen Hollander

26/09/2016 11:26:25
Quote Anchor link
Ben van Velzen op 26/09/2016 11:10:47:
Dat, en je maakt gebruik van prepared statements. Als je dan gaat escapen dan doe je de escaping dubbel, waardoor je data vervuild de database in gaat. Prepared statements doen de escaping voor je. Dat maakt ze zo krachtig. Haal de escaping dus gewoon weg. Is nergens goed voor. Het enige dat het nu zal doen is je data verknallen.


Als je alleen MySQL gebruikt, zonder de prepared statements, kan je inderdaad escapen. Anders geldt bovenstaand.
 
Johan de wit

johan de wit

26/09/2016 18:09:26
Quote Anchor link
Het zijn kleine dingen waar rekening mee moet houden maar zo zie je het maar hoe belangrijk het is. Ik zal dan maar verwijderen en dit keer probeer ik validatie in te proppen. Ben ik misschien nog iets anders vergeten?
 
Johan de wit

johan de wit

30/09/2016 03:02:50
Quote Anchor link
Ik heb nog geen validatie gemaakt en fouten afhandelen heb ik ook niet maar opeens krijg ik een error te zien. Als op Google zoek dan krijg alleen mysql te zien terwijl bij mij form() staat. Als ik formulier verstuur dan krijg ik de volgende error te zien. Fatal error: Uncaught Error: Call to undefined function renderForm() in
 
Michael -

Michael -

30/09/2016 14:08:17
Quote Anchor link
Quote:
Call to undefined function renderForm()


Dit betekend dat je op die regel de functie renderForm() aanroept, maar deze bestaat niet. Dus je moet of de functie toevoegen of in die regel het aanroepen weghalen.
 



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.