Avatar billede shjorth Nybegynder
01. oktober 2012 - 21:56 Der er 8 kommentarer og
1 løsning

PDO MySQL Injections

Hejsa.

Jeg er igang med at lære at bruge PDO fremfor mysql_query...

I gamle dage ville jeg have benyttet mig af

    $data = mysql_real_escape_string($_POST['data']);
    mysql_query...

Men hvilken metode bør man benytte sig af når det nu hedder PDO, er der en lign. funktion ?

Takker
Avatar billede arne_v Ekspert
01. oktober 2012 - 22:29 #1
Avatar billede olebole Juniormester
03. oktober 2012 - 14:08 #2
<ole>

Hvorfor var Arnes svar ikke interessant?

/mvh
</bole>
Avatar billede shjorth Nybegynder
03. oktober 2012 - 14:41 #3
Det er det også jeg er bare forvirret.
#1 Ligger du et svar ?

Jeg fandt også funktionen quote(), som ligeledes burde kunne forhindre injections.
Er der nogen grund til at bruge det ene frem for det andet ?
Avatar billede arne_v Ekspert
03. oktober 2012 - 14:55 #4
http://php.net/manual/en/pdo.quote.php


PDO::quote() places quotes around the input string (if required) and escapes special characters within the input string, using a quoting style appropriate to the underlying driver.

If you are using this function to build SQL statements, you are strongly recommended to use PDO::prepare() to prepare SQL statements with bound parameters instead of using PDO::quote() to interpolate user input into an SQL statement. Prepared statements with bound parameters are not only more portable, more convenient, immune to SQL injection, but are often much faster to execute than interpolated queries, as both the server and client side can cache a compiled form of the query.

Not all PDO drivers implement this method (notably PDO_ODBC). Consider using prepared statements instead.
Avatar billede olebole Juniormester
03. oktober 2012 - 14:56 #5
Ja, du skal bruge prepare, fordi det sikrer dig mod SQL-injections.

Quote og mysql_real_escape_string er dårlige hacks, som kan bruges til at lappe på dynamisk genererede SQL-kommandoer - men dynamisk genererede SQL-kommandoer er noget, Fanden har skabt ... på en premenstruel, umådelig 'bad hair day'!
Avatar billede arne_v Ekspert
03. oktober 2012 - 14:56 #6
svar
Avatar billede shjorth Nybegynder
03. oktober 2012 - 15:34 #7
Takker mange gange.

Grunden til jeg ville foretrække quote var at det ser ud til at være noget nemmere. Min simple hjerne har lidt svært ved at forstå prepare metoden :)
Avatar billede olebole Juniormester
03. oktober 2012 - 15:59 #8
Prepare er den eneste vej frem, og det er ikke så svært endda  =)

Prøv at kikke på denne kode fra [url=http://dk.php.net/manual/en/pdo.prepare.php]php.net[/div]:

<?php
/* Execute a prepared statement by passing an array of values */
$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < ? AND colour = ?');
$sth->execute(array(150, 'red'));
$red = $sth->fetchAll();

$sth->execute(array(175, 'yellow'));
$yellow = $sth->fetchAll();
?>

Forestil dig, at linjen:

$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < ? AND colour = ?');

- opretter et objekt $sth nede på databasen. Dette objekt får automatisk en metode execute, som kalder dit SELECT-statement, hvergang den kaldes med nye argumenter.

Ved alm. MySQL dannes en funktion udfra en streng, der er sammensat af stumper - dels skrevet af udvikleren, og dels indsat af brugeren (via $_POST eller $_GET) - hvergang databasen kaldes.

Ved PDO's eller MySQLI's prepare dannes en funktion på baggrund af en streng skrevet af udvikleren. Der hvor der skal indgå dynamiske parametre, udskiftes disse med en placeholder: '?'.

Efterfølgende kan denne funktion kaldes mange gange med forskellige argumenter - f.eks. stammende fra brugerinput - med execute. Fuldstændig som du kalder enhver PHP-funktion.

I eksemplet kaldes funktionen to gange - først med 150 og 'red' som argumenter. Anden gang med 175 og 'yellow' som argumenter.

Det gør, at brugerinput ikke bliver 'fedtet' ind i selve funktions body'en (dens 'indre'), men kun bliver brugt som argumenter i et funktionskald. Derfor er det ikke nødvendigt at escape brugerinputtet.

Det gør samtidig gentagne kald med samme SQL (og forskellige argumenter) langt hurtigere.

Håber, det hjalp på forståelsen  =)
Avatar billede olebole Juniormester
03. oktober 2012 - 16:06 #9
Når du har fået forståelsen af, hvad det er, der sker, bør du gå videre til at binde dine parametre, bl.a. for at sikre, at argumenterne har den ønskede type.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester