NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze – Lekce 6 - Obrana proti útoku Mass assignment v PHP

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
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.

Odpovědět
11.3.2014 17:37
New kid back on the block with a R.I.P
Avatar
Odpovídá 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.

Odpovědět
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

Editováno 14.3.2014 18:12
 
Odpovědět
14.3.2014 18:11
Avatar
jpicha
Člen
Avatar
Odpovídá 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;
}
 
Odpovědět
14.3.2014 18:29
Avatar
Odpovídá 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í.

Odpovědět
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

 
Odpovědět
14.3.2014 18:55
Avatar
Odpovídá 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)
Odpovědět
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" ?

 
Odpovědět
17.3.2014 8:18
Avatar
Odpovídá 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.

Odpovědět
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.

Editováno 17.3.2014 9:09
 
Odpovědět
17.3.2014 9:07
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 27.