Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: PHP - SQL - LIKE injektio-ongelma

Sivun loppuun

jyp65 [05.12.2011 22:37:48]

#

Alla olevalla kooodilla kaikki toimii ok (haetaan lomakkeelta pari tietoa ja muodostetaan niiden avulla AND - LIKE kysely).

$nimi2 = $_GET["nimib"];
$tehtavab = $_GET["tehtava2"];

$kysely = "SELECT * FROM henkilo WHERE nimi LIKE '%$nimi2%' AND tehtava LIKE '%$tehtavab%' ORDER by nimi";

Jos muutan ylimmän rivin muotoon:

$nimi2 =  mysql_real_escape_string($_GET["nimib"]);

Listaa kaikki nimib kentästä haetut tiedot. Ilmeisesti tuota SELECT lausetta pitäisi jotenkin muuttaa, koska siinä on LIKE, mutta miten. Eli sql-injektiota yritetään estää.

Etukäteen kiittäen....

Metabolix [05.12.2011 22:45:55]

#

Kyllä sen pitäisi ihan noin escapen kanssakin toimia. Oletko varmasti yhdistänyt tietokantaan ennen funktion kutsumista?

Debuggauksen alkeet, muista nämä jatkossa:
1) Tulosta kysely. Näyttääkö oikealta?
2) Laita virheilmoitukset käyttöön.

jyp65 [06.12.2011 00:14:15]

#

Kiitos taas Metabolix. Tietokantaan yhdistys oli jäänyt vasta kyselyn jälkeen suoritettavaksi. Toimi silti ilman tuota escapea, siksi en osannut ko. juttua hakea. Paljon vielä oppimista edessä. Nyt kuitenkin toimii funktion kanssa...

The Alchemist [06.12.2011 07:49:53]

#

jyp65 kirjoitti:

Kiitos taas Metabolix. Tietokantaan yhdistys oli jäänyt vasta kyselyn jälkeen suoritettavaksi. Toimi silti ilman tuota escapea, siksi en osannut ko. juttua hakea. Paljon vielä oppimista edessä. Nyt kuitenkin toimii funktion kanssa...

Kysely ei voi toimia ilman tietokantayhteyttä. Olet aivan varmasti yhdistänyt kantaan ennen kyselyn suorittamista, tai mistään ei olisi tullut yhtään mitään.

Metabolix tarkoitti, että yhteys pitää olla jo ennen mysql_real_escape_string-funktion kutsumista, koska se käyttää MySQL:ä itseään escapetuksen suorittamiseen, ja siten vaatii tietokantayhteyden. Toki se myös tarpeen vaatiessa yrittää luoda oletusyhteyden, mutta harvalla palvelimella on konffattu yhteysasetuksia php.iniin.

Grez [06.12.2011 11:16:03]

#

Eipä tuo oikein voi toimia huonommin sen jälkeen kun lisäät tuon escapen. Etsi ongelmaa jostain muualta. Ja muista laittaa escape myös toiselle muuttujalle.

Metabolix [06.12.2011 12:01:23]

#

Grez kirjoitti:

Eipä tuo oikein voi toimia huonommin sen jälkeen kun lisäät tuon escapen.

Kyllä se voi, koska jos ei ole yhteyttä tietokantaan, mysql_real_escape_string epäonnistuu ja palauttaa falsen.

The Alchemist kirjoitti:

jyp65 kirjoitti:

Tietokantaan yhdistys oli jäänyt vasta kyselyn jälkeen suoritettavaksi.

Kysely ei voi toimia ilman tietokantayhteyttä. Olet aivan varmasti yhdistänyt kantaan ennen kyselyn suorittamista, tai mistään ei olisi tullut yhtään mitään.

Varmaan oli kyse tästä muuttujan $kysely alustamisesta eikä itse kyselyn suorittamisesta.

makumaku [06.12.2011 12:19:34]

#

Tuo aloitusviestissä oleva pätkä voi tietenkin olla vain pelkkää kokeilu- ja testikoodia. Mutta kannattaa myös hieman miettiä muuttujien, indeksien ja muiden nimien nimeämistä. Ne olisi hyvä pitää selvyyden vuoksi aina loogisina ja mahdollisuuksien mukaan samoina. Muuten on vaara että vähänkin suuremmassa sovelluksessa jokin menee vahingossa ristiin.
Eli jos tietokannassa on kenttä tehtävä, niin nimeä voi kuljettaa samana lomakkeelta tietokantaan asti.

$nimi = $_GET["nimi"];
$tehtava = $_GET["tehtava"];
$kysely = "SELECT * FROM henkilo WHERE nimi LIKE '%$nimi%' AND tehtava LIKE '%$tehtava%' ORDER by nimi";

Nythän tuossa aloitusviestissä nämä 2:t ja b:t menee vielä mukavasti ristiinkin.

Grez [06.12.2011 12:28:16]

#

Metabolix kirjoitti:

Grez kirjoitti:

Eipä tuo oikein voi toimia huonommin sen jälkeen kun lisäät tuon escapen.

Kyllä se voi, koska jos ei ole yhteyttä tietokantaan, mysql_real_escape_string epäonnistuu ja palauttaa falsen.

Joo totta, katsoin että siinä olisi suoritettu kysely kantaan, mutta sehän laittoikin sen vaan muuttujaan.


Sivun alkuun

Vastaus

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

Tietoa sivustosta