Avatar billede danielhep Nybegynder
24. februar 2012 - 18:01 Der er 15 kommentarer og
1 løsning

Praktisk spørgsmål vedr. sikkerhed med SQL via URL

Hej alle,


Jeg har et test site på min WAMP localhost server, hvor jeg tester div. sikkerheds ting.  En af disse er SQL Injection.

Jeg forsøger at smide en "insert" sætning igennem, men jeg har det lidt sådan, at jeg vil forstå hvorfor at jeg ikke kan få det til at virke.  Jeg ved at min kode:

$sql = "SELECT * FROM persons WHERE id=".$_GET["pid"];
$result = mysql_query($sql);
while( $row = mysql_fetch_assoc($result) ) {
  // ect ect
}

IKKE lukker af for noget som helst.  Før jeg lukker af for tingene bliver jeg nød til at vide hvorfor at mit "insert" ikke vil virke.

Her er mit bud:

?pid=2; INSERT INTO test_table (name) VALUES ('test')


Er hvad jeg får, men intet indsat til databasen.

Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in C:\wamp\www\uge3\person_details.php on line 36



Er der nogle som ved lidt mere om dette, som kan fortælle hvorfor at jeg ikke kan få dette til at virke?




ps:
Det skal bruges til en guide jeg er ved at skrive i forbindelse med at mine kursister skal lærer om sikkerhed, nærmere SQL Injection.  Derfor mener jeg at det er ret så vigtigt at jeg kan demonstere så de får den opfattelse jeg ønsker de skal have.

Hvis mit spørgsmål ikke er tilladt, så lukker jeg gerne, men håber dog at det er ok.

På forhånd tak.
Avatar billede olebole Juniormester
24. februar 2012 - 18:08 #1
<ole>

Da der er tale om en streng, skal værdien naturligvis escapes med gådeøjne:

$sql = "SELECT * FROM persons WHERE id='".$_GET["pid"]."'";

Når det er sagt, løber det mig - og sikkert enhver anden webudvikler - koldt ned ad ryggen at høre, at en person med et ringe kendskab til SQL skal undervise i sikkerhed! Det lyder overordentlig uansvarligt!

/mvh
</bole>
Avatar billede olebole Juniormester
24. februar 2012 - 18:13 #2
- og når emnet nu er SQL-injection, hvorfor i alverden 'underviser' du så i det dybt forældede MySQL-API, som i den grad er sårbart overfor SQL-injections? Det API hører til i et helt andet årtusinde!

Enhver med bare en smule kendskab til databasesikkerhed bruger i dag Prepared Statements under MySQLI eller PDO.

Hvad er det for kursister, du mener at kunne lære noget?
Avatar billede danielhep Nybegynder
24. februar 2012 - 18:36 #3
Hvis du læser mit spørgsmål igen leder jeg efter en løsning til selve URL injectionen, altså et svar jeg kan afprøve og se det virke. 

Har forsøgt forskellige ting, men igen med success.  Om jeg mangler et tegn et sted er nok muligt.

Rent praktisk synes jeg nu at du plukker frugten for tidligt.
Avatar billede danielhep Nybegynder
24. februar 2012 - 18:37 #4
Har forsøgt forskellige ting, men igen med success.

Ændret til::

Har forsøgt forskellige ting, men "ingen" med success.
Avatar billede olebole Juniormester
24. februar 2012 - 18:44 #5
Jeg plukker ingen frugter for tidligt. Grunden til, at du får den fejl, du får, er, at din SQL er forkert. Dene kan under ingen omstændigheder fungere, hvis $_GET["pid"] indeholder en streng.

Derudover er jeg stadig chokeret over, at du mener dig i stand til at undevise i noget, du ikke aner det første om!
Avatar billede olebole Juniormester
24. februar 2012 - 18:58 #6
Hvis feltet id er et talfelt kan du skrive noget i stil med: pid=2 OR 1=1 -- - naturligvis passende URL-escaped.

Men hvordan vil du forklare dem, de skal beskytte sig mod SQL-injections, hvis du ikke kan udføre en - eller ved, hvorfor den virker? Du tror forhåbentlig ikke, det er gjort med addslashes, mysql_real_escape_string eller den slags?
Avatar billede danielhep Nybegynder
24. februar 2012 - 19:04 #7
Ok Ole lad os lige tage den så!


Dette er materiale som jeg er "i gang med at skrive".  Netop fordi at du sidder med viden om a-z betyder det ikke at alle andre har den samme viden.

Og ja, det er da ikke fedt at undervise i noget man ikke kender 100%, hvorfor tror du ellers at jeg har oprettet dette spørgsmål?


Må jeg så til trods dine svar tilføje at, du ikke rigtigt efter normalt syn på tingene forsøger at hjælpe mig, men mere at tromle lidt på nogle ting som du åbenlyst har en holdning til.


Hvis du har noget som kan give en bedre forståelse for det som du mener jeg burde vide noget om, så ja link, og jeg er på.
Avatar billede danielhep Nybegynder
24. februar 2012 - 19:05 #8
Det kan godt være at jeg er lidt træt og slet ikke er med på hvad du fortæller mig, i så fald undskylder jeg.
Avatar billede danielhep Nybegynder
24. februar 2012 - 19:07 #9
Bare giv mig dit svar, jeg tror at jeg lukker herfra.

Du kan få halvdelen for din tid.

Jeg finder en anden løsning på tingene, jeg er meget træt og kan mærke at der ikke kommer mere konstruktivt fra mig i dag.

At gå ind i et felt som sikkerhed, du har ret det kræver noget mere.  Hvis du kan angive nogle links til noget materiale jeg kan læse på, kan det være at jeg kommer videre med nogle af de ting som jeg ønsker.
Avatar billede danielhep Nybegynder
24. februar 2012 - 19:09 #10
Venter på dit svar ole, indtil jeg uddeler.
Avatar billede danielhep Nybegynder
24. februar 2012 - 19:11 #11
--------------------------------
Men hvordan vil du forklare dem, de skal beskytte sig mod SQL-injections, hvis du ikke kan udføre en - eller ved, hvorfor den virker? Du tror forhåbentlig ikke, det er gjort med addslashes, mysql_real_escape_string eller den slags?
---------------------------------


Bliver bare lige nød til at spørge, tror hvad?

At det lukker af for SQL injections at benytte mysql_real_escape_string?
Avatar billede olebole Juniormester
24. februar 2012 - 19:56 #12
Jeg prøver ikke 'at tromle dig'. Jeg prøver at få dig til at forstå, at databasesikkerhed ikke er noget, man bør lade, hvem somhelst undervise i ... det er det et alt for alvorligt emne til!

Sikkerhed er et meget komplekst emne, som det tager rigtig lang tid at sætte sig ind i. Det er ikke noget, man kan lære i en Eksperten tråd. Derfor er det dybt foruroligende, at nogen tror, man kan undervise i emnet på et så spinkelt grundlag. Når du har beskæftiget dig med det i et par år mere, kan det være, du er rustet til at undervise i emnet.

Og ja, mit spørgsmål gik på, om du tror, at mysql_real_escape_string sikrer mod SQL-injections. Det er nemlig ikke nødvendigvis tilfældet. Det beskytter i nogle tilfælde - i andre gør det ikke. Det er noget lapperi, som prøver at rette op på en i udgangspunktet højst usikker tilgang til SQL-forespøgsler (MySQL's gamle tilgang).

Det eneste begavede middel mod SQL-injections er, at bruge et moderne API, som understøtter prepared statements - f.eks. MySQLI eller PDO. Det betyder ikke, at du er nødt til at bruge en anden database. Det er bare en anden måde at 'tale' med den på.

Faktisk grænser det til det hysterisk morsomme (eller brækværdigt tragiske), når rigtig mange 'udviklere' har frygtelig meget imod at bruge tabeller til layoutformål, eller HTML 3.2 tags som FONT eller CENTER - mens de på den anden side stadig bruger det dybt forældede og sårbare MySQL-API.

Jeg er absolut ikke tilhænger af tabeller til layout eller FONT og CENTER tags, men sammenlignet med brugen af det gamle MySQL-API er de totalt uskadelige!
Avatar billede danielhep Nybegynder
24. februar 2012 - 20:24 #13
Ok, nu kan det godt være at du kommer til at lappe dig en griner over skødet, men så har jeg også givet en joke :)

Kan du give mig en guide til at komme i gang med at benytte det moderne API som understøtter prepared statements?






BTW!
Hvis du vil have dine points, så sig lige til.  Det kan løses.
Avatar billede olebole Juniormester
24. februar 2012 - 20:58 #14
Jeg har ikke samlet points det seneste årstid, men tak for tilbudet  =)

Nu er der jo værre syn end et bredt grinende skød (*hø-hø*) 0:)

En god og letlæst begynder tutorial i MySQLI med preared statements finder du her. Det er et et godt sted at begynde. Derefter er der masser af spændende stof bag det link, jeg skrev i #12.
Avatar billede danielhep Nybegynder
24. februar 2012 - 21:31 #15
hehe :)


Hvad siger du til denne? 
http://www.phpro.org/tutorials/Introduction-to-PHP-PDO.html

og denne:

http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/


bare lige noget jeg fandt, men ville være rart hvis du kunne fortælle om de var totalt håbløse.


Ok, men bare sig til så er points klar.
Avatar billede olebole Juniormester
24. februar 2012 - 22:13 #16
Jeg har ikke kikket dem nærmere efter, men umiddelbart ser de ganske fornuftige ud.

De ting, jeg har linket til, omhandler MySQLI, mens de to, du linker til, omhandler PDO. De to API'er understøtter begge prepared Statements, men er en del forskellige. MySQLI minder en hel del om 'det gamle' MySQL-API og kan kun tale med en MySQL-database. PDO kan derimod tale med forskellige databaser (P for Portable - DO for Data Objects), hvilket er en fordel, når/hvis koden skal afvikles i forskellige miljøer.

De har hver deres fordele og ulemper. Om man vælger den ene eller anden, er i høj grad et spørgsmål om personlige preferencer - udover portabiliteten for PDO.
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