Klein vraagje over mysql_real_escape_string
Eigenlijk denk ik t antwoord al te weten op de volgende vraag (nee dit werkt niet):
Is het niet mogelijk om gewoon mysql_query(mysql_real_escape_string($query)) te doen?
Gebruik pdo niet mysql_*
je bedoelt, gebruik ook niet mysql_, maar mysqli_?
Gewijzigd op 30/01/2013 16:18:25 door Dennis WhoCares
Wat bedoel je?
Moose - op 30/01/2013 16:26:37:
Wat bedoel je?
Nee sorry, PDO is een class voor veilige communicatie met databaseserver.
En mysqli_ is eigenlijk vervanger van mysql voor betere en veilige verwerking :)
Gewijzigd op 30/01/2013 16:30:37 door Dennis WhoCares
Al vind ik het wel erg irritant dat het eerste antwoord op mysql vragen op dit forum tegenwoordig 'mysql is slecht gebruik pdo' moet zijn. Als je geen antwoord weet, plaats dan niks. Het is een goed ding om op te merken, maar geef dan ook wel antwoord op de vraag (en ook een antwoord waar de TS wel wat aan heeft).
Mysql_real_escape_string moet je niet om de hele query zetten. Je wilt immers alleen de string escapen op verkeerde tekens en niet de query, want verkeerde tekens in een string zijn vaak juist wel goede tekens in een query.
Vergeet even de hackers, en denk aan de gewone gebruiker die bv. "foto's" gebruikt.
$sql = "INSERT INTO shoutbox (id, message) VALUES (NULL, 'Ik heb foto's getrokken')";
Je snapt dat het voor een computer niet duidelijk is waar de string moet eindigen. Je kan niet zomaar een functie schrijven die dit kan opvangen (en dit is nog maar een heel simpel voorbeeld).
Het is absoluut noodzakelijk dat de user input zelf wordt geëscaped; vooraleer ze in een string wordt verwerkt.
T was gewoon een vraagje
Dank jullie allen voor jullie meningen. :)
Toevoeging op 30/01/2013 16:59:10:
Om terug te komen op pdo en mysql_escape_real_string()
Code (php)
1
2
3
4
2
3
4
$query = 'select user_id from users WHERE user_username = ? AND user_password = ?';
$preparedQ = $myPDO->prepare($query);
$valueArray = array($_POST['username'],sha1(md5($_POST['password'])));
$preparedQ->execute($valueArray);
$preparedQ = $myPDO->prepare($query);
$valueArray = array($_POST['username'],sha1(md5($_POST['password'])));
$preparedQ->execute($valueArray);
De execute() doet deze al mysql_real_escape_string?
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
escapeAll($_POST);
function escapeAll(&$var) {
foreach($var as $key=>$val) {
$var[$key] = mysql_real_escape_string($val);
}
}
?>
escapeAll($_POST);
function escapeAll(&$var) {
foreach($var as $key=>$val) {
$var[$key] = mysql_real_escape_string($val);
}
}
?>
Quote:
De execute() doet deze al mysql_real_escape_string?
Nee, maar wel zoiets. PDO heeft PDO::quote (pdo.quote) die hetzelfde doet als mysql_real_escape_string. Maar als je prepared statements gebruikt (wat jij hier laat zien) gebeurd dit al in zichzelf en hoef je je daar geen zorgen meer over te maken.
Om nog een handige functie te geven die dit doet met mysql_* functies:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
function getSafeQuery($query, $params = array()) {
$newParams = array();
if (count($params) > 0) {
foreach ($params as $param) {
// Alle parameters escapen
$newParams[] = mysql_real_escape_string($param);
}
// Query met gevulde values
return (vsprintf(str_replace('?', "'%s'", $newParams)));
}
return $query;
}
?>
function getSafeQuery($query, $params = array()) {
$newParams = array();
if (count($params) > 0) {
foreach ($params as $param) {
// Alle parameters escapen
$newParams[] = mysql_real_escape_string($param);
}
// Query met gevulde values
return (vsprintf(str_replace('?', "'%s'", $newParams)));
}
return $query;
}
?>
(credits bij Niels Kieviet die dit hier poste: http://www.phphulp.nl/php/script/snippets/snelle-escape-voor-mysql/1937/#comment41106 )
Zijn de parameters in PDO net zo looseless typed als PHP zelf?
Anders gevraagd, stel ik zeg dat een parameter een integer moet zijn, maar ik geef bij het binden de waarde A mee, wat gebeurt er dan?
Quote:
Anders gevraagd, stel ik zeg dat een parameter een integer moet zijn, maar ik geef bij het binden de waarde A mee, wat gebeurt er dan?
PDO zal standaard alle values aanzien voor string. Je kan als 3e argument in de PDO een type meegeven, hierdoor kun je aangeven welke type het is en daardoor kun je hem dus strict type maken:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?php
$stmt = $pdo->prepare('SELECT name FROM users WHERE id = :id AND logged_in = :logged_in');
$stmt->bindParam(':id', 12, \PDO::PARAM_INT);
$stmt->bindParam(':logged_in', true, \PDO::PARAM_BOOL);
// en met mysqli
$stmt = $mysqli->prepare('SELECT name FROM users WHERE id = ? AND logged_in = ?');
$stmt->bind_param('ii', 12, 1); // mysqli heeft geen boolean type
?>
$stmt = $pdo->prepare('SELECT name FROM users WHERE id = :id AND logged_in = :logged_in');
$stmt->bindParam(':id', 12, \PDO::PARAM_INT);
$stmt->bindParam(':logged_in', true, \PDO::PARAM_BOOL);
// en met mysqli
$stmt = $mysqli->prepare('SELECT name FROM users WHERE id = ? AND logged_in = ?');
$stmt->bind_param('ii', 12, 1); // mysqli heeft geen boolean type
?>
De types die PDO heeft:
PDO::PARAM_BOOL
PDO::PARAM_NULL
PDO::PARAM_INT
PDO::PARAM_STR
PDO::PARAM_LOB
PDO::PARAM_STMT
Die boolean is best wel vernuftig, aangezien hij vaak terug zal vallen op 0 of 1, maar in sommige gevallen true of false of wat ook maar als boolean value door de database geaccepteerd wordt.
Gewijzigd op 30/01/2013 17:55:14 door Wouter J
Maar als ik jouw regel 4 vervang door:
Krijg ik dan netjes een exception toegeworpen?
Gewijzigd op 30/01/2013 18:15:12 door Ger van Steenderen
Quote:
PDO::PARAM_STR converts whatever you give it to a string
PDO::PARAM_INT converts bools into longs
PDO::PARAM_BOOL converts longs into bools
PDO::PARAM_INT converts bools into longs
PDO::PARAM_BOOL converts longs into bools
Bron: Stack Overflow
Gewijzigd op 30/01/2013 18:49:06 door Jordi Kroon
Even getest, maar helaas. Net zo lazy typing als PHP.
Hmz, dus (buiten de sql injectie) net zo zinloos als een escape.
en nog afkomstig van de good old days van c (c++ zonder de ++) (wat misschien wel extra handig is, aangezien php in c++ is geschreven);
bv.
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
$sql = sprintf(
"INSERT INTO my_table (id, user, message) VALUES (NULL, %d, %s)",
$_POST['id'], // geen extra maatregelen nodig
"'" . mysql_real_escape_string($_POST['message']) . "'" // soms interessant om de ' hier te zetten, bv. wanneer je ook NULL moet kunnen invullen
);
?>
$sql = sprintf(
"INSERT INTO my_table (id, user, message) VALUES (NULL, %d, %s)",
$_POST['id'], // geen extra maatregelen nodig
"'" . mysql_real_escape_string($_POST['message']) . "'" // soms interessant om de ' hier te zetten, bv. wanneer je ook NULL moet kunnen invullen
);
?>
Misschien moet vooral benadrukt worden hoe pdo wel een mooi systeem heeft om verschillende inserts tegelijk te regelen en om verschillende databases te connecteren.
Het feit dat pdo iets heeft als PDO::PARAM_INT, en dat het niets doet, is heel zwaar misleidend van pdo uit.
Gewijzigd op 31/01/2013 10:58:17 door Kris Peeters