Avatar billede htx98i17 Professor
29. december 2008 - 13:58 Der er 47 kommentarer og
2 løsninger

sprintf() og mysql_real_escape_string()

http://dk2.php.net/manual/en/function.mysql-real-escape-string.php

Der bruger de sprintf() i eksemplet. Hvorfor?

hvis man bruger mysql_real_escape_string() slipper man så for at skal bruge addslashes() ?

Kan man ikke:
mysql_query(mysql_real_escape_string($sql)) ? (har selv et bud på hvorfor ikke, men det ville da være meget smartere frem for at bruge den ved hver eneste value der skal inputtes)
Avatar billede erikjacobsen Ekspert
29. december 2008 - 15:21 #1
Det man skal gør i dag, er at bruge http://php.net/mysqli med parameters, og glemme alt om sprintf, addslashes, mysql_real_escape_string. Det eneste bøvlede er at få fjernet de "slashes" som PHP selv kan vælge at sætte på input fra form-felter.
Avatar billede erikjacobsen Ekspert
29. december 2008 - 15:21 #2
Eller fx http://dk.php.net/manual/en/book.pdo.php - også med parameters.
Avatar billede htx98i17 Professor
29. december 2008 - 15:25 #3
arg hvad er nu det for noget...bras.
Avatar billede htx98i17 Professor
29. december 2008 - 15:27 #4
så mysqli er en class?
Avatar billede erikjacobsen Ekspert
29. december 2008 - 15:30 #5
Ja. Nye tider. Ik'?  ;)

mysqli kan også bruges uden "class" - der er to måder. Den ene ligne så den gamle måde at kalde funktioner på.
Avatar billede htx98i17 Professor
29. december 2008 - 15:35 #6
suk...

jeg orker næsten ikke at skal igang med det? desuden skal jeg så have en tekniker til at compilere det shit ind...
Avatar billede htx98i17 Professor
29. december 2008 - 15:49 #7
nå men tilbage til spørgsmålet
Avatar billede erikjacobsen Ekspert
29. december 2008 - 16:13 #8
"Kan man ikke: mysql_query(mysql_real_escape_string($sql)) "  - nej! Du skal - hvis du gør det på denne måde - gøre det på hver værdi i '...'.

De bruger sikkert sprintf, fordi det er lettere at læse.

addslashes er ca. det samme som mysql_real_escape_string - den sidste bør bruges, da den "kender til" mysql.
Avatar billede htx98i17 Professor
29. december 2008 - 16:15 #9
Så det er ikke nødvendigt at bruge sprintf() ? det er bare fordi de kan? :)
Avatar billede erikjacobsen Ekspert
29. december 2008 - 16:52 #10
Nej, det er ikke nødvendigt - men det gør det lidt mere overskueligt. Li'som hvis man bruger parameters.
Avatar billede htx98i17 Professor
29. december 2008 - 16:55 #11
thx
jeg ved godt hvad en parameter er, men ved ikke hvad du mener med parameters i denne forbindelse?
Avatar billede erikjacobsen Ekspert
29. december 2008 - 16:57 #12
Som i eksemplet fra http://dk2.php.net/manual/en/mysqli.prepare.php hvor du lægger mærke til ?-et i SQL-sætningen, og anvendelsen af metoden bind_param.
Avatar billede htx98i17 Professor
29. december 2008 - 17:14 #13
undskyld jeg siger det, men hold da op hvor er det omstændigt? det gider jeg godt nok ikke hehe
Avatar billede erikjacobsen Ekspert
29. december 2008 - 17:16 #14
Ja, så får du ikke job hos mig. Det er et ganske naturligt krav at stille.
Avatar billede htx98i17 Professor
29. december 2008 - 17:17 #15
så det godt jeg skal leve af at være pædagog og ikke programmør hehe

men kan årsagen til al den omstændighed formuleres ganske kort?
Avatar billede htx98i17 Professor
29. december 2008 - 17:54 #17
Så den korte forklaring er at den omstændighed er for at undgå sql injections?
is that it ? :)
Avatar billede erikjacobsen Ekspert
29. december 2008 - 18:03 #18
Det er bl.a. derfor det er et naturligt krav at stille - sql-injections har jo flere gange givet anledning til sjove episoder. Men det er også for at lade systemet selv holde styr på datatyper - fx  programmeringssprog med en dato-type.
Avatar billede arne_v Ekspert
29. december 2008 - 18:03 #19
Der er 4 fordele ved parameters/prepared statement:
1)  du undgår problemer med legale data med ' i f.eks. O'Toole
2)  du undgår SQL injection
3)  du undgår problemer med dato formater
4)  du vil i mange tilfælde få bedre performance

(jeg er ikke helt klar over hvorvidt #3 og #4 gælder for PHP)
Avatar billede htx98i17 Professor
29. december 2008 - 18:16 #20
okay tak
så hvis jeg bruger mysql_real_escape_string() på hvert felt, så er det vist fint :)
Avatar billede erikjacobsen Ekspert
29. december 2008 - 18:22 #21
Både og - hvis værdien kommer fra et felt i en form (eller querystring, eller cookie), kan der allerede være sat \-ere på, og så gør du dobbelt arbejde.
Avatar billede arne_v Ekspert
29. december 2008 - 18:25 #22
Der er også folk som synes at en Ford T er en fin bil !
Avatar billede olebole Juniormester
29. december 2008 - 18:29 #23
<ole>

Der er i virkeligheden langt mindre arbejde - og væsentligt færre bekymringer - ved at bruge mysqli. Det væsentlige arbejde ved programmering ligger ikke i at skrive 'de par tegn', koden består af  ;o)

/mvh
</bole>
Avatar billede htx98i17 Professor
29. december 2008 - 18:29 #24
erik-> men sql injections er stadig forhindret.

hvad er der nu galt med en Ford T?
Avatar billede erikjacobsen Ekspert
29. december 2008 - 18:30 #25
Til min kommentar mangler et link:  http://php.net/get-magic-quotes-gpc  - se eksemplet
Avatar billede erikjacobsen Ekspert
29. december 2008 - 18:31 #26
"men sql injections er stadig forhindret." måske - kun måske - hvis du har husket det hver eneste gang. Det slipper man for at tænke på med "vores" metode. Og for en kritisk kunde, vil man kunne "bevise", at der ikke er problemer med sql-injections.
Avatar billede erikjacobsen Ekspert
29. december 2008 - 18:32 #27
"Ford T" - kan sikkert ikke køre på blyfri benzin.
Avatar billede htx98i17 Professor
29. december 2008 - 18:34 #28
Hvis jeg skulle leve af det eller udover at være pædagog blot var nørdet nok (undskyld på forhånd, men at være nørdet er for mig ikke nedværdigende), så ville jeg nok også benytte mig af mysqli. Eller hvis jeg skulle lære mysql forfra.

jeg kan godt se det fra jeres syn :)
Avatar billede erikjacobsen Ekspert
29. december 2008 - 18:38 #29
Det er ikke spor nørdet. Det er almindeligt håndværk.
Avatar billede htx98i17 Professor
29. december 2008 - 18:39 #30
men den kører, indtil nogen kommer blyfri på
Avatar billede erikjacobsen Ekspert
29. december 2008 - 18:44 #31
Og så skal jeg lige huske at sige til dig, at talfelter også kræver opmærksomhed med din metode - det er også en fin indgang for sql-injektion for folk med skumle hensigter.
Avatar billede htx98i17 Professor
29. december 2008 - 18:50 #32
hvordan erik?
sikke en dejlig masse viden jeg får mig idag :)
Avatar billede erikjacobsen Ekspert
29. december 2008 - 18:59 #33
Jah, ved at sikre dig at det er et tal...
Avatar billede htx98i17 Professor
29. december 2008 - 19:02 #34
Jeg læser dit indlæg som at man med tal gennem formfelter også kan give sqlinjections?
Avatar billede erikjacobsen Ekspert
29. december 2008 - 19:13 #35
Hvad som helst input fra brugeren, der direkte eller indirekte havner i en SQL-sætning, har potentialet for SQL-injection.
Avatar billede htx98i17 Professor
29. december 2008 - 22:41 #36
jeg er interesseret i at vide hvordan talfelter i det du kalder min metode, kan lave sqlinjections
Avatar billede arne_v Ekspert
29. december 2008 - 22:55 #37
UPDATE konto SET point=$point WHERE brugernavn='$brugernavn'

her er point et tal felt.

Men hvis $point indeholder:

100 WHERE TRUE --

så bliver kommandoen til:

UPDATE konto SET point=100 WHERE TRUE -- WHERE brugernavn='foobar'

og så er der vist blevet uddelt lidt rigeligt point !
Avatar billede erikjacobsen Ekspert
29. december 2008 - 22:59 #38
Hvis $point indeholder
  100 WHERE TRUE --
og du har en
  $stmt->bind_param('i', $point);
vil der aldrig kunne ske en sql-injection.

Men skulle "100 WHERE TRUE --" nå frem til det sted, er der nok noget andet galt ;)
Avatar billede htx98i17 Professor
29. december 2008 - 23:02 #39
det der "WHERE TRUE --" forstår jeg ikke lige hvad betyder

men det ville mysqli kunne forhindre at det laver skade?
Avatar billede htx98i17 Professor
29. december 2008 - 23:05 #40
jeg kan nu heller ikke se hvordan det skulle kunne komme så vidt i den almindelige metode... man sikrer sig jo at variablerne indeholde det de skal.

arne, ole, (erik) lig et svar
tak for en god tråd
Avatar billede erikjacobsen Ekspert
29. december 2008 - 23:06 #41
-- starter en kommentar

Derfor vil
  UPDATE konto SET point=100 WHERE TRUE
udføre en update på alle poster i tabellen konto.

mysqli med parametre vil i mit eksempel forvente at $param indeholder et heltal ('i'), og derfor aldrig indsætte en streng.
Avatar billede erikjacobsen Ekspert
29. december 2008 - 23:09 #42
"jeg kan nu heller ikke se" - men det sker alligevel en gang imellem. Du har måske tænkt på den direkte vej fra brugeren til tabellen, men måske er der den indirekte vej, hvor data kommer fra et felt i en tabel, og bliver brugt igen i en SQL-sætning.

Men det er inderligt ligegyldigt. Problemet med SQL-injections løses 100%, og uden sved på panden, ved at bruge parameters (eller tilsvarende). Så kan man bruge sine kræfter på resten af systemet.
Avatar billede erikjacobsen Ekspert
29. december 2008 - 23:10 #43
Ingen point til mig, tak.
Avatar billede arne_v Ekspert
29. december 2008 - 23:17 #44
mysqli og prepared statement beskytter mod teknikken

escape string og addslashes beskytter muligvis mod teknikken - det kan man jo undersøge

SQL injection sker desværre en gang imellem. En af de mest kendte sager var Valus:
  http://www.computerworld.dk/art/17176
hvor man ved at angive SHUTDOWN i en passende URL kunne få database serveren til at lukke ned !
Avatar billede arne_v Ekspert
29. december 2008 - 23:17 #45
og et svar fra mig
Avatar billede olebole Juniormester
30. december 2008 - 02:39 #46
Jeg forstår til en vis grad, at du synes, det er irriterende at skulle til at lære PHP'e MySQL håndtering om igen og fra bunden (selvom det faktisk langtfra er tilfældet). Det syntes jeg selv ved første øjekast, men blev lynhurtigt meget klogere!

Tro mig (, Arne og Erik - samt utallige andre): Det bliver faktisk meget lettere at kode PHP/MySQL i sidste ende ... og det er ret hurtigt lært  ;o)
Avatar billede htx98i17 Professor
30. december 2008 - 08:59 #47
det kan også godt ske at jeg bider det i mig en dag ogkigger på det :)

tak for deltagelsen
Avatar billede erikjacobsen Ekspert
30. december 2008 - 10:07 #48
Avatar billede olebole Juniormester
30. december 2008 - 18:25 #49
Tak for points  ;o)
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
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

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