Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: Viedään merkkijonoja MySQL kantaan

Sivun loppuun

PetriKeckman [10.06.2023 23:34:18]

#

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:

https://www.petke.info/CD/

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.

https://petke.info/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&auml;&auml; 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&auml;&auml; 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&auml; ei saa olla tyhj&auml;!<br>";
}
if (!empty($sana)) {
	$sql = "INSERT INTO TAULUNNIMI (sana) VALUES ('$sana')";
	if ($conn->query($sql) === TRUE) {
	  echo "Uusi sana lis&auml;ttiin onnistuneesti<br>";
	} else {
	  echo "Virhe: " . $sql . "<br>" . $conn->error;
}
$conn->close();
}
include "index.php";
?>

listaa.php pelkästään listaa kannassa olevat merkkijonot.

<?php
include "yhteyskantaan.php";
$sql = "SELECT sana FROM TAULUNNIMI";
$result = $conn->query($sql);
$row = $result->fetch_assoc();
echo "Kannassa olevat sanat:<br>";
while($row = $result->fetch_assoc()) {
echo $row["sana"] . "<br>";
}
include "index.php";
$conn->close();
?>

Metabolix [10.06.2023 23:42:56]

#

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ä.

PetriKeckman [10.06.2023 23:46:02]

#

Metabolix kirjoitti:

(10.06.2023 23:42:56): ”– –” Apua, toivot­ta­vasti 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.

PetriKeckman [10.06.2023 23:51:17]

#

Metabolix kirjoitti:

(10.06.2023 23:42:56): ”– –” Apua, toivot­ta­vasti 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?

Metabolix [11.06.2023 00:11:27]

#

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ä.

PetriKeckman [11.06.2023 00:16:30]

#

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!

Metabolix [11.06.2023 00:22:41]

#

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ä.

PetriKeckman [11.06.2023 00:26:04]

#

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

Metabolix [11.06.2023 07:29:00]

#

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 🤔).

PetriKeckman [11.06.2023 07:39:46]

#

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ä'.

Metabolix [11.06.2023 07:44:35]

#

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).

PetriKeckman [11.06.2023 07:47:46]

#

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?

Metabolix [11.06.2023 08:21:40]

#

Jätetään vain. Ja oisko kuitenkin helpompi kopioida ne 5 koodiriviä manuaalin esimerkistä, niin voisit sitten korjata kaikki sivut samalla vaivalla.

PetriKeckman [11.06.2023 08:42:13]

#

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.

muuskanuikku [14.06.2023 09:17:29]

#

Vielä löytyy idiootteja tänäkin vuonna, jotka ohjelmoivat kuin vuosi olisi 1995...

Lebe80 [14.06.2023 11:27:12]

#

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

PetriKeckman [14.06.2023 20:32:02]

#

Lebe80 kirjoitti:

(14.06.2023 11:27:12): ”– –” Kannattaa siinä mielen­kiin­toi­sessa...

Projekti ei millään tavalla käsitellyt MySQL:ää tai .php:tä...

qeijohanseon [20.06.2023 18:54:33]

#

:) :) :)


Sivun alkuun

Vastaus

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

Tietoa sivustosta