Avaleht
uus teema   vasta Tarkvara »  WWW »  SQL turvalisus ja sisendite puhastamine märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale. Teata moderaatorile
otsing:  
Karlsson
Kreisi kasutaja

liitunud: 20.08.2004



Autoriseeritud ID-kaardiga

sõnum 12.01.2017 13:29:33 SQL turvalisus ja sisendite puhastamine vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
kuunar
Kreisi kasutaja

liitunud: 20.02.2009



Autoriseeritud ID-kaardiga

sõnum 12.01.2017 15:50:32 vasta tsitaadiga

kasuta sisendi filtreid ja valmis avaldisi

https://www.wordfence.com/learn/how-to-write-secure-php-code/
https://paragonie.com/blog/2015/05/preventing-sql-injection-in-php-applications-easy-and-definitive-guide
Kommentaarid: 14 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 13
tagasi üles
vaata kasutaja infot saada privaatsõnum
Karlsson
Kreisi kasutaja

liitunud: 20.08.2004



Autoriseeritud ID-kaardiga

sõnum 14.01.2017 11:34:33 vasta tsitaadiga

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:
  1. <?php
  2.  
  3. isset($_GET["p"]) ? $p = $_GET["p"] : $p = "list";
  4. ?>
  5. <html>
  6.         <head><title>Demo</title>
  7.         <meta charset="UTF-8">
  8.         </head>
  9. <body>
  10. <a href="?p=list">Nimekiri</a> | <a href="?p=add">Lisa</a><br><br>
  11. <?php
  12. $db = new PDO('mysql:host=localhost;dbname=proov_db1;charset=utf8mb4','root', '');
  13. switch ($p) {
  14.         case "delete" :
  15.                 is_numeric($_GET["id"]) ? $id = $_GET["id"] : die("Id pole number.");
  16.                
  17.                 $del = $db->prepare("DELETE FROM isikud WHERE id = ?");
  18.                 $del->execute(array($id));
  19.                 if ($del->rowCount() == 1) echo "<hr>Rida kustutatud!<hr>"; else echo "<hr>Viga!<hr>";
  20.         case "list" :
  21.                 $stmt = $db->query("SELECT * FROM isikud ORDER BY id DESC");
  22.                 $res = $stmt->fetchAll(PDO::FETCH_ASSOC);
  23.                 foreach ($res as $rida){
  24.                     echo $rida["nimi"].' - '.$rida["telefon"].'<br>'
  25.                         .$rida["kommentaar"].'<br>'
  26.                         .'<a href="?p=change&id='.$rida["id"].'">Muuda</a> | <a href="?p=delete&id='.$rida["id"].'">Kustuta</a><hr>';
  27.                 }
  28.                 //print_r($res);
  29.         break;
  30.         case "change" :
  31.         is_numeric($_GET["id"]) ? $id = $_GET["id"] : die("Id pole number.");
  32.         if (isset($_POST["nimi"])){
  33.                 $nimi = htmlentities($_POST["nimi"]);
  34.                 $telefon = htmlentities($_POST["telefon"]);
  35.                 $kommentaar = htmlentities($_POST["kommentaar"]);
  36.                 $stmt = $db->prepare("UPDATE isikud SET nimi=?, telefon=?, kommentaar=? WHERE id=?");
  37.         $stmt->execute(array($nimi, $telefon, $kommentaar, $id));
  38.                 if ($stmt->rowCount() == 1) echo "<hr>Rida muudetud!<hr>"; else echo "<hr>Viga!<hr>";
  39.         }
  40.         $stmt = $db->prepare("SELECT * FROM isikud WHERE id = ?");
  41.     $stmt->execute(array($id));
  42.         $res = $stmt->fetchAll(PDO::FETCH_ASSOC);
  43.         ?>
  44.         <form action="?p=change&id=<?php echo $id; ?>" method="post">   
  45.                 Nimi : <input type="text" style="width:200px;" name="nimi" value="<?php echo $res[0]["nimi"];?>"><br>
  46.                 Telefon : <input type="text" style="width:200px;" name="telefon" value="<?php echo $res[0]["telefon"];?>"><br>
  47.                 Kommentaar : <textarea name="kommentaar"><?php echo $res[0]["kommentaar"];?></textarea><br>
  48.                 <input type="submit" value="Muuda">
  49.         </form>
  50.         <?php
  51.         break;
  52.         case "add" :
  53.         if (isset($_POST["nimi"])){
  54.                 $nimi = htmlentities($_POST["nimi"]);
  55.                 $telefon = htmlentities($_POST["telefon"]);
  56.                 $kommentaar = htmlentities($_POST["kommentaar"]);
  57.                
  58.             $stmt = $db->prepare("INSERT INTO isikud(id,nimi,telefon,kommentaar) VALUES(NULL,?,?,?)");
  59.         $stmt->execute(array($nimi, $telefon, $kommentaar));
  60.                 echo 'Last insert Id : '. $db->lastInsertId().'<br>';
  61.                 if ($stmt->rowCount() == 1) echo "<hr>Rida lisatud!<hr>"; else echo "<hr>Viga!<hr>";
  62.         }
  63.         ?>
  64.         <form action="?p=add" method="post">   
  65.                 Nimi : <input type="text" style="width:200px;" name="nimi"><br>
  66.                 Telefon : <input type="text" style="width:200px;" name="telefon"><br>
  67.                 Kommentaar : <textarea name="kommentaar"></textarea><br>
  68.                 <input type="submit" value="Lisa">
  69.         </form>
  70.         <?php
  71.         break;
  72. }
  73. ?>
  74. </body>
  75. <html>
  76.  

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
vaata kasutaja infot saada privaatsõnum
andresv
HV kasutaja

liitunud: 06.12.2004




sõnum 16.01.2017 12:30:13 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
Karlsson
Kreisi kasutaja

liitunud: 20.08.2004



Autoriseeritud ID-kaardiga

sõnum 17.01.2017 02:19:31 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
Fukiku
Kreisi kasutaja
Fukiku

liitunud: 06.11.2003




sõnum 17.01.2017 10:50:00 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
Equinox
HV veteran
Equinox

liitunud: 05.04.2002



Online

sõnum 17.01.2017 12:03:14 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
andresv
HV kasutaja

liitunud: 06.12.2004




sõnum 17.01.2017 16:17:35 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
Fukiku
Kreisi kasutaja
Fukiku

liitunud: 06.11.2003




sõnum 17.01.2017 16:56:30 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
Renka
HV Guru
Renka

liitunud: 01.04.2002



Autoriseeritud ID-kaardiga

sõnum 17.01.2017 17:24:09 vasta tsitaadiga

ja kui aastal 2016 ei ole mõtet siis 2017 ammugi mitte icon_razz.gif icon_wink.gif
_________________
There is no place like 127.0.0.1
Kommentaarid: 71 loe/lisa Kasutajad arvavad:  :: 2 :: 1 :: 61
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
Fukiku
Kreisi kasutaja
Fukiku

liitunud: 06.11.2003




sõnum 17.01.2017 17:39:02 vasta tsitaadiga

ot:
Renka kirjutas:
ja kui aastal 2016 ei ole mõtet siis 2017 ammugi mitte icon_razz.gif icon_wink.gif
Touchè!

_________________
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
vaata kasutaja infot saada privaatsõnum
Equinox
HV veteran
Equinox

liitunud: 05.04.2002



Online

sõnum 18.01.2017 16:47:49 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
Karlsson
Kreisi kasutaja

liitunud: 20.08.2004



Autoriseeritud ID-kaardiga

sõnum 23.01.2017 17:48:15 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  WWW »  SQL turvalisus ja sisendite puhastamine
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.