Klein vraagje over mysql_real_escape_string

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Dennis WhoCares

Dennis WhoCares

30/01/2013 16:13:10
Quote Anchor link
Zoals vele al weten, is mysql_real_escape string ervoor om SQL veilige input te geven.
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?
 
PHP hulp

PHP hulp

23/11/2024 23:45:32
 
Moose -

Moose -

30/01/2013 16:16:45
Quote Anchor link
Nee

Gebruik pdo niet mysql_*
 
Dennis WhoCares

Dennis WhoCares

30/01/2013 16:18:00
Quote Anchor link
pdo ?

je bedoelt, gebruik ook niet mysql_, maar mysqli_?
Gewijzigd op 30/01/2013 16:18:25 door Dennis WhoCares
 
Moose -

Moose -

30/01/2013 16:26:37
Quote Anchor link
Wat bedoel je?
 
Dennis WhoCares

Dennis WhoCares

30/01/2013 16:28:56
Quote Anchor link
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
 
Wouter J

Wouter J

30/01/2013 16:39:15
Quote Anchor link
MySQLi is gewoon een directe overplaatsing van MySQL tot iets wat PHP denkt een klasse te zien. PDO is 10x beter.

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.
 
Kris Peeters

Kris Peeters

30/01/2013 16:42:37
Quote Anchor link
Het antwoord is nee; en daar is een goede reden voor.

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.
 
Dennis WhoCares

Dennis WhoCares

30/01/2013 16:45:54
Quote Anchor link
ik dacht t wel, want de query zelf bevat natuurlijk mysql 'commands/karakters' die dan ook worden gescaped.
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)
PHP script in nieuw venster Selecteer het PHP script
1
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);


De execute() doet deze al mysql_real_escape_string?
 
Kris Peeters

Kris Peeters

30/01/2013 17:00:08
Quote Anchor link
Wat eventueel wel mogelijk is, is iets als dit:

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

?>
 
Wouter J

Wouter J

30/01/2013 17:10:33
Quote Anchor link
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)
PHP script in nieuw venster Selecteer het PHP script
1
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;
}

?>


(credits bij Niels Kieviet die dit hier poste: http://www.phphulp.nl/php/script/snippets/snelle-escape-voor-mysql/1937/#comment41106 )
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

30/01/2013 17:27:30
Quote Anchor link
@Wouter
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?
 
Wouter J

Wouter J

30/01/2013 17:54:04
Quote Anchor link
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)
PHP script in nieuw venster Selecteer het PHP script
1
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
?>


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
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

30/01/2013 18:14:42
Quote Anchor link
Officieel kent Mysql niet eens een boolean datatype ;-)
Maar als ik jouw regel 4 vervang door:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$stmt
->bindParam('id', 'A', \PDO::PARAM_INT);
?>

Krijg ik dan netjes een exception toegeworpen?
Gewijzigd op 30/01/2013 18:15:12 door Ger van Steenderen
 
Jordi Kroon

Jordi Kroon

30/01/2013 18:46:46
Quote Anchor link
Nee PDO gebruikt deze parameters niet om te typecasten maar om de waarden te converten.

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


Bron: Stack Overflow
Gewijzigd op 30/01/2013 18:49:06 door Jordi Kroon
 
Wouter J

Wouter J

30/01/2013 18:53:45
Quote Anchor link
Even getest, maar helaas. Net zo lazy typing als PHP.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

30/01/2013 19:57:28
Quote Anchor link
Hmz, dus (buiten de sql injectie) net zo zinloos als een escape.
 
Kris Peeters

Kris Peeters

31/01/2013 10:19:41
Quote Anchor link
Het lijkt mij dan dat bv. sprintf een eerlijkere oplossing is. Daarmee wordt wel getypecast; zie je wat er gebeurt; en geen magische hocus pocus ...
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)
PHP script in nieuw venster Selecteer het PHP script
1
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
);
?>


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
 



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.