Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Muuttujien käyttö haettaessa tietokannasta

Sivun loppuun

Triskal [11.10.2004 17:02:27]

#

$kysely = "SELECT * FROM arviot where yhtye like '$kirjain%' order by yhtye";

Tämän pitäisi minun järkeilyni mukaan hakea muuttujana annetun alkukirjaimen mukaan tietokannasta bändejä. Mutta hän ei suvaitse. Jos arvona on vaikka a, niin skripti hakee kaikki. Jos otan villikortin (%) pois, ei muutosta. Jos otan heittomerkit pois, tulee virhe.

Koko koodi:

<p><b>
<a href="?page=arviot&kirjain=a">A</a>
</b></p>

<?php

$yhteys=mysql_connect("localhost", "root") or die("Yhdistäminen ei onnistunut");
mysql_select_db("arviot", $yhteys) or die("Tietokantaa ei löytynyt");

//haetaan kaikki tavarat
$kysely = "SELECT * FROM arviot where yhtye like $kirjain order by yhtye";
//suoritetaan kysely
$haku = mysql_query($kysely, $yhteys) or die("Virhe kyselyssä!");

echo "<table>";
echo "<tr><td><b>Yhtye</b></td><td><b>Levy</b></td><td><b>Levy-yhtiö</b></td><td><b>Pisteet</b></td></tr>";
//käydään tavarat läpi
for ($i = 0; $i < mysql_num_rows($haku); $i++) {
   //haetaan arvot muuttujiin
   $yhtye = mysql_result($haku, $i, "yhtye");
   $levy = mysql_result($haku, $i, "levy");
   $yhtio = mysql_result($haku, $i, "yhtio");
   $pisteet = mysql_result($haku, $i, "pisteet");
   //tulostetaan taulukon rivi
   echo "<tr><td>$yhtye</td><td>$levy</td><td>($yhtio)</td><td>$pisteet</td></tr>";
}
echo "</table>";


mysql_close("yhteys");

?>

EDIT: sekoilin ja piti muokkailla. Eli kysymys kuuluu, kuinka tuon iiiihan ylimmäisen rivin saisi palauttamaan toivotun vastauksen?

Wizard [11.10.2004 17:16:50]

#

Koodia sen enempää lukematta, pistä SQL kysely muotoon:

<?php

$kysely = "SELECT * FROM arviot where yhtye like '".$kirjain."%' order by yhtye";

?>

Triskal [11.10.2004 17:59:55]

#

Sorry, ei telmi noinkaan. Listaa edelleen ihan kaiken. Voisikohan vika sittenkin olla koodissa? Osaako php hakea muuttujan osoiteriviltä noin vain, vai tarvitaanko sen hakemiseen joku funktio?

Opiskelija [11.10.2004 18:51:12]

#

Vika on siinä, et palvelimella register_globall = off jolloin $kirjain ei saa suoraan arvoa, joten sen tilalla pitää käyttää:

$_GET['kirjain']

Toi kysely listaa kaiken, koska kaikki rivit vastaavat yhtye LIKE '%'

if (isset($_GET['x']))
echo "$kysely<br>";

Laitappas tämmönen rivi koodiisi, kutsumalla scriptiä lisäät perään ?x=1 jolloin näät kyselyn, helpottaa huomattavasti virheiden tutkimista. Tai vaihtoehtoisesti voit tehdä tietokanta function, jossa on toi tulostamis ominaisuus jne...

leftover [11.10.2004 20:00:36]

#

Ja sitten taas vanhan gupan tietoturvakoulutusta osa 666.666: ei näin...

Oli tietokannassa sitten vain mummon koirien nimet tai valtion salaisuuksia, aina pitää olettaa seuraavaa:
a) käyttäjää ei kiinnosta
b) käyttäjä on innokas kokeilemaan
c) käyttäjän virtuaalipippeli kasvaa jokaisesta haksotusta tietokannasta

Ja toimia seuraavasti:
a) Varmistaa että käyttäjältä tulee edes jotain
b) varmistaa että käyttäjä pysyy mahdollisimman tiukkojen rajojen sisällä
c) käyttää sitä julmetun mysql_escape_string -funktiota ennen kuin menee tunkemaan syötteitä kantaan...

Nyt käyttäjästä on kivaa kun palvelu pelaa aivan kuten pitääkin ja webmaster voi nukkua yönsä rauhassa kun tietää ettei käyttäjä voi syöttää alikyselyitä admin-tauluun.

End of osa 666.666.

Triskal [11.10.2004 20:44:51]

#

No kekkula. Nyt toimiipi, eli kiitän paljon (taas).

Leftover, olen tosi amatööri, en siis paljoa ymmärrä. Meinasin että teen ensin enginen valmiiksi ja sitten mietin tietoturvaa. Kun sekin on kondiksessa, niin julkaisen sivuston. Nuo listaamasi prinsipaalithan ovat itsestäänselvyyksiä. Olisiko sinulla jokin kiva tutoriaali asian tiimoilta jonka voisi käydä lukaisemassa?

leftover [12.10.2004 07:33:58]

#

Kumma kyllä, tutoriaaleja webissä tältä saralta on hyvin vähän. Johtuneeko sitten siitä että aiheesta ei saa tutoriaalia vai jostain muusta. Itse suosittelisin kuitenkin ottamaan tietoturvan huomioon jo enginessä, jolloin sivustoa pyöritellessä voit aivan huoletta laittaa muuttujia käyttäjiltä omiin funktioihisi / luokkiin.

Joitain peruslinjauksia:

<?php

// Halutaan kokonaislukuja
if (isset($_GET['x'])) {
   $x = intval($_GET['luku']);
}

// Halutaan murtolukuja
if (isset($_GET['x'])) {
   $x = $_GET['x'];
   settype($x, "float");
}

// Halutaan a, b tai c
if (isset($_GET['x'])) {
   switch ($_GET['x']) {
      case "b": $x = "b"; break;
      case "c": $x = "c"; break;
      default: $x = "a"; break;
   }
}

// Hyväksytään alfanumeerinen syöte
if (isset($_GET['x'])) {
   $x = get_magic_quotes_gpc() ? $_GET['x']: mysql_escape_string($_GET['x']);
}

?>

Viimeisen esimerkin toimivuudesta en ole varma, ikinä en muista päästikö ?-operaattori muuttujan liukumaan vasemmalle ja kumpi tuli ensin, tosi vai epätosi. Mutta peruslinjaukset oli siis PHP:n puolelta siinä, noista on hyvä lähteä soveltamaan.

MySQL:n turvallisuuteen auttaisi kummasti jos saisi luoda käyttäjän jolla ei olisi ainakaan DROP TABLE / DATABASE sekä ALTER TABLE oikeuksia, valitettavasti tämä on vain liian harvoin mahdollista. Jos on mahdollisuus säätää käyttäjän oikeuksia, kannattaa harkita myös DELETE poistoa oikeuksista, jolloin tietue vaatii enabled TINYINT(1) UNSIGNED -tyylisen kytkimen jolla kontrolloidaan sen näkyvyyttä.

Jos joku tietää tutoriaaleja, olisin itsekin niistä kiinnostunut. Kantapääkoulu opettaa hyvin, mutta varmasti minullakin on aukkoja tiedoissani.

Opiskelija [12.10.2004 08:52:55]

#

Tämmösen linkin löysin jostain aikoja sitten, ihan hyödyllistä tietoa sisältää.

http://shiflett.org/php-security.pdf


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta