EDIT: POISTIN SIVUSTOT TIETOTURVARISKIN TAKIA, KUN OLISI PITÄNYT KUULEMMA KÄYTTÄÄ 'PARAMETRISOITUJA KYSELYITÄ'.
Tarkoitukseni oli ensin tehdä ja julkaista MySQL ja HTML-koodit tietokanta-sivustosta, mihin pitää rekisteröityä ja minne kukin saa tallettaa esimerkiksi CD-levyjensä tietoja:
Mutta jätin sen homman hieman kesken. Ei kukaan olisi jaksanut lukea lukuisia koodejani ja selostuksiani.
Tein nyt sitten mahdollisimman yksinkertaisen toteutuksen toisenlaisesta kannasta. Kantaan ainoastaan talletetaan eri sanoja (tai itseasiassa merkkijonoja) ja listataan niitä. Tarkoituksena on hieman esitellä sitä, kuinka HTML-lomakkeelta kutsutaan .php koodia ja kuinka .php koodissa viedään sanoja kantaan ja listataan sieltä, jos joku, kuten minä, on melko vasta-alkaja näissä hommissa - tai huonomuistinen, ettei aina muista kuinka hommat tehtiinkään.
Kirjoittakaa sanoja/merkkijonoja kantaan!? :) Odotan mielenkiinnolla minkälaisista sanoista/merkkijonoista kanta täyttyy. Ei ole virhetarkistusta kirosanojen osalta, mutta toivon, että ei kiroilla ja kirjoiteta tuhmia sanoja.
Kannassa on pelkästään yksi 'sanoja' niminen taulu ja siinä yksi sarake 'sana', minkä max-pituus on 100 merkkiä.
Yhteydenotto kantaan kannattaa pistää omaan .php tiedostoon, että se voidaan include käskyllä sisällyttää niihin .php koodeihin joissa kantaa tarvitaan.
yhteyskantaan.php:
<?php // Ota yhteyus kantaan $conn = new mysqli("localhost","SERVERINNIMI","SALASANA","KANNANNIMI"); if ($conn->connect_error) { die("Yhteys tietokantaan epäonnistui " . $conn->connect_error); } ?>
Joudut luonnollisesti kirjoittamaan yllä olevat CAPS:llä kirjoitetut sanat oman MySQL kantasi tiedoilla. En tiedä ovatko nimitykset oikein. Katso tuolta tarkempaa tietoa:
https://www.w3schools.com/php/php_mysql_connect.asp
Pääsivu, index.php tiedosto (ei sisällä php koodia eli olisi voinut olla nimeltään index.html tiedostokin...), sisältää kaksi lomaketta. Toisessa syötetään sanoja kantaan ja toisessa on pelkkä nappi, jolla kannassa olevia sanoja listataan.
index.php:
<!DOCTYPE html> <html> <head> <title>Sanoja</title> </head> <body> <h2>Lisää sana kantaan</h2> <form action="lisaa.php" method="post"> <label for="sana">Sanasi:</label> <input type="text" name="sana" id="sana"><br> <br><button type="submit">Lisää sana kantaan</button> </form> <hr> <form action="listaa.php" method="post"> <br><button type="submit">Listaa kannassa olevat sanat</button> </form>
lisaa.php vie lomakkeesta välitetyn sanan kantaan.
<?php include "yhteyskantaan.php"; $sana=$_POST["sana"]; if (empty($sana)) { echo "Sana kenttä ei saa olla tyhjä!<br>"; } if (!empty($sana)) { $sql = "INSERT INTO TAULUNNIMI (sana) VALUES ('$sana')"; if ($conn->query($sql) === TRUE) { echo "Uusi sana lisättiin onnistuneesti<br>"; } else { echo "Virhe: " . $sql . "<br>" . $conn->error; } $conn->close(); } include "index.php"; ?>
listaa.php pelkästään listaa kannassa olevat merkkijonot.
PetriKeckman kirjoitti:
$sql = "INSERT INTO sanoja (sana) VALUES ('$sana')";
Apua, toivottavasti poistat tämän koodin julkisesta käytöstä välittömästi! Sitten kannattaa tutustua tietoturva-aukkoon nimeltä SQL-injektio ja opetella käyttämään parametrisoituja kyselyitä.
Metabolix kirjoitti:
(10.06.2023 23:42:56): ”– –” Apua, toivottavasti poistat tämän koodin...
Siellä on nyt sitten CAPS:llä kirjoitettuna "TAULUNNIMI".
Suhtautumiseni tietoturva-aukkoihin: jos hakkerit haluavat ikävyyksiä tehdä, niin siinähän tehkööt! Hankkikoot itselleen huonoa karmaa.
Metabolix kirjoitti:
(10.06.2023 23:42:56): ”– –” Apua, toivottavasti poistat tämän koodin...
Sehän on nyt sun vastauksessa julkisessa käytössä. Hmm. Voisitko sitten poistaa sen - jos se on muka niin vaarallista?
Ei se tässä ole missään käytössä, vaan sinun sivuillasi se on käytössä ja palvelimellasi voi tuon koodirivin takia ajaa monenlaisia SQL-kyselyitä.
Esimerkiksi käyttäjä voi nyt syöttää seuraavan sanan:
'), (SELECT salasana FROM kayttajat WHERE tunnus = 'PetriKeckman'), ('
Pahimmassa tapauksessa tietokantaan tulee tällöin lisätyksi kaksi tyhjää sanaa ja lisäksi tietokannasta haettu PetriKeckmanin salasana kaikkien nähtäville. Tietysti tämä on kärjistetty esimerkki ja hakkerille hyödyllisen tiedon kaivaminen yleensä vaatii vähän enemmän vaivaa. Kuitenkin huonolla tuurilla hakkeri saa palvelintilasi hallintaansa, poistaa sieltä kaikki tiedostosi, laittaa tilalle omia viruksia ja huijaussivuja ja lähettää roskapostia nimissäsi, joten asiaan kannattaa suhtautua vähän vakavammin kuin että ”huonoa karmaa” tekijälle.
Koodin piilottaminen ei ole tietoturvaa, vaan koodi – tässä tapauksessa tietokannan käsittely – pitää tehdä oikein. Hakkeri voi etsiä vikoja ihan sokkonakin ja '-merkin syöttäminen tekstikenttään on tässä etsinnässä listalla ensimmäisenä.
Mulla on sinisilmäinen ja luottamuksellinen suhtautuminen maailmaan muutenkin kuin IT-alalla. Luotan ihmisiin. Jos joku haluaa ikävyyksiä tehdä, niin se on hänen syntinsä. En pelkää hakkereita.
Onko muka aina vaarallista paljastaa minkä tahansa kannassaan olevan taulun nimi ja sen jonkin sarakkeen nimi? Jos on, niin olkoon!
PetriKeckman kirjoitti:
Onko muka aina vaarallista paljastaa minkä tahansa kannassaan olevan taulun nimi ja sen jonkin sarakkeen nimi? Jos on, niin olkoon!
Ongelma ei ole taulun ja sarakkeen nimi vaan tuo käyttäjän syöttämän tekstin ($sana) laittaminen suoraan SQL-kyselyyn ilman mitään käsittelyä. Mitä jos tässä välissä nyt googlaisit ”SQL-injektio” ja käyttäisit vaikka 10 min asian lukemiseen, jos se ei edellisestä esimerkistäni auennut.
Oma päätös toki, jos haluaa tuommoisen jättää korjaamatta. Netissä on valitettavasti botteja, jotka etsivät automaattisesti yksinkertaisia tietoturva-aukkoja. Ei siis tarvitse joutua edes henkilökohtaisesti ihmisenä hyökkäyksen kohteeksi, vaan tämä voi osua kohdalle ihan ”sattumalta”. Viime kädessä koko touhun uhri voi olla sitten vaikka jokin yritys tai viranomainen, johon tietoturva-aukkojen kautta kaapatuilla palvelimilla kohdistetaan palvelunestohyökkäys.
Ja jos kyseessä olisi vaikka henkilötietoja sisältävä tietokanta, aukon kautta voisi hakea nekin tiedot (kuten Vastaamon tietomurrossa). Olisit tästä vastuussa, erityisen raskaasti, kun aukko tulisi tietoosi mutta et silti korjaisi sitä.
Metabolix kirjoitti:
Mitä jos tässä välissä nyt googlaisit ”SQL-injektio” ja käyttäisit vaikka 10 min asian lukemiseen, jos se ei edellisestä esimerkistäni auennut.
Mitä jos jätetään tää homma tähän :) ? En Googlaile. Keskityn maailman potentiaalisten riskien sijaan maailman kauniisiin asioihin, joissa moraali on korkealla.
Hyvää yötä! Nukun rauhallisin mielin, toivottavasti sinäkin...
Jos ei oma ja muiden turvallisuus kiinnosta, kiinnostaako edes koodin toiminta? Sivullasi ei voi tallentaa sanoja rei'itin, yht'äkkiä, tarkk'ampuja (paitsi jos osaa hakkeroida 🤔).
Metabolix kirjoitti:
Jos ei oma ja muiden turvallisuus kiinnosta, kiinnostaako edes koodin toiminta? Sivullasi ei voi tallentaa sanoja rei'itin, yht'äkkiä, tarkk'ampuja (paitsi jos osaa hakkeroida 🤔).
Siis onnistuuko homman korjaus esim. sillä, että "vaihdan heittomerkkejä", näin: ?
$sql = 'INSERT INTO sanoja (sana) VALUES ("$sana")';
Kysyy "tyhmä" eli 'tyhmä'.
Sitten sinne taas ei voi tallentaa lainausmerkkejä, ja tietoturvan suhteen ongelmaa ei ole edelleenkään korjattu. Kerroin jo ratkaisun eli parametrisoituja kyselyitä pitäisi käyttää, ettei käyttäjän syöttämä sana mene osaksi SQL-koodia.
Ihan niin kuin PHP-koodissa lasketaan muuttujilla eikä tehdä näistä tekstimuotoista laskua:
$turvallinen = $a + $b; $vaarallinen_koodi = "$a + $b"; $vaarallinen_tulos = eval($vaarallinen_koodi);
Samoin SQL:ssä tieto pitäisi antaa turvallisesti muuttujana eikä upottaa SQL-lausekkeeseen (SQL-kieliseen koodiin).
Ok, voit, kiitos, sitten poistaa koko tän viestiketjun :( En nyt jaksa alkaa manuaalia nyt tavaamaan.
EDIT: Vai tehdäänkö niin, että jätetään tää varoitukseksi ja opiksi muillekin ja minä poistan sivuni?
Jätetään vain. Ja oisko kuitenkin helpompi kopioida ne 5 koodiriviä manuaalin esimerkistä, niin voisit sitten korjata kaikki sivut samalla vaivalla.
Metabolix kirjoitti:
Ja oisko kuitenkin helpompi kopioida ne 5 koodiriviä manuaalin esimerkistä, niin voisit sitten korjata kaikki sivut samalla vaivalla.
Mulla on jo valmistumassa uusi mielenkiintoinen (?) projekti. En nyt jaksa enkä ehdi tähän koskea enää tikullakaan.
Vielä löytyy idiootteja tänäkin vuonna, jotka ohjelmoivat kuin vuosi olisi 1995...
PetriKeckman kirjoitti:
Metabolix kirjoitti:
Ja oisko kuitenkin helpompi kopioida ne 5 koodiriviä manuaalin esimerkistä, niin voisit sitten korjata kaikki sivut samalla vaivalla.
Mulla on jo valmistumassa uusi mielenkiintoinen (?) projekti. En nyt jaksa enkä ehdi tähän koskea enää tikullakaan.
Kannattaa siinä mielenkiintoisessa projektissa ottaa huomioon tässä ketjussa esille nousseet ongelmat
Lebe80 kirjoitti:
(14.06.2023 11:27:12): ”– –” Kannattaa siinä mielenkiintoisessa...
Projekti ei millään tavalla käsitellyt MySQL:ää tai .php:tä...
:) :) :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.