Minulla on kysely, johon pitäisi mahtua "WHERE aiheid = joku" ja "SORT BY aika", mutta en tiedä miten ne mahduttaa kyselyyn. Olen kokeillut monia vaihtoehtoja, mutta aina mysli valittaa syntaksista. Tuossa ois siis se mitä tarkoitan:
SELECT * FROM viestit WHERE aiheid = $id SORT BY aika
Kiitos jo etukäteen avusta..
Järjestely tapahtuu sanan ORDER avulla, joten oikea muoto kyselystä on:
SELECT * FROM viestit WHERE aiheid = $id ORDER BY aika
Riippuen siitä halutaanko uusimmat vai vanhimmat ensiksi lisävinkkinä vielä käänteinen järjestys:
SELECT * FROM viestit WHERE aiheid = $id ORDER BY aika DESC
Voi minua.. Mistähän minä tuon sortin pierasin? Kiitos!
Ja hipsujen käyttö! Opetelkaa nyt perkele käyttämään niitä.
Se ei paljoa kasvata skriptin kokoa mutta parantaa tietoturvaa silti reippaasti.
Hmmm, Juhis.... Missä kohtaa tuossa lauseessa tulisi mielestäsi käyttää hipsuja?
Oikeassa olet hipsujen suhteen, mutta tässä tapauksessa ei kyllä hipsuja tarvita: id on ilmeisesti numeerinen ja muut ovat sarakenimiä tai SQL komentoja.
skripti.php?id=tähän omia mysql komentoja.
Jos siis register globals on käytössä. PHP:ssä oletuksena pois päältä.
Jos ei ole hipsut käytössä, nuo komennot toteutuvat. Poikkeuksena ; merkki jota ei suoriteta mysql_query() funktiossa.
Suosittelen hipsujen käyttöä _AINA_ kun tietokantahaussa käytetään jotain muuttujaa. Oli se sitten numeraalinen, alphanumeraalinen tai alphabeettinen (onko tää viiminen edes suomalainen vastine alphabeticille? xD)
Ja turvallisuus ei ole koskaan pahaksi. Oli kyseessä sitten kuinka pieni ja mitätön skripti.
Edit(Ajatusvirhe)
Hmm voitko hieman selittää miten ne hipsut tuossa tapauksessa tietoturvaa parantaa?
Jos siis tarkoitit että lause olisi muotoa
"SELECT * FROM viestit WHERE aiheid = '" & $id & "' ORDER BY aika"
Niin eikö edelleenki voi pistää että
viestit.php?id=0' OR '1'='1
tai
viestit.php?id=0' UNION ALL SELECT nimi, salasana FROM kayttajat WHERE ''='
http://www.spidynamics.com/papers/
Hipsut estävät noiden omien tietokantahakujen teon.
"SELECT * FROM viestit WHERE aiheid = '" & $id & "' ORDER BY aika" => "SELECT * FROM viestit WHERE aiheid = '$id' ORDER BY aika"
Ja jos ei tuollaisena riitä, niin addslashes() funkkari myös käyttöön etc.
<offtopic>
Ja hei eikö olisi kivaa jos kaikki informaatio internetissä olisi plain text muodossa eikä pdf:nä. Nyt kyllä jää arvailujen varaan mitä tuolla antamasi linkin toisessa päässä on, koska noita saatanan pdf:iä tueta. Perkele.
plain text aukeaa nopeasti eikä pistä konetta solmuun.
</offtopic>
Nojoo siinä on vain hieman selitetty noi SQL haavoittuvuuksia, lähinnä vain lisäinfoa jos kiinnosta.
Edeleenkin tuosta viestit.php?id=0' OR '1'='1 tulee
"SELECT * FROM viestit WHERE aiheid = '0' OR '1'='1' ORDER BY aika" eikö?
Joo ja ei.
Nyt ei enää aivot toimi, heitän silti illan viimeisen koodin.
<?php $id = addslashes(mysql_escape_string($_GET['id'])); if(is_numeric($id)) { $query = @mysql_query("SELECT id FROM taulu WHERE id='$id' ORDER BY aika"); while($result = @mysql_fetch_array($query)) { echo $result[id]; } ?>
Tuon pitäisi jo olla aika turvallinen.
Juhis - tuo $id on numeerinen. Jos yrität tarjota ehtoon varchar arvoa se ei luultavasti toimi oikein (en tosin ole varma MySQL:stä, mutta Oraclessa ja MS SQL Serverillä tuo syntaksi on susi).
SQL-lauseen sisällä hipsuja tulisi käyttää vain varchar-tyyppisissä ehdoissa - ei numeerisissa.
Oletetaanpa, että id on varchar-tyyppinen. Millä tavalla tuo estää omien hakujen teon? Voithan aina kirjoittaa urliin suoraan id:n eikä hipsut sitä estä. Haku toteutetaan aina annettujen parametrien perusteella hipsuista riippumatta.
Ainoa mihin hipsut vaikuttaa on se, että ei voida asettaa hakuehdoiksi esim. sarakenimiä. Tämä taas on estetty esimerkkisi "if(is_numeric($id))"-lauseella ja näin sarake nimi ei täytä ehtoa.
Asetettaessa hakuehdoksi taas string tulee niitä hipsuja käyttää syntaksin vuoksi joka tapauksessa ja siten sarakehaku ei onnistu.
Joka tapauksessa ton dokumentin tapaukset edellyttävät sovelluksen taustalla toimivan tietokannan hyvää tuntemusta.
Hyviin webkoodaustapoihin ei kuulu parametrien lähettäminen avoimina urlissa vaan tulisi vähintään käyttää urlenkoodausta parametrien piilottamiseksi.
Syötetyt parametrit tulee aina tarkistaa ennen niiden konkatenoimista ja tulokset tulee tarkistaa.
Itse käytän joka tapauksessa COM+ tekniikan kautta Stored Procedureja, jotka antavat huomattavasti paremman suoritustehon ja näin ei yhtään kyselyä rakenneta www-sivulla vaan vasta tietokannan päässä - se vähentää mm. www-palvelimen ja tietokannan välisiä transaktioita huomattavasti.
Antti kirjoitti:
SQL-lauseen sisällä hipsuja tulisi käyttää vain varchar-tyyppisissä ehdoissa - ei numeerisissa.
Sitä tulisi käyttää _jokaisessa_ haussa jossa käytetään muuttujaa. Yhtä hyvin minä voisin ripustaa kotiavaimeni aina oven yläpuolelle.
Itse käytän jokaisessa haussa hipsuja, eikä se ole ollut pahitteeksi kun ollaan koitettu lähettää selaimella tietoa jolla saisi tietokannan kumoon etc.
Antti kirjoitti:
Haku toteutetaan aina annettujen parametrien perusteella hipsuista riippumatta.
Tottakai, mutta kun niiden hipsujen sisällä olevaa koodia ei suoriteta, vaan niiden perusteella haetaan sitä informaatiota tietokannasta. En tiedä miten muissa tietokannoissa on, mutta ainakin MySQL:llä voi hakea numeraalista informaatiota ihan hyvin hipsujenkin kanssa.
Liika tietoturva ei ole koskaan pahitteeksi.
Liika paranoidisuuskaan ei ole koskaan pahitteeksi.
Ei saa olla idiootti ja jättää oravan mentäviä reikiä softaan jos osaa korjata ne. Se on aivan typerää.
Antti kirjoitti:
Itse käytän joka tapauksessa COM+ tekniikan kautta Stored Procedureja, jotka antavat huomattavasti paremman suoritustehon ja näin ei yhtään kyselyä rakenneta www-sivulla vaan vasta tietokannan päässä - se vähentää mm. www-palvelimen ja tietokannan välisiä transaktioita huomattavasti.
Minun tietääkseni MySQL:ssä ei ole stored procedureja, mikä on huono asia. Mutta saatan toisaalta olla väärässäkin.
Mutta jos nyt ruvetaan miettimään että mitäpä sitä turhaan lisätä 2 hipsua tietokantahakuun, niin päästään samalle tasolle microsoftin tietoturvan kanssa. Windows koneissahan ei ole oletuksena yhtään tietoturvaa, mutta sitä saa laitettua todella helposti.
Olkoot haku sitten kuinka numeraalinen tahansa, minun mielestäni on suotavaa käyttää hipsuja _AINA_ kun hakee tietokannasta jotain ja käyttää muuttujia ehtoina.
edit ( ajatusvirheita ja typoja. 24h valvomista takana :/ )
Kuten jo kertaalleen kirjoitin:
Itse itseäni lainaten:
lainaus:
Juhis - tuo $id on numeerinen. Jos yrität tarjota ehtoon varchar arvoa se ei luultavasti toimi oikein (en tosin ole varma MySQL:stä, mutta Oraclessa ja MS SQL Serverillä tuo syntaksi on susi).
...
Ainoa mihin hipsut vaikuttaa on se, että ei voida asettaa hakuehdoiksi esim. sarakenimiä. Tämä taas on estetty esimerkkisi "if(is_numeric($id))"-lauseella ja näin sarake nimi ei täytä ehtoa.
Liika valvominen ei ole hyväksi - mene nukkumaan välillä ;D
Kannattaa tosiaan käydä nukkumassa välillä, pelkät hipsut kun vaan eivät auta yhtään mitään, eivätkä ne edes toimi MS SQL:n kanssa. (kuten Antti jo totesi numeerisista arvoista)
Tämä aihehan on MySQL:stä, ei MS SQL:stä ;-)
MySQL:n kanssa toimii ja parantaa tietoturvaa.
Meneeköhän tämä jo vähä jankuttamiseksi.
Juhis^ kirjoitti:
MySQL:n kanssa toimii ja parantaa tietoturvaa.
Millä tavalla?
Se ei suorita sen sisällä olevia hakuja vaan hakee niiden perusteella.
Tekstikenttien ollesa kyseessä hipsuja on pakkokin käyttää, tietoturvaa ne tosin eivät paranna siinä yhtään. Numeeristen kenttien ollessa kyseessä is_numeric riittää, hipsut eivät siis paranna tietoturvaa. Huonontavat vain tukea eri SQL ympäristöissä.
Koska väität muuta niin tietysti voit antaa esimerkin missä ne parantaa?
Aihe on jo aika vanha, joten et voi enää vastata siihen.