Avatar billede ottomanelleve Nybegynder
06. januar 2009 - 14:07 Der er 22 kommentarer og
2 løsninger

SQL-udtræk og AJAX

Hej.

Jeg har et script, der sender bud(?) efter en fil indeholdende en SQL-forespørgsel. Forespørgslen sorteres så ved hjælp af noget lignende $GET_['sortBy'], så der altså i URLen kommer til at stå, hvilket felt, der skal sorteres efter.

Er der nogen sikkerhedsrisiko, ved direkte at fortælle, hvilke felter jeg har i databasen, eller er det ligemeget?
Og er der eventuelt en smartere måde at lave et AJAX-udtræk (hvis det hedder det) på?
Avatar billede jensgram Nybegynder
06. januar 2009 - 14:23 #1
Der er ikke direkte noget farligt i at oplyse kolonnenavne. Det _kan_ derimod være farligt, hvis du ikke validerer input:

E.g. (PHP)

...sql('SELECT ... ORDER BY ' . $_GET['sortBy']);

Forestil dig $_GET['sortBy'] = "etFelt; DUMP TABLE brugere;" FØJ! :)
Avatar billede ottomanelleve Nybegynder
06. januar 2009 - 14:33 #2
Aah ja. Det kan jeg godt se. Det ville ikke være godt. Noget af min php/sql-barnelærdom må være gået tabt der - er det en php-funktion du har skrevet? sql()? Som validerer en sql-sætning?
Avatar billede ottomanelleve Nybegynder
06. januar 2009 - 14:34 #3
Hov, eller er det bare ligesom mysql_query()?
Avatar billede melieha Nybegynder
06. januar 2009 - 14:42 #4
Du kunne jo give felterne dæknavne eller lignende, måske bare numre, og så køre igennem at hvis sortBy=1 skal sortby variablen (I stedet for at bruge _GET direkte) være "username".
Avatar billede olebole Juniormester
06. januar 2009 - 14:48 #5
<ole>

sql-funktionen er bare pseudokode ... et eksempel.

Én eller anden form for identifier skal jo sendes med til klienten, så denne ved, hvad den skal stille op med de forskellige data, der hentes. Til det bruges meget ofte feltnavnene - f.eks:

<dataset>
    <user id="123">
        <username>olebole</username>
        <sex>male</sex>
        <age>53</age>
    </user>
    <user id="234">
        <username>hendeder</username>
        <sex>female</sex>
        <age>42</age>
    </user>
</dataset>

- eller i JSON:

{
    users:[
        {id:123, username:"olebole", sex:"male", age:"53"},
        {id:234, username:"hendeder", sex:"female", age:"42"}
    ]
}

/mvh
</bole>
Avatar billede ottomanelleve Nybegynder
06. januar 2009 - 14:51 #6
Nja...er det ikke lidt at give en falsk tryghedsfølelse. Men selvfølgelig løser det problemet med at oplyse feltnavne, jeg tænkte bare, der må være en mere sikker løsning. Det er nok det med at validere inpunt, jeg skal arbejde på.
Avatar billede ottomanelleve Nybegynder
06. januar 2009 - 14:56 #7
@olebole

Så er vi ude i noget xml eller hvad - som AJAX vel også er lavet til, men jeg requester en php-fil, der sender html tilbage til mig, som så bare skal vises i et eller andet element. Altså er det bare nogle data, der skal vises. Er det forkert?
Avatar billede jensgram Nybegynder
06. januar 2009 - 14:58 #8
Ja, "...sql()" var bare et eksempel :)
Avatar billede jensgram Nybegynder
06. januar 2009 - 14:59 #9
I det omfang du benytter innerHTML til at "vise" denne HTML er det forkert, ja.

olebole er HELT SIKKERT villig til at forklare :p
Avatar billede jensgram Nybegynder
06. januar 2009 - 14:59 #10
Indtil da kan du læse hans artikel http://www.dengodekode.dk/artikler/DOM/no_innerhtml.php
Avatar billede ottomanelleve Nybegynder
06. januar 2009 - 15:03 #11
Okay :)
Ja, jeg har faktisk lige siddet og læst det. Og forsøgt mig med noget appendChild og replaceChild - og createTextNode(men den laver jo bare tekst).
Så nu ved jeg ikke rigtig, hvad jeg skal gøre, hvis jeg ikke må bruge innerHTML:)
Avatar billede jensgram Nybegynder
06. januar 2009 - 15:19 #12
Det er altså absolut heller ikke min stærke side. Som jeg har forstået kan man gribe det sådan an, at data overføres som JSON og man herefter opbygger et DOM-træ baseret herpå. Hertil kan oprettes et element for en tabalrække som klones og fyldes med data.

Der _må_ være hajer tilstede på Eksperten...
Avatar billede olebole Juniormester
06. januar 2009 - 15:27 #13
createElement og cloneNode er ret anvendelige DOM-metoder - f.eks:

var oContainer = document.getElementById("minContainer");
var oElm = document.createElement("div");
var oTxt = document.createTextNode("blabla");
oContainer.appendChild(oElm);
oElm.appendChild(oTxt);

At udskrive HTML på serveren tager i _bedste_ fald 4-5 gange så lang tid som at udskrive JSON, så det bør slet ikke falde nogen ind!  ;o)

Du kan evt. kikke lidt i denne tråd, hvor jeg har vist et par små eksempler:
    http://www.eksperten.dk/spm/817625
Avatar billede ottomanelleve Nybegynder
06. januar 2009 - 15:34 #14
Jamen så må jeg jo hellere prøve at finde ud af noget i den retning:)
JSON...hvor kan man ellers bedst lære noget om det?

olebole og jensgram, hvis I lige smider et svar så får I nogle points...
Tak for hjælpen.
Avatar billede olebole Juniormester
06. januar 2009 - 15:42 #15
Den officielle reference ligger her:
    http://json.org/

En lille Eksperten artikel om JSON:
    http://www.eksperten.dk/artikler/1053

En artikel om arrays og objects i JavaScript (som er grundlaget for JSON):
    http://www.eksperten.dk/artikler/227
Avatar billede olebole Juniormester
06. januar 2009 - 15:51 #16
PS: 'hans' egen XMLHttpRequest-wrapper:
    http://dengodekode.dk/artikler/ajax/xmlhttprequest_wrapper.php

- er i øvrigt den bedst opdaterede og mest 'økologiske', jeg har set på nettet ... og jeg har faktisk tjekket ret nøje ud, hvad der findes  =)
Avatar billede ottomanelleve Nybegynder
06. januar 2009 - 15:57 #17
Tak for det.
Så mangler jeg bare at finde ud at, hvordan jeg beskytter mig mod sql-injections. Det må jeg kunne læse mig til...
Avatar billede jensgram Nybegynder
06. januar 2009 - 16:02 #18
Jeg ville nok lave mine egne aliaser:

$sortby = array(
  'navn' => 'username',
  'alder' => 'birthdate',
  ...
);

if (isset($_GET['sortBy'], $sortby[$_GET['sortBy']]) {
    // herinde er $sortby[$_GET['sortBy']] sikker
}
Avatar billede olebole Juniormester
06. januar 2009 - 16:02 #19
I dag er den bedste måde at bruge MySQL på under PHP klart at bruge prepared statements (mysqli):
    http://dk2.php.net/manual/en/book.mysqli.php

Begynd f.eks. med eksemplerne her:
    http://dk2.php.net/manual/en/mysqli.prepare.php
Avatar billede jensgram Nybegynder
06. januar 2009 - 16:03 #20
Det skal naturligvis nævnes, at array'ets nøgler er valide værdier for ?sortBy=..., e.g. ?sortBy=navn
Avatar billede jensgram Nybegynder
06. januar 2009 - 16:04 #21
olebole > De fattige studerende glæder sig til at få den mulighed på de billige hoteller :)
Avatar billede olebole Juniormester
06. januar 2009 - 16:16 #22
De ska' zq bare ud og slæve nogle frossne brædder, ska' de!  ;D
Avatar billede olebole Juniormester
06. januar 2009 - 16:17 #23
- men det kommer forhåbentlig også snart på de billige steder, Jens  ;o)
Avatar billede jensgram Nybegynder
06. januar 2009 - 16:26 #24
Jep!

Men det var vist lidt O/T.

Hermed svar.
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