Hľadáme nové posily do ITnetwork tímu. Pozri sa na voľné pozície a pridaj sa k najagilnejšej firme na trhu - Viac informácií.
IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

Diskusia – Obrana proti útoku Mass assignment v PHP

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

Komentáre
Avatar
David Hartinger
Vlastník
Avatar
David Hartinger:11.3.2014 17:37

Díky za první článek o bezpečnosti v PHP. Ten PDO wrapper je nějaký divný, protože nepoužívá prepared statements a escapuje si to sám, místo aby to nechal na databázi. Kvalitě článku to samozřejmě neubírá, je to jen příklad.

Odpovedať
11.3.2014 17:37
New kid back on the block with a R.I.P
Avatar
Odpovedá na David Hartinger
Martin Konečný (pavelco1998):11.3.2014 18:43

Prepared statements by samozřejmě byly vhodnější, ale je to prakticky stejný příklad, jako když někdo používá toto:

$pdo->query("
  UPDATE `tabulka`
  SET `sloupec` = 'hodnota'
  WHERE `id` = " . $_GET["id"] . "
");

A že jsem takový kód neviděl jen zřídka - i přes to, že PDO parametrizované dotazy podporuje.

Odpovedať
11.3.2014 18:43
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
jpicha
Člen
Avatar
jpicha:14.3.2014 18:11

Techická sem začátečník s php a na vstupní hodnoty mam toho třeba.

$modul['title'] = htmlspecialchars(@$_POST['title'], ENT_QUOTES);
if(empty($modul['title'])){
    $message["error"][] = "Title modulu musíte zadat.";
}elseif(!onlyLetterNumberSpace($modul['title'])){
    $message["error"][] = "Title modulu obsahuje neplatné znaky.";
}elseif(mb_strlen($modul['title']) < "4"){
    $message["error"][] = "Title modulu musí obsahovat minimálně 4 znaky.";
    $arr['title'] = $modul['title'];
}elseif(mb_strlen($modul['title']) > "32"){
    $message["error"][] = "Title modulu musí obsahovat maximálně 32 znaků.";
    $arr['title'] = $modul['title'];
}else{
    $arr['title'] = $modul['title'];
}

Když mam povolený jenom určitý znaky, který se můžou poslat jinak to vyhodí hlášku a neuloží se tak mě todle nehrozí nebo tam mam ještě něco špatně.
Děkuji za info

Editované 14.3.2014 18:12
 
Odpovedať
14.3.2014 18:11
Avatar
jpicha
Člen
Avatar
Odpovedá na jpicha
jpicha:14.3.2014 18:29

Ještě funkce onlyLetterNum­berSpace

function onlyLetterNumberSpace($text){
    $text = preg_match("/^[0-9a-zA-Z^áčďéěíňóřšťůúýž^ÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ^\s]+$/", $text);
    return $text;
}
 
Odpovedať
14.3.2014 18:29
Avatar
Odpovedá na jpicha
Martin Konečný (pavelco1998):14.3.2014 18:43

Jelikož jsi začátečník, tak pochybuji, že máš nějaký databázový wrapper, ve kterém bys funkci předal pole a ona sestavila SQL dotaz.
Když tak pošli tu část, kde pracuješ s databází, ať ti mohu odpovědět přesně, ale myslím, že ti tento druh útoku nehrozí.

Odpovedať
14.3.2014 18:43
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
jpicha
Člen
Avatar
jpicha:14.3.2014 18:55

Na to mam dibi, když me to projde těma validačníma podmínkama tak se mě to uloží to pole $arr přes tendle příkaz

dibi::query('INSERT INTO [:cms:neco]', $arr);

do mysql

 
Odpovedať
14.3.2014 18:55
Avatar
Odpovedá na jpicha
Martin Konečný (pavelco1998):14.3.2014 21:10

Tvůj kód vypadá v pořádku. Pokud si vytvoříš samostatné pole, do kterého ručně napíšeš klíče a hodnoty, pak je to OK. Pro tento útok bys to musel mít v takovémto tvaru:

dibi::query("INSERT INTO [:cms:neco]", $_POST);

A nebo že bys sloučil obě pole:

$arr["title"] = "hodnota";
$arr = array_merge($arr, $_POST);
dibi::query("INSERT INTO [:cms:neco]", $arr)
Odpovedať
14.3.2014 21:10
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
sweetboi
Člen
Avatar
sweetboi:17.3.2014 8:18

takze, kdo nepouziva DB wrapper je porad zacatecnik ? :-) Jak utocnik zjisti, ze v DB je sloupec "Admin" a nasledne mu podstrci hodnotu "1" ?

 
Odpovedať
17.3.2014 8:18
Avatar
Odpovedá na sweetboi
Martin Konečný (pavelco1998):17.3.2014 8:54

O začátečníkovi nebyla v článku zmínka.

Útočník to nezjistí, pokud mu to sám neřekneš. :-) Ale na tohle se v žádném případě nespoléhej, protože i kdyby se to stalo čistou náhodou, pořád by si útočník změnil práva na admina.
Jak lze podstrčit tu jedničku, je napsáno ve článku.

Odpovedať
17.3.2014 8:54
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
sweetboi
Člen
Avatar
sweetboi:17.3.2014 9:07

Prominte, ale to co tu popisujete je hloupost jak mraky :-)

  1. jen ignorant vytvori hidden pole Admin
  2. jen ignorant bude skladat sql dotaz z prichozich POSTu
  3. jen ignorant nebude chranit vstupy proti SQL injection

pokud toto ignorant nebude delat, nema utocnik sanci updatovat jakekoliv jine pole, nez ty ktere poslete do SQL prikazu.

Editované 17.3.2014 9:09
 
Odpovedať
17.3.2014 9:07
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zatiaľ nikto nevložil komentár - buď prvý!