Oprettet man. d. 01. oktober 2012 kl. 21:56:35

shjorth
shjorth (6.280 point. Point ude: 450)

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

Skrevet man. d. 01. oktober 2012 kl. 22:29:40| #1


Skrevet ons. d. 03. oktober 2012 kl. 14:08:46| #2

olebole
olebole (216.733 point)
<ole>

Hvorfor var Arnes svar ikke interessant?

/mvh
</bole>

Skrevet ons. d. 03. oktober 2012 kl. 14:41:00| #3

shjorth
shjorth (6.280 point)
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 ?

Skrevet ons. d. 03. oktober 2012 kl. 14:55:50| #4

arne_v
arne_v (1.048.768 point)
http://php.net/ (...)


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.

Skrevet ons. d. 03. oktober 2012 kl. 14:56:10| #5

olebole
olebole (216.733 point)
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'!

Skrevet ons. d. 03. oktober 2012 kl. 14:56:17| #6


Skrevet ons. d. 03. oktober 2012 kl. 15:34:35| #7

shjorth
shjorth (6.280 point)
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 :)

Skrevet ons. d. 03. oktober 2012 kl. 15:59:52| #8

olebole
olebole (216.733 point)
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  =)

Skrevet ons. d. 03. oktober 2012 kl. 16:06:40| #9

olebole
olebole (216.733 point)
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.

Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   


Seneste spørgsmål

Problemer med random select og cache

Oprettet den 21. maj 2013 kl. 20.43
webweaver giver 100 point for svar | Giv et svar »

DB-baseret dropdown viser selected post to gange...

Oprettet den 21. maj 2013 kl. 15.52
allandk giver 30 point for svar | Giv et svar »

Hente alle poster og gemme i variabel til senere echo

Oprettet den 20. maj 2013 kl. 21.49
allandk giver 30 point for svar | Giv et svar »

Seneste guides

Slettet
Håndtering af tekstoversættelse i...
Parameteriseret tekstformatering i C#
C++ Historie og Programmering - Del 1







Tips & Tricks fra PC World

Teaser billede

Her er seks Google Labs-funktioner, som du skal slå til med det samme

Gmail Labs giver dig adgang til en masse smarte funktioner, som Googles ingeniører leger med i øjeblikket.


Anmeldelser fra PC World

Teaser billede

Test: Samsung Galaxy S4 er et hit - trods gøglertricks

Kan Samsung beholde førertrøjen i det store Android-race? Galaxy S4 er smækfyldt med innovative funktioner, men også med en del gøgl. Er det for meget? Få vores dom over Samsungs nye topmodel.


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Tre smarte trick som gør Windows 8 bedre

Boot direkte til skrivebordet, få en strategisk godt placeret luk-knap og slip for at logge ind. Her er tre tips til Windows 8, som gør det nemmere at blive venner med styresystemet.


Nyheder fra Computerworld

Teaser billede

De 21 værste it-vaner - og hvordan du bryder dem

Du har helt sikkert en af disse dårlige it-vaner. Se her hvad du kan gøre.


IT Kurser
Samarbejdspartnere

Udgiver · © 2013 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger