/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
SQL injection - PHP/MySQL
Fra : Chris


Dato : 28-08-04 19:06

Hej,

Hvordan sikrer man sig nemmest mod sql injection i kombinationen PHP/MySQL?

Er det f.eks. nok med følgende hvis man henter en variabel fra url'en:

------------------------
<?php
$name = str_replace("'", "", $_GET['name']);
?>
------------------------

/Chris

 
 
Troels Arvin (28-08-2004)
Kommentar
Fra : Troels Arvin


Dato : 28-08-04 18:51

On Sat, 28 Aug 2004 19:05:51 +0100, Chris wrote:

> Hvordan sikrer man sig nemmest mod sql injection i kombinationen PHP/MySQL?
>
> Er det f.eks. nok med følgende hvis man henter en variabel fra url'en:
>
> ------------------------
> <?php
> $name = str_replace("'", "", $_GET['name']);
> ?>
> ------------------------

Et alternativ, der er skabt specifikt til formålet:
http://dk.php.net/manual/en/function.mysql-real-escape-string.php
Hvis du der er tale om en heltalsværdi, så er det nok lettere at køre
intval() på værdien.

Hvis du ønsker en mere DB-portabel løsning, så benyt dit
DB-abstraktionslag's streng-escape'r, så kig på noget i stil med:
http://pear.php.net/manual/en/package.database.db.db-common.quotesmart.php

--
Greetings from Troels Arvin, Copenhagen, Denmark


Peter Brodersen (28-08-2004)
Kommentar
Fra : Peter Brodersen


Dato : 28-08-04 19:34

On Sat, 28 Aug 2004 19:50:39 +0200, Troels Arvin <troels@arvin.dk>
wrote:

>Hvis du ønsker en mere DB-portabel løsning, så benyt dit
>DB-abstraktionslag's streng-escape'r, så kig på noget i stil med:
>http://pear.php.net/manual/en/package.database.db.db-common.quotesmart.php

Eller evt. bare brug placeholders. Det lægger også op til at man kun
prepare'r en query én gang, og er et skridt væk fra at skulle sidde og
klistretapelime queries sammen.

--
- Peter Brodersen

Memento mori!

Jimmy (28-08-2004)
Kommentar
Fra : Jimmy


Dato : 28-08-04 19:57


"Troels Arvin" <troels@arvin.dk> wrote in message
news:pan.2004.08.28.17.50.38.611186@arvin.dk...
> On Sat, 28 Aug 2004 19:05:51 +0100, Chris wrote:
>
> > Hvordan sikrer man sig nemmest mod sql injection i kombinationen
PHP/MySQL?
> >
> > Er det f.eks. nok med følgende hvis man henter en variabel fra url'en:
> >
> > ------------------------
> > <?php
> > $name = str_replace("'", "", $_GET['name']);
> > ?>
> > ------------------------
>
> Et alternativ, der er skabt specifikt til formålet:
> http://dk.php.net/manual/en/function.mysql-real-escape-string.php
> Hvis du der er tale om en heltalsværdi, så er det nok lettere at køre
> intval() på værdien.
>
> Hvis du ønsker en mere DB-portabel løsning, så benyt dit
> DB-abstraktionslag's streng-escape'r, så kig på noget i stil med:
> http://pear.php.net/manual/en/package.database.db.db-common.quotesmart.php


Er addslashes() ikke tilstrækkeligt?

Hvis ikke har jeg et problem

Mvh
Jimmy



Troels Arvin (29-08-2004)
Kommentar
Fra : Troels Arvin


Dato : 29-08-04 12:24

On Sat, 28 Aug 2004 20:56:40 +0200, Jimmy wrote:
>> Et alternativ, der er skabt specifikt til formålet:
>> http://dk.php.net/manual/en/function.mysql-real-escape-string.php

> Er addslashes() ikke tilstrækkeligt?

Til MySQL, jo; men jeg synes, at addslashes er en halvdum funktion: Den
benytter ikke standard SQL's måde at escap'e på - og dermed kun med de
DBMSer, hvor der tilfældigvis kan escape's som addslashes() gør (MySQL
og PostgreSQL, muligvis flere). Efter min mening er addslashes() en af de
funktioner, der burde ryge ud af PHP ved en oprydning, men det ville give
grimme bagudkompatibilitetsproblemer.

Med andre ord mener jeg, at koden bliver mere klar, hvis man
eksplicit benytter en DBMS-specifik escape-funktion i sin DBMS-specifikke
kode. På den måde kan man fx. lettere identificere de 'ømme' dele af
éns kode, hvis man på et tidspunkt bliver interesseret i at få den til
at spille op mod ét eller flere andre DBMSer.

Alternativet er som nævnt at forsøge at bruge et DBMS-abstraktionslag.
Og som Peter skriver, kan man da benytte prepared statements og helt
slippe for eksplicit escape'ing.

--
Greetings from Troels Arvin, Copenhagen, Denmark


Chris (29-08-2004)
Kommentar
Fra : Chris


Dato : 29-08-04 15:45

Troels Arvin wrote:

> Et alternativ, der er skabt specifikt til formålet:
> http://dk.php.net/manual/en/function.mysql-real-escape-string.php
> Hvis du der er tale om en heltalsværdi, så er det nok lettere at køre
> intval() på værdien.

Hmm... Jeg kan se at magic_quotes_gpc er "on" hos min udbyder (kan nok
ikke ændres) så med mysql-escape-string (kører php vers. 4.2.3) får jeg
dobbelt escaped. Eksempelvis bliver "O'Reilly" til "O\\\'Reilly".

Vil det mest optimale i min situation så være noget i retning af
følgende hvis jeg skal sikre imod SQL injection: ... ?

------------------------
<?php
$name = mysql_escape_string(stripslashes($_POST['name']));
$number = intval($_POST['number']);
?>
------------------------

/Chris

Troels Arvin (29-08-2004)
Kommentar
Fra : Troels Arvin


Dato : 29-08-04 16:28

On Sun, 29 Aug 2004 15:44:59 +0100, Chris wrote:

> Hmm... Jeg kan se at magic_quotes_gpc er "on" hos min udbyder (kan nok
> ikke ændres)

Argh. magic_quotes sutter, men er desværre en default PHP-indstilling.

> Vil det mest optimale i min situation så være noget i retning af
> følgende hvis jeg skal sikre imod SQL injection: ... ?
>
> ------------------------
> <?php
> $name = mysql_escape_string(stripslashes($_POST['name']));
> $number = intval($_POST['number']);
> ?>
> ------------------------

Du benytter MySQL, så hvis magic_quotes_gpc er sat til, burde dine
eksternt genererede strenge være tilstrækkeligt SQL-beskyttende, og
kørsel gennem stripslashes() derfor måske lidt voldsom. Derfor kunne
følgende overvejes som alternativ:

<?php
if (get_magic_quotes_gpc()) {
$name = $_REQUEST['name'];
} else {
$name = mysql_real_escape_string($_REQUEST['name'],$dbh);
}
$number = intval($_REQUEST['number']);
?>

($dbh er dit database forbindelsesobjekt; kan evt. udelades, se
dokumentationen til mysql_real_escape_string().)

På den måde burde koden stadig fungere, hvis det blev flyttet til en
server med andre PHP-indstillinger.

--
Greetings from Troels Arvin, Copenhagen, Denmark


Tommy Ipsen (29-08-2004)
Kommentar
Fra : Tommy Ipsen


Dato : 29-08-04 19:40

Chris wrote:

> Hmm... Jeg kan se at magic_quotes_gpc er "on" hos min udbyder (kan nok
> ikke ændres) så med mysql-escape-string (kører php vers. 4.2.3) får jeg
> dobbelt escaped. Eksempelvis bliver "O'Reilly" til "O\\\'Reilly".

Sakset fra: http://dk.php.net/manual/en/function.get-magic-quotes-gpc.php
------------------------------------------------------------------------
In the interests of writing portable code (code that works in any
environment), or, if you do not have access to change php.ini, you may
wish to disable the effects of magic quotes on a per-script basis. This
can be done in two ways, with a directive in a .htaccess file (php_value
magic_quotes_gpc 0), or by adding the below code to the top of your scripts.

Example 2. Disabling magic quotes at runtime
<?php
if (get_magic_quotes_gpc()) {
function stripslashes_deep($value)
{
$value = is_array($value) ?
array_map('stripslashes_deep', $value) :
stripslashes($value);

return $value;
}

$_POST = array_map('stripslashes_deep', $_POST);
$_GET = array_map('stripslashes_deep', $_GET);
$_COOKIE = array_map('stripslashes_deep', $_COOKIE);
}
?>
Magic-quotes was added to reduce code written by beginners from being
dangerous. If you disable magic quotes, you must be very careful to
protect yourself from SQL injection attacks.
------------------------------------------------------------------------

Dvs. indstillingen kan godt ændres inden scriptet udføres og ellers kan
der laves høkerløsning for at omgå indstillingen.

Mvh Tommy

Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408527
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste