Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
sõnum |
|
Karlsson
Kreisi kasutaja
liitunud: 20.08.2004
|
12.01.2017 13:29:33
SQL turvalisus ja sisendite puhastamine |
|
|
Väheke paranoiline teema, aga siiski.. Alustan ühe lihtsama php+mysql veebilehe kirjutamist ja oleks väheke nõu vaja.
1.a)Kuidas efektiivselt puhastada ankeedi andmeväljade sisendit mida salvestatakse MySQL andmebaasi?
On mitmeid eri võimalusi saatmaks suvalist POST päringut veebiserverisse, seega tunnen huvi millisel moel teie olete seni sellega tegelenud.
1.b) Kas üherealise tekstivälja POST puhul olete eemaldanud x10 ja x13 vms. sümbolid. Kas on veel sümboleid millele võiks tähelepanu pöörata? Üks võimalus oleks muidugi regulaaravaldisega kontrollida, kuid eelistaks hoopis seda meetodit, kus välistaks teatud sümbolid.
1.c) Numbrite puhul saaks kasutada is_numeric($arv) funktsiooni.
2) Kas järgnev päring on häkkimiskindel:
$nimi = mysqli_real_escape_string($db,$_POST['nimi']);
$sql = "SELECT * FROM users WHERE username = 'nimi'"; |
3) Kas järgnev päring on häkkimiskindel:
$nimi = mysqli_real_escape_string($db,$_POST['nimi']);
$sql = "INSERT INTO users (username) VALUES ('$nimi')"; |
Jagage näpunäiteid algajale.
|
|
Kommentaarid: 87 loe/lisa |
Kasutajad arvavad: |
|
:: |
1 :: |
0 :: |
78 |
|
tagasi üles |
|
|
kuunar
Kreisi kasutaja
liitunud: 20.02.2009
|
|
Kommentaarid: 14 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
13 |
|
tagasi üles |
|
|
Karlsson
Kreisi kasutaja
liitunud: 20.08.2004
|
14.01.2017 11:34:33
|
|
|
Lugesin eelnevad soovitused läbi ja tegin kiirelt ühe lihtsama lehe. Ehk vaatate üle, kas on turvaline ja millele peaks tähelepanu pöörama. Lähtekood on spoileris. Katsetada saate http://test10.freeoda.com
php:
|
<?php isset($_GET["p"]) ? $p = $_GET["p"] : $p = "list"; ?> <html> <head><title>Demo</title> <meta charset="UTF-8"> </head> <body> <a href="?p=list">Nimekiri</a> | <a href="?p=add">Lisa</a><br><br> <?php $db = new PDO('mysql:host=localhost;dbname=proov_db1;charset=utf8mb4','root', ''); switch ($p) { case "delete" : is_numeric($_GET["id"]) ? $id = $_GET["id"] : die("Id pole number."); $del = $db->prepare("DELETE FROM isikud WHERE id = ?"); $del-> execute(array($id)); if ($del-> rowCount() == 1) echo "<hr>Rida kustutatud!<hr>"; else echo "<hr>Viga!<hr>"; case "list" : $stmt = $db->query("SELECT * FROM isikud ORDER BY id DESC"); $res = $stmt->fetchAll(PDO::FETCH_ASSOC); foreach ($res as $rida){ echo $rida["nimi"]. ' - '. $rida["telefon"]. '<br>' .$rida["kommentaar"].'<br>' .'<a href="?p=change&id='.$rida["id"].'">Muuda</a> | <a href="?p=delete&id='.$rida["id"].'">Kustuta</a><hr>'; } //print_r($res); break; case "change" : is_numeric($_GET["id"]) ? $id = $_GET["id"] : die("Id pole number."); if (isset($_POST["nimi"])){ $stmt = $db->prepare("UPDATE isikud SET nimi=?, telefon=?, kommentaar=? WHERE id=?"); $stmt-> execute(array($nimi, $telefon, $kommentaar, $id)); if ($stmt-> rowCount() == 1) echo "<hr>Rida muudetud!<hr>"; else echo "<hr>Viga!<hr>"; } $stmt = $db->prepare("SELECT * FROM isikud WHERE id = ?"); $stmt-> execute(array($id)); $res = $stmt->fetchAll(PDO::FETCH_ASSOC); ?> <form action="?p=change&id=<?php echo $id; ?>" method="post"> Nimi : <input type="text" style="width:200px;" name="nimi" value="<?php echo $res[0]["nimi"];?>"><br> Telefon : <input type="text" style="width:200px;" name="telefon" value="<?php echo $res[0]["telefon"];?>"><br> Kommentaar : <textarea name= "kommentaar"><?php echo $res[0]["kommentaar"];?></textarea><br> <input type="submit" value="Muuda"> </form> <?php break; case "add" : if (isset($_POST["nimi"])){ $stmt = $db->prepare("INSERT INTO isikud(id,nimi,telefon,kommentaar) VALUES(NULL,?,?,?)"); $stmt-> execute(array($nimi, $telefon, $kommentaar)); echo 'Last insert Id : '. $db-> lastInsertId(). '<br>'; if ($stmt-> rowCount() == 1) echo "<hr>Rida lisatud!<hr>"; else echo "<hr>Viga!<hr>"; } ?> <form action="?p=add" method="post"> Nimi : <input type="text" style="width:200px;" name="nimi"><br> Telefon : <input type="text" style="width:200px;" name="telefon"><br> Kommentaar : <textarea name="kommentaar"></textarea><br> <input type="submit" value="Lisa"> </form> <?php break; } ?> </body> <html>
|
Lisaks huvitab endiselt, kas lihtsamate päringute puhul mysqli_real_escape_string() abiga saab välistada SQL injectioni, kui muutuja on päringus pandud ülakomade vahele?
|
|
Kommentaarid: 87 loe/lisa |
Kasutajad arvavad: |
|
:: |
1 :: |
0 :: |
78 |
|
tagasi üles |
|
|
andresv
HV kasutaja
liitunud: 06.12.2004
|
16.01.2017 12:30:13
|
|
|
minuarust htmlentities võiks kasutada vahetult enne teksti kuvamist. Baasi võiks ta minna ikka sellisel kujul nagu kasutaja sisestas.
Muidu ühel hetkel on sul asjad topelt kodeeritud ja pead hakkama teistpidi tagasi teisendama. Ja tekib üks korralik segadus sellega.
|
|
Kommentaarid: 5 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
5 |
|
tagasi üles |
|
|
Karlsson
Kreisi kasutaja
liitunud: 20.08.2004
|
17.01.2017 02:19:31
|
|
|
Andresv, tundub mõistlik. Tõepoolest on see olnud minu jaoks paras väljakutse, millisel moel salvestada ja mismoodi esitada.
Samas on endiselt huvi, millisel moel filtreerida teksti sisendit, et kuri käsi ei pääseks andmebaasi kallale. Kuna paar päeva pole SQL osa keegi kritiseerinud, siis see vist on OK?
|
|
Kommentaarid: 87 loe/lisa |
Kasutajad arvavad: |
|
:: |
1 :: |
0 :: |
78 |
|
tagasi üles |
|
|
Fukiku
Kreisi kasutaja
liitunud: 06.11.2003
|
17.01.2017 10:50:00
|
|
|
Karlsson kirjutas: |
Andresv, tundub mõistlik. Tõepoolest on see olnud minu jaoks paras väljakutse, millisel moel salvestada ja mismoodi esitada.
Samas on endiselt huvi, millisel moel filtreerida teksti sisendit, et kuri käsi ei pääseks andmebaasi kallale. Kuna paar päeva pole SQL osa keegi kritiseerinud, siis see vist on OK? |
Sisendi turvalisuse peaks prepared statement'ide kasutamine tagama ja väga rohkem vist mõtlema ei peagi. Kõik päringud peaks oma keerukusest olenemata olema prepared statement'idega tehtud.
_________________ Foxic is just a simple fox
Enne kui sa küsid oma küsimuse - küsi seda vannipardilt! Rangelt soovitatav enne programmeerimise alafoorumisse uue teema tegemist. |
|
Kommentaarid: 2 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
2 |
|
tagasi üles |
|
|
Equinox
HV veteran
liitunud: 05.04.2002
|
17.01.2017 12:03:14
|
|
|
Omalt poolt lisaks, et hea praktika on viia äriloogika pool programmist välja baasi ehk kasutada stored procedure-sid.
_________________ Live long and prosper!
RIP, Spock. Leonard Nimoy 1931-2015 |
|
Kommentaarid: 27 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
26 |
|
tagasi üles |
|
|
andresv
HV kasutaja
liitunud: 06.12.2004
|
17.01.2017 16:17:35
|
|
|
Equinox, mille poolest see hea on? (Koodi kahes erinevas kohas ja erinevas keeles hoida.)
|
|
Kommentaarid: 5 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
5 |
|
tagasi üles |
|
|
Fukiku
Kreisi kasutaja
liitunud: 06.11.2003
|
17.01.2017 16:56:30
|
|
|
Equinox kirjutas: |
Omalt poolt lisaks, et hea praktika on viia äriloogika pool programmist välja baasi ehk kasutada stored procedure-sid. |
See nüüd mingi ainuõige hea praktika küll ei ole, see oleneb väga palju konkreetsest rakendusest ja loogikast. Kui on väga keeruline baasiloogika, siis jah, see õigustatud. Lihtsa CRUD rakenduse korral ei ole aastal 2016 üldse mõtet SQL-i ise kirjutada vaid pigem mingi ORM raamistikuga asi ära teha.
_________________ Foxic is just a simple fox
Enne kui sa küsid oma küsimuse - küsi seda vannipardilt! Rangelt soovitatav enne programmeerimise alafoorumisse uue teema tegemist. |
|
Kommentaarid: 2 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
2 |
|
tagasi üles |
|
|
Renka
HV Guru
liitunud: 01.04.2002
|
17.01.2017 17:24:09
|
|
|
ja kui aastal 2016 ei ole mõtet siis 2017 ammugi mitte
_________________ There is no place like 127.0.0.1 |
|
Kommentaarid: 71 loe/lisa |
Kasutajad arvavad: |
|
:: |
2 :: |
1 :: |
61 |
|
tagasi üles |
|
|
Fukiku
Kreisi kasutaja
liitunud: 06.11.2003
|
|
Kommentaarid: 2 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
2 |
|
tagasi üles |
|
|
Equinox
HV veteran
liitunud: 05.04.2002
|
18.01.2017 16:47:49
|
|
|
andresv kirjutas: |
Equinox, mille poolest see hea on? (Koodi kahes erinevas kohas ja erinevas keeles hoida.) |
Võimaldab jah näiteks mugavalt teha muudatusi/veaparandusi ja uuendusi kliendi poolel, ilma, et peaks koguaeg "exe-t" väljavahetama kui loogika istub tervenisti programmikoodis. Võimaldab veel näiteks graafilist liidest, äriloogikat ja baasi lahus hoida, väldib "kinni-kirjutamisi", liidestumisi eri süsteemide vahel parem korraldada jne. Loomulikult ei ole see ainuke variant, kõik sõltub lisaks projekti spetsiifikast jne. Suuremad baasi struktuurimuudatused muidugi kipuvad põhjustama nii exede kui protseduuride muudatusi, siis peab enivei kogu kompotti uuendama. Ei mõtlegi seda, et nimetatud praktika on 100% jäägitu ja ainuke varint. Lihtsalt räägin oma üle 20 aasta programmeerija kogemusest.
_________________ Live long and prosper!
RIP, Spock. Leonard Nimoy 1931-2015 |
|
Kommentaarid: 27 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
26 |
|
tagasi üles |
|
|
Karlsson
Kreisi kasutaja
liitunud: 20.08.2004
|
23.01.2017 17:48:15
|
|
|
Tänud vastajatele! Stored procedure on minu jaoks täiesti uus asi. Tõenäoliselt ma seda kasutama ei hakka. Aga huvi pärast proovisin ja uurisin.
|
|
Kommentaarid: 87 loe/lisa |
Kasutajad arvavad: |
|
:: |
1 :: |
0 :: |
78 |
|
tagasi üles |
|
|
|