Avaleht
uus teema   vasta Tarkvara »  WWW »  Maksimaalne turvalisus PHP+MySQL märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
mine lehele 1, 2  järgmine
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
jnt
HV Guru
jnt

liitunud: 10.05.2005



Autoriseeritud ID-kaardiga Online

sõnum 27.03.2009 19:03:36 Maksimaalne turvalisus PHP+MySQL vasta tsitaadiga

Tervitused! Nimelt, seoses ühe suurema projektiga olen valmis kribanud ka enda andmebaasiklassi, millega siis päringuid andmebaasi teen. Kõik toimib ja paistab ideaalne, kuid kas see nii on? Nimelt huvitaks kõikvõimalikud variandid ja võimalused, kuidas teha üks päring turvaliseks, kui päringusse on ka juurde toodud erinevad $_POST, $_GET jt muutujad. Hetkel on turvalisus sinna kanti:
Mul on oma andmebaasi objekt $m. Päringu tekitan meetodiga $m->q();
Võtame alguses "koleda" ebaturvalise koodi:
$q=mysql_query("SELECT username FROM table WHERE id=".$_GET['id']);

Sellise päringu saan ma oma klassiga teha aga nii:
$q=$m->q("SELECT username FROM table WHERE id=[0:i]", $_GET['id']);

Mis tehakse antud juhul, on siis see, et võetakse [0] asemele $_GET['id'], mis lastakse läbi mysql_real_escape_string() funktsiooni. Ja kuna sellel [0]'il on mul lisaparameeter "i", siis on tollest väärtusest veel võetud intval(). Lisaparameeter on ka float'i jaoks, kus tehakse sama asja floatval() funktsiooniga. Lisaparameeter pole kohustuslik ja seetõttu string'i puhul seda sättima ei pea.

Kuid küsimus oleks, kas tegemist on ikka turvalise asjaga? Ega siin ei teki ikka mingeid jamasid ja ohte? Oskate ehk sel alal mingil määral nõu anda?

Tänades,
Joonatan.

_________________
Progemisest: https://byteaether.github.io/
Seisab keldris vana 386-486-Pentium1? Räägime! Ehk saan vanakesele uue elu anda. icon_wink.gif
Vaata siia, äkki müün midagi põnevat -> https://www.osta.ee/index.php?fuseaction=listing.seller&q[seller]=jnt
Kommentaarid: 110 loe/lisa Kasutajad arvavad:  :: 2 :: 0 :: 102
tagasi üles
vaata kasutaja infot saada privaatsõnum
airm
HV Guru

liitunud: 26.02.2003




sõnum 27.03.2009 19:56:53 vasta tsitaadiga

turvalisus turvalisuseks,
aga mis juhtub, kui get->id asemel on string, mitte number?

errorkontroll stringide ja numbrite üle toimub ennem või pärast info edastamist sinna hüpersuper objekti?
või objekti sees?
Kommentaarid: 56 loe/lisa Kasutajad arvavad:  :: 2 :: 1 :: 50
tagasi üles
vaata kasutaja infot saada privaatsõnum
jnt
HV Guru
jnt

liitunud: 10.05.2005



Autoriseeritud ID-kaardiga Online

sõnum 27.03.2009 20:06:49 vasta tsitaadiga

kui $_GET['id'] on string, siis tulemuseks on see, mille annab mysql_real_escape_string(intval($_GET)). See kontroll toimub juba q() meetodi sees, kui asendatakse [blabla] stuffi. (lisaks veel omasätitud kraam ka juures, nagu [pre] prefixi jaoks jne)

see, kas nt $_GET['id'] väärtust omab, toimub muidugi väljaspool klassi vastava if'iga, peale mida hakatakse edasi vaatama.

_________________
Progemisest: https://byteaether.github.io/
Seisab keldris vana 386-486-Pentium1? Räägime! Ehk saan vanakesele uue elu anda. icon_wink.gif
Vaata siia, äkki müün midagi põnevat -> https://www.osta.ee/index.php?fuseaction=listing.seller&q[seller]=jnt
Kommentaarid: 110 loe/lisa Kasutajad arvavad:  :: 2 :: 0 :: 102
tagasi üles
vaata kasutaja infot saada privaatsõnum
mikk36
HV Guru
mikk36

liitunud: 21.02.2004




sõnum 27.03.2009 20:09:07 vasta tsitaadiga

Seega piirad sa $m->q() ära ainult int väärtustega selekteerimiseks ?
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
jnt
HV Guru
jnt

liitunud: 10.05.2005



Autoriseeritud ID-kaardiga Online

sõnum 27.03.2009 20:11:16 vasta tsitaadiga

kui mul on [0], siis esimene parameeter peale sql stringi võetakse sellisena, nagu ta on, kui on [0:i], võetakse see integerina ja kui on [0:f], võetakse see floatina.
_________________
Progemisest: https://byteaether.github.io/
Seisab keldris vana 386-486-Pentium1? Räägime! Ehk saan vanakesele uue elu anda. icon_wink.gif
Vaata siia, äkki müün midagi põnevat -> https://www.osta.ee/index.php?fuseaction=listing.seller&q[seller]=jnt
Kommentaarid: 110 loe/lisa Kasutajad arvavad:  :: 2 :: 0 :: 102
tagasi üles
vaata kasutaja infot saada privaatsõnum
k2iguvahetaja
HV veteran

liitunud: 07.05.2003



Autoriseeritud ID-kaardiga

sõnum 27.03.2009 20:15:14 vasta tsitaadiga

utf doctrine
Kommentaarid: 45 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 38
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
jnt
HV Guru
jnt

liitunud: 10.05.2005



Autoriseeritud ID-kaardiga Online

sõnum 27.03.2009 20:20:27 vasta tsitaadiga

k2iguvahetaja, iseleiutamine on ikka kõige huvitavam. Ei taha teiste kraami kasutada, tahan kõike ise teha. icon_razz.gif
_________________
Progemisest: https://byteaether.github.io/
Seisab keldris vana 386-486-Pentium1? Räägime! Ehk saan vanakesele uue elu anda. icon_wink.gif
Vaata siia, äkki müün midagi põnevat -> https://www.osta.ee/index.php?fuseaction=listing.seller&q[seller]=jnt
Kommentaarid: 110 loe/lisa Kasutajad arvavad:  :: 2 :: 0 :: 102
tagasi üles
vaata kasutaja infot saada privaatsõnum
inzinz
HV kasutaja

liitunud: 26.01.2005




sõnum 28.03.2009 01:45:23 vasta tsitaadiga

Noh kui loogikavigasid sul seal mysql klassis ei ole, siis põhimõtteliselt peaks kõik hästi töötama, kuna kõik parameetrid escapetakse ära ja alles siis pannakse sql lausesse sisse. Ehk näitad koodi ka ? icon_razz.gif
Aga üks küss ikkagi on veel: mis juhtub siis, kui su kood jookseb kusagil serveris kus on magic quotes peal ? Kas stringid muutuvad \\\\\\\\ sasipundardeks ? icon_razz.gif

Soovitaks mingi üldisema lisafunktsiooni teha millega võtad get/post parameetreid, vajadusel teed stripslashes kui magic quotes on peal ja siis otsa teed veel intval/floatval kui tegu numbriga.
Sellisel juhul sa saad ka mujal kui ainult sql klassi parameetrina sama väärtust kasutada ja on samamoodi turvaline/ühtne ka mujal koodis.

_________________
Upload.ee - eestimaine failiupload
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 4
tagasi üles
vaata kasutaja infot saada privaatsõnum
jnt
HV Guru
jnt

liitunud: 10.05.2005



Autoriseeritud ID-kaardiga Online

sõnum 28.03.2009 13:19:07 vasta tsitaadiga

inzinz, magic quotes? Kohe lähen ja uurin selle kohta. Hetkel muidu asi paistab kenasti toimivat küll... Tuli jah lisaks idee teha klassiväline funktsioon, millega saab "valideerida" stringe. Et saab kontrollida, kas pikkus on vastav, kas tegemist on nr, stringi või e-mailiga jne.

Aga selle magic quotes'iga, et kui see peal, tuleb stripslashes kõigepealt siis ära teha, jah?


Siin siis query funktsioon, mis on privaatne. Sellele teevad päringuid funktsioonid q (tavaline query), qfa (esimene tulemus mysql_fetch_array'ga läbi), qfa2d (eelmine, kuid kõik tulemused, kokku 2d array), qfo (nagu qfa, aga mysql_fetch_object funktsiooniga) ja qfoa (nagu qfa2d, ainult et array siis nö objektidest). See query sööb argumente juba array'na, kus esimene liige on query ise.
private function query($args){
      
      //Esialgne query
      $q=$args[0];
      
      if($q==''){ return $this->lastq; }
      
      //Funktsiooniga antud argumendid
      if(count($args)>1){
         for($i=1;$i<count($args);$i++){
            $q=str_replace("[".($i-1)."]", mysql_real_escape_string(trim($args[$i]), $this->link), $q);
            $q=str_replace("[".($i-1).":i]", mysql_real_escape_string(intval(trim($args[$i])), $this->link), $q);
            $q=str_replace("[".($i-1).":f]", mysql_real_escape_string(floatval(trim($args[$i])), $this->link), $q);
         }
      }
      
      
      //Sätitud asendused
      foreach($this->reps as $key => $value){
         $q=str_replace("[".$key."]", mysql_real_escape_string(trim($value), $this->link), $q);
      }
      
      
      //Alustame timeriga
      $timerstart=$this->getmicrotime(); //Alustame timeriga
      
      //Query ise
      $this->lastq=mysql_query($q, $this->link);
      if(!$this->lastq){
         $this->log($q, true);
         return false;
      }
      
      //Lõpetame timeriga
      $this->lastqtime=$this->getmicrotime()-$timerstart; //Kribame kulunud aja muutujasse
      $this->totalqtime+=$this->lastqtime;
      
      $this->qcount++; //Query loendur
      
      $this->log($q);
      
      return $this->lastq;
   }

_________________
Progemisest: https://byteaether.github.io/
Seisab keldris vana 386-486-Pentium1? Räägime! Ehk saan vanakesele uue elu anda. icon_wink.gif
Vaata siia, äkki müün midagi põnevat -> https://www.osta.ee/index.php?fuseaction=listing.seller&q[seller]=jnt
Kommentaarid: 110 loe/lisa Kasutajad arvavad:  :: 2 :: 0 :: 102
tagasi üles
vaata kasutaja infot saada privaatsõnum
inzinz
HV kasutaja

liitunud: 26.01.2005




sõnum 29.03.2009 01:09:59 vasta tsitaadiga

Natuke uurides tekkis paar küsimust:
esiteks miks sa teed stringidele trim funktsioonis, mis peaks andmeid baasi edastama. Nii tekivad ju olukorrad kus mingil juhul läheb infot kaduma, ilma etteteatamiseta. Trim tuleks ideeliselt teha ikka seal kohas kus infot ette annad, kui tead et kindlalt tahad trim teha mingile parameetrile.
teiseks, mis saab siis, kui tekstivälja/stringiparameetri väärtuses on kasutaja sisendist tulnud [mingiparam] või [2] jne. Praegusel juhul tekib data integrity probleem, kuna stringis teed järjest replacemisi. Kui kasutaja kogemata/meelega paneb teksti välja sisse stringi [1] siis tekib tema teksti sisse [1] asemele mingi väärtus. Üks lähenemine oleks sql järjest märkhaaval/parameeterhaaval läbi käia ja siis uus string koos väärtustega kokku ehitada. Säiliks andmete ühtsus ning töötaks endiselt turvaliselt.
kolmandaks, kas stringidele hakkad ise alati etteantavas päringus quotesid ümber panema stiilis: q('select * from tabel where nimi="[0]"', 'nimi'). Kui sul asendav loogika juba teab et tegu stringiga, siis oleks kergem sealsamas asendamise loogikas kohe "" ümber lisada ja mujal koodis keerukust kokku hoida pluss ei saa tekkida unustamisest tulenevaid vigasid.

minu 5 senti icon_biggrin.gif

_________________
Upload.ee - eestimaine failiupload
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 4
tagasi üles
vaata kasutaja infot saada privaatsõnum
jnt
HV Guru
jnt

liitunud: 10.05.2005



Autoriseeritud ID-kaardiga Online

sõnum 29.03.2009 13:27:35 vasta tsitaadiga

inzinz, Suured tänud, eile õhta tulin ka järsku idee peale, et mis siis saab, kui järsku keegi [0] nt ise sisestab... Lahendaksin ma hea meelega seda asja 2x explode'imise teel (algul [ järgi ja siis : järgi. siis saan kätte nr ja tüübi saan : explode'i teise elemendi esimesest tähest), kuid siis oleks jama ikkagi olemas. Üks võimalus oleks kasutajal [ ja ] märk ära keelata, mis polegi liiga halb variant, kuid kuidas sa täpselt seda tähthaaval läbi käimist ette kujutad, et kasutaja stuffi ei hakataks "parsima"?

Hetkel olen natuke tegelenud üldise turvalisusega ka. olen teinud funktsiooni, millega saab kontrollida, kas sisestatu on str, int, aadress või e-mail ja juures veel min ja max pikkus. Veel olen teinud token'ite süsteemi, kus funktsiooni käivitades genereeritakse suvaline string-jada ja tagastatakse see ning pannakse too ka sessiooni. Kui kontrollida, kontrollid $_POST['token']/$_GET['token']'it selle sama funktsiooniga, andes argumendiks true, mis läbi tagastab funktsioon token'i sessioonist, kuid kustutab sessioonist tokeni ära. (Iga kord, kui ilma argumendita token'i funktsioon käivitatakse, vaadatakse, kas token on juba genereeritud ja kui pole, siis see genereeritakse ning lõpuks tagastatakse viimane) Lisaks veel olen kokku klopsinud kerge captcha. Et sellised lood veel turvalisuse teema pealt.

Kuid tulles tagasi mysql päringute juurde, siis jah, olekski küsimus, et kuidas sa käiksid selle sql päringu tähthaaval läbi? Kas tõesti mingi keemiaga for tsükliga (näiteks) käia $q{0} - $q{length} läbi ja siis seal tegeleda? Kui kiire selline lahendus oleks?

EDIT: Kas mõtlesid midagi sellist muidu, et "ehitada" uude muutujasse täht haaval uut query't ja niimoodi siis asi ära teha? Kas umbes nii?
for($a=0;$a<strlen($q);$a++){
         if($q{$a}!='['){
            $pq.=$q{$a};
         }else{
            if($p{$a+2}!=':'){
               $pq.=mysql_real_escape_string(trim($args[$p{$a+1}+1]));
               $a+=3;
            }else{
               switch($p{$a+2}){
                  case 'i': $pq.=mysql_real_escape_string(intval(trim($args[$p{$a+1}+1]))); break;
                  case 'f': $pq.=mysql_real_escape_string(flotaval(trim($args[$p{$a+1}+1]))); break;
               }
               $a+=5;
            }
         }
      }

(Pole koodi ennast veel proovinud, kuid loodan, et vigu selles hetkel pole.)

_________________
Progemisest: https://byteaether.github.io/
Seisab keldris vana 386-486-Pentium1? Räägime! Ehk saan vanakesele uue elu anda. icon_wink.gif
Vaata siia, äkki müün midagi põnevat -> https://www.osta.ee/index.php?fuseaction=listing.seller&q[seller]=jnt
Kommentaarid: 110 loe/lisa Kasutajad arvavad:  :: 2 :: 0 :: 102
tagasi üles
vaata kasutaja infot saada privaatsõnum
inzinz
HV kasutaja

liitunud: 26.01.2005




sõnum 29.03.2009 14:43:41 vasta tsitaadiga

Umbes midagi sellist jah aga sul see kood seal hetkel töötab ainult ühekohaliste numbritega [1], [2:f] jne, kui aga tuleb sisse [12:f] siis loogika enam ei tööta.
Üks variant oleks jah explodeda stiilis:

$arr = explode('[', $q);
$q2 = '';
foreach($arr as $qpart) {
  $subarr = explode(']', $qpart, 2);
  if(count($subarr) == 2) {
    $parts = explode(':', $subarr[0]);
    $value='';
    if(intval($parts[0]).'' === $parts[0]) {//kontroll kas on numbriline väärtus
      $value = $args[$parts[0]];
    } else {
       $value = $this->reps[$parts[0]];
    }
    if(!isset($parts[1])) $parts[1] = '';
    switch($parts[1]) {
      case 'i': $value = intval($value); break;
      case 'f': $value = floatval($value); break;
      default: $value = '"'.mysql_real_escape_string($value).'"';
    }
    $q2 .= $value.$subarr[1];
  } else $q2 .= $subarr[0];
}
mysql_query($q2);

teine vairant oleks miskit sellist:

$q2 = '';
$part = '';
$inpart = false;
for($i = 0; $i < strlen($q); $i++) {
  if(!$inpart && $q[$i] == '[') {
    $part = '';
    $inpart = true;
    continue;
  }
  if(!$inpart) $q2 .= $q[$i];
  else {
    if($q[$i] == ']') {
      $inpart = false;
      $parts = explode(':', $part);
      $value='';
      if(intval($parts[0]).'' === $parts[0]) {//kontroll kas on numbriline väärtus
        $value = $args[$parts[0]];
      } else {
         $value = $this->reps[$parts[0]];
      }
      if(!isset($parts[1])) $parts[1] = '';
      switch($parts[1]) {
        case 'i': $value = intval($value); break;
        case 'f': $value = floatval($value); break;
        default: $value = '"'.mysql_real_escape_string($value).'"';
      }
      $q2 .= $value;
    } else $part .= $q[$i];
  }
}

Kus siis jupphaaval käib stringi läbi ja [] puhul teeb lisaloogikat väärtuse leidmiseks.

_________________
Upload.ee - eestimaine failiupload
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 4
tagasi üles
vaata kasutaja infot saada privaatsõnum
jnt
HV Guru
jnt

liitunud: 10.05.2005



Autoriseeritud ID-kaardiga Online

sõnum 29.03.2009 15:24:25 vasta tsitaadiga

Hetkel leiutasin ise ka seda enda esialgset koodi, et toetaks mitmekohalisi numbreid ja välja tuli selline süsteem:
$q="SELECT * FROM [0] WHERE [1:s]=[10:s][13:s]";

$args[]='';
$args[]='tere1';
$args[]='tere2';
$args[]='tere3';
$args[]='tere4';
$args[]='tere5';
$args[]='tere6';
$args[]='tere7';
$args[]='tere8';
$args[]='tere9';
$args[]='tere10';
$args[]='tere11';
$args[]='tere12';
$args[]='tere13';
$args[]='tere14[3]';

for($a=0;$a<strlen($q);$a++){
   if($q{$a}!='['){
      $pq.=$q{$a};
   }else{
      $nrlength=1;
      $nr='';
      while($q{$a+$nrlength}!=':' && $q{$a+$nrlength}!=']'){
         $nr.=$q{$a+$nrlength};
         $nrlength+=1;
      }
      if($q{$a+$nrlength}!=':'){
         $pq.=trim($args[$nr+1]);
         $a+=$nrlength;
      }else{
         switch($q{$a+$nrlength+1}){
            case 'i': $pq.=intval(trim($args[$nr+1])); break;
            case 'f': $pq.=floatval(trim($args[$nr+1])); break;
            case 's': $pq.="'".trim($args[$nr+1])."'"; break;
         }
         $a+=$nrlength+2;
      }
   }
}
echo $pq;

Paistab toimivat hetkel ka selline variant. See kood hetkel siis "niisama" stiilis, mille hiljem mugandan db klassi. Igastahes paistab toimivat ja peale asendusi neid asendusi üle ei "parsita".

_________________
Progemisest: https://byteaether.github.io/
Seisab keldris vana 386-486-Pentium1? Räägime! Ehk saan vanakesele uue elu anda. icon_wink.gif
Vaata siia, äkki müün midagi põnevat -> https://www.osta.ee/index.php?fuseaction=listing.seller&q[seller]=jnt
Kommentaarid: 110 loe/lisa Kasutajad arvavad:  :: 2 :: 0 :: 102
tagasi üles
vaata kasutaja infot saada privaatsõnum
inzinz
HV kasutaja

liitunud: 26.01.2005




sõnum 29.03.2009 15:30:43 vasta tsitaadiga

Aga ühe asja kaotasid sa ära, mysql_real_escape_string'i sa enam ei tee miskipärast.
Rida
case 's': $pq.="'".trim($args[$nr+1])."'"; break;
vajaks ikkagi escapemist ka icon_wink.gif

_________________
Upload.ee - eestimaine failiupload
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 4
tagasi üles
vaata kasutaja infot saada privaatsõnum
jnt
HV Guru
jnt

liitunud: 10.05.2005



Autoriseeritud ID-kaardiga Online

sõnum 29.03.2009 15:54:30 vasta tsitaadiga

inzinz, yup, kuid see funktsioon ei toimi, kui pole database'iga ühendust. Seepärast mainisingi, et see kood hetkel "niisama" pandud tööle. Nüüd, kui asi on mul db klassis, on mysql_real_escape_string kenasti igal pool olemas, kus vaja. icon_wink.gif
_________________
Progemisest: https://byteaether.github.io/
Seisab keldris vana 386-486-Pentium1? Räägime! Ehk saan vanakesele uue elu anda. icon_wink.gif
Vaata siia, äkki müün midagi põnevat -> https://www.osta.ee/index.php?fuseaction=listing.seller&q[seller]=jnt
Kommentaarid: 110 loe/lisa Kasutajad arvavad:  :: 2 :: 0 :: 102
tagasi üles
vaata kasutaja infot saada privaatsõnum
nene
Kreisi kasutaja
nene

liitunud: 20.03.2004




sõnum 31.03.2009 23:00:13 vasta tsitaadiga

Mainin, et sedasorti kood on just selline, mille arendamisel tuleks vägagi kasuks unit-testide kasutamine. Eriti veel siis kui su eesmärgiks on turvaline kood.

Sul on üsna rangelt piiritletud probleem. Funktsiooni sisend ja väljund on lihtne, kuid sisemine loogika on keerukas. Mis on unit-testimiseks ideaalne.

_________________
Mõistus otsas? Pane pinusse...
Kommentaarid: 24 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 23
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
kapa24
HV vaatleja

liitunud: 23.01.2003




sõnum 01.04.2009 10:26:30 vasta tsitaadiga

Minu panus, preg_replace_callback funktsiooni kasutades...


class DataB {
   public function replace($matches) {
      switch ($matches[2]) {
         case 'i':
            $value = (int)$this->params[$matches[1]];
            break;
         case 'f':
            $value = (float)$this->params[$matches[1]];
            break;
         case 's':
         default:
            $value = "'" . mysql_real_escape_string($this->params[$matches[1]]) . "'";
            break;
      }
      return $value;
   }


   public function q() {
      $args = func_get_args();

      $query = array_shift($args);
      if (is_array($args[0])) {
         $params = $args[0];
      } else {
         $params = $args;
      }

      $this->params = $params;

      $result = preg_replace_callback('[\[([0-9A-Za-z_]{1,30}):([isf])\]]', array($this, 'replace'), $query);

      return $result;
   }
};

$db = new DataB();

$params = array(
   'mate_id' => 10,
   'name' => 'john'
);

echo $db->q("SELECT * FROM users WHERE mate_id = [mate_id:i] AND username = [name:s] OR username = [name:s]", $params);
?>
tagasi üles
vaata kasutaja infot saada privaatsõnum
d3t
HV Guru
d3t

liitunud: 14.05.2004




sõnum 01.04.2009 10:36:27 vasta tsitaadiga

Esiteks peaks sinna klassi saama pöörduda ainult sinu programmi siseselt, seega hea oleks kui sa nt lipuga ära määraks klassi suremise kui sinna otse pöördutakse.

Teiseks võiksid valideerida sisendi enne protsessi ja kurjad comandid nagu table drop jne välja filtreerida icon_smile.gif

_________________
next.Insiders - koht mängijatele ja tehnikahuvilistele toredaks ajaveetmiseks.
PT: Sony XE90 & LG C1 värvi kalibreerimine
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 72
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
inzinz
HV kasutaja

liitunud: 26.01.2005




sõnum 01.04.2009 11:32:43 vasta tsitaadiga

tsitaat:
Esiteks peaks sinna klassi saama pöörduda ainult sinu programmi siseselt, seega hea oleks kui sa nt lipuga ära määraks klassi suremise kui sinna otse pöördutakse.
Ehk selgitad lähemalt kuidas sinu teooria järgi annab php klassi poole pöörduda programmi väliselt ? icon_biggrin.gificon_biggrin.gif

Ja kui teha selline korralik parameetritega teema (nagu praegu tehtud on), et mingil juhul isegi kogemata ei saa stringi drop table sql käsuna jooksutada, siis pole mingit filtreerimist ja valideerimist nii madalal astmel vaja, kuna kõik stringi parameetrid escapetakse korrektselt ja pannakse jutumärkide sisse.
Staatiline filtreerimine, replacemine ja errorite andmine on paras jama üldiselt, eriti andmebaasiklassi puhul mida sa saad ise teha. Kõige ehtsama näite kehva replace jms kohta saad kui otsid googlest väljendit clbuttic (classic stringis replacetakse agaralt väljend ass sõnaga butt). Pealegi selleks et otsida ülesse kõikvõimalikud päringud mis võivad midagi halvasti teha on suht lõputu ülesanne võrreldes paarirealise korrektse escapemisega, millega välistad 100% kõik sql injection jamad...

_________________
Upload.ee - eestimaine failiupload
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 4
tagasi üles
vaata kasutaja infot saada privaatsõnum
d3t
HV Guru
d3t

liitunud: 14.05.2004




sõnum 01.04.2009 12:32:22 vasta tsitaadiga

inzinz, kui nt includida seda faili kus klass sees on, siis annab seda ju kasutada?

Pahad requestide filterdamisest, mõtlesin midagi sellist: http://firewallscript.com/

_________________
next.Insiders - koht mängijatele ja tehnikahuvilistele toredaks ajaveetmiseks.
PT: Sony XE90 & LG C1 värvi kalibreerimine
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 72
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
inzinz
HV kasutaja

liitunud: 26.01.2005




sõnum 01.04.2009 15:01:50 vasta tsitaadiga

No aga see ei anna suurt midagi juurde turvalisusele kas lasta includeda või mitte, kuna baasi klass on niikuinii eraldi failis klassina, sisse includides mingit kriitilist loogikat ei tohiks jooksutada ning baasi connectimise info peaks ka kuskil eraldi olema.
Niisama klassi sisaldava faili sisse includemine ei kvalifitseeru küll kuidagi häkkimisena icon_biggrin.gif
PHPBB foorumi puhul on küll oluline kas lubada includeda ja aadressiribalt ligi saada, kuna failid on funktsioone ja tavakoodi täis, mida igal includemisel jooksutatakse ja võib igast huvitavaid olukordasid tekitada.

Nonde blokkijate/filtrijate koha pealt ütleks et väga tihti need keeravad käru. Põhiprobleemiks see, et too vaheskript/filtreerija ei tea halligi sellest mida sinu php kood teeb kui saab näiteks ette väärtuse admin"#
Kui sinu kood sisestab selle ilusti tabelisse või kasutab päringus normaalselt (escapeb ära) on kõik korras sinu poolt tegelikult, kui aga filtreerija eeldab et selle peale vaja alati errorit visata või ei tea mida veel teha (asendada) siis tekivad andmekaod ja muidu segadust.
Seepärast ongi soovituslik kasutada miskit sellise parameetritega sql asjandust algusest peale, mis teeb by default kõik päringud turvaliseks ja kogu moos, ei mingit häkkimist ja ei mingeid imelikke olukordasid kus mingi kolmas kooditükk andmeid näperdab vahepealt ära.

_________________
Upload.ee - eestimaine failiupload
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 4
tagasi üles
vaata kasutaja infot saada privaatsõnum
andresv
HV kasutaja

liitunud: 06.12.2004



Autoriseeritud ID-kaardiga

sõnum 01.04.2009 15:07:19 vasta tsitaadiga

miks mitte kasutada parameetrite "bind"-imist?

http://ee.php.net/manual/en/mysqli-stmt.bind-param.php
Kommentaarid: 5 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 5
tagasi üles
vaata kasutaja infot saada privaatsõnum
d3t
HV Guru
d3t

liitunud: 14.05.2004




sõnum 01.04.2009 15:21:54 vasta tsitaadiga

inzinz, mina nt kipun kirjutama extends class config ja enne seda faili algusesse include config ala ja minu puhul oleks nt turvaauk kui saaks otse includida icon_wink.gif
_________________
next.Insiders - koht mängijatele ja tehnikahuvilistele toredaks ajaveetmiseks.
PT: Sony XE90 & LG C1 värvi kalibreerimine
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 72
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
nene
Kreisi kasutaja
nene

liitunud: 20.03.2004




sõnum 02.04.2009 21:39:42 vasta tsitaadiga

andresv kirjutas:
miks mitte kasutada parameetrite "bind"-imist?

http://ee.php.net/manual/en/mysqli-stmt.bind-param.php


Ma pean ütlema, et see MySQLi parameetrite bindimise värk on üks haigemaid API-sid mis ma näinud olen. Kõigepealt bindid mingid muutujad, ning hiljem nende muutujate väärtusi muutes muutuvad maagiliselt ka päringu parameetrite väärtused.

Kunagi proovisin seda asja kasutada kui kirjutasin endale üht andmebaasi klassi, kuid pärast pikka pusimist ja kirumist viskasin asja nurka ning kirjutasin ise mehhanismi SQL-i parameetrite asendamiseks.

Ei soovitaks seda asja kellelegi.

_________________
Mõistus otsas? Pane pinusse...
Kommentaarid: 24 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 23
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
inzinz
HV kasutaja

liitunud: 26.01.2005




sõnum 03.04.2009 01:15:49 vasta tsitaadiga

Peamine probleem nende keerukamate komponentidega, mis on süsteemi sisse ehitatud, ongi see, et nad käituvad mitte nii nagu sina tahad vaid nii nagu nende tegijad arvasid et oleks hea. Näiteks PHP enda DateTime klass oli veel mingi aeg suht jama, ning kuna ise seda muuta/overrideda ei saa, siis pidin tegema DateTimeBase klassi omale mis võimaldaks teha just täpselt niimoodi asju nagu vaja.
Ja lisaks kui antud komponendil on mingi bugi (mysqli extension näiteks, kus on neid bugisid aja jooksul ikka jagunud) siis pead ootama uut php versiooni või hakkama ise patchima ja kokku kompileerima.

mysql_query jms tavalised põhilised asjad on kindla peale töötavad ja nende peale oma klassi ülesse ehitades on esiteks hea näpuharjutus turvalise koodi kirjutamise jaoks ja teiseks kui tekib bugisid, saad alati ise kiirelt ära parandada ilma kolmandate osapoolte taga ootamata.

_________________
Upload.ee - eestimaine failiupload
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 4
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  WWW »  Maksimaalne turvalisus PHP+MySQL mine lehele 1, 2  järgmine
[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.