Avatar
katrincsak
Člen
Avatar
katrincsak:

Zdravím,

potřeboval bych jen informace zda-li by kratší zápis dokázal ohrozit bezpečnost nebo ne.

Kvůli vyhledávači a různým kombinacím mám dotazů více různých, tak se snažím co nejlépe kod zmenšit a aby vše bylo co nejflexibilnější a bez zbytečného opakování se.

Návrh, který dodržuje bezpečnost:

Nelíbí se mi ale, že musím podmínku na $text vkládat u dalších podobných včetně tohoto 8 dotazů.

public function vyhledavacLVL1($text, $pocetOd, $pocetDo, $cenaOd, $cenaDo, $syntaxKategorie)
{
        try{
                if(empty($text))
                        $datasql = Db::dotazVsechny("select * from inzeraty where ".$syntaxKategorie." cena1 BETWEEN ? AND ? limit ?, ?",
                        array($cenaOd, $cenaDo, $pocetOd, $pocetDo));
                else
                        $datasql = Db::dotazVsechny("select * from inzeraty where ".$syntaxKategorie." match (nadpis) against (?) AND cena1 BETWEEN ? AND ? limit ?, ?",
                        array($text, $cenaOd, $cenaDo, $pocetOd, $pocetDo));
        return $datasql;
        }catch(PDOException $e){
                echo $e;
                exit;
        }
}

Proto bych rád udělal podmínku 1 a to ještě před dotazem MySQL ..

- Když se podíváte do sql dotazu, tak tam vidíte proměnnou ".$syntaxKate­gorie.", která obsahuje:

if(!empty($formatKategorie))
{
        $syntaxKategorie = "kateg_hlavni='".$formatKategorie."' AND ";
}

Vzhledem k tomu, že kategorie je limitovaná a fixně daná a jen v PHP se vybere o co go, tak mi nevadí hodnotu vkládat rovnou..

Potřeboval bych udělat vlastně úplně to samé, ale to že bych nahradil tímto způsobem funkci match v mysql a měl už rovnou vložený text na hledání, který vkládá uživatel.

Vím, že hodnoty vkládat rovnou je dosti nebezpečné, ale na druhou stranu to úplně rovnou vkládání není a je to stále přes nějakou proměnnou.. Nejsem ale v bezpečnosti expert a tak se držím nastavenými pravidly i když někdy neznám způsob útoku.

Snad jsem to napsal co nejvíce srozumitelně a i když je to možná teď blbost, může mi to pomoci v dalších řešeních které potkám. Aktuálně je to jen 8x opakovat podmínku o 3 řádcích na víc tedy 24 řádků na víc. Ale příště by to mohlo být 100 a tak bych rád měl jasno.

Děkuji za rady

-> Slibuji že zde monolog nepovedu :D (Kdo ví pochopí).

Editováno 22.9.2015 21:08
 
Odpovědět 22.9.2015 21:07
Avatar
Pythipa
Člen
Avatar
Odpovídá na katrincsak
Pythipa:

Ahoj, v rychlosti doporučuji - mrkni na tuto phpsec dokumentaci k SQL dotazům a bezpečnosti zde:
http://phpsec.org/…guide/3.html

 
Nahoru Odpovědět  +1 22.9.2015 21:18
Avatar
00
Člen
Avatar
00:

Kde se bere to $syntaxKategorie? Já bych to raději rovnou nevkládal.

 
Nahoru Odpovědět 22.9.2015 21:19
Avatar
katrincsak
Člen
Avatar
Odpovídá na 00
katrincsak:

Ten se vkládá tam,kde se vkládají ostatní data (před dotazem na SQL), ale $syntaxKategorie -> nemůže ovlivnit uživatel negativně...

Proč?

  1. Zadáváš to v selectu
  2. Ze selectu po odeslání to rovnou letí do switch a ptá se switch zda-li jsi mě našel a vysype pole a v opačném případě nevysype nic a výsledek je empty... Takže zde rozhodně nemůže uživatel nijak uškodit a je to chráněné ještě před dotazem..
 
Nahoru Odpovědět 22.9.2015 21:24
Avatar
00
Člen
Avatar
Odpovídá na katrincsak
00:

Co když $syntaxKategorie bude:

0; (něco škodlivého) --

?

 
Nahoru Odpovědět 22.9.2015 21:31
Avatar
00
Člen
Avatar
Odpovídá na 00
00:

Jako třeba

0; drop table inzeraty --
 
Nahoru Odpovědět 22.9.2015 21:33
Avatar
00
Člen
Avatar
Odpovídá na katrincsak
00:

A odkud se získá hodnota toho $syntaxKategorie?

 
Nahoru Odpovědět 22.9.2015 21:35
Avatar
00
Člen
Avatar
Odpovídá na katrincsak
00:

Aha, už to chápu. Omlouvám se, byl to omyl. Nepřečetl jsem to celé.

 
Nahoru Odpovědět  +1 22.9.2015 21:36
Avatar
katrincsak
Člen
Avatar
Odpovídá na 00
katrincsak:

I kdyby jsi dotaz jak koli donutil, tak potečou po odeslání sem:

public function kategorie($parametr)
        {
                switch($parametr)
                {
                        case 'detske':
                                $pole = array();
                        break;

                        case 'obleceni':
                                $pole = array ();
                        break;

                        case 'zvirata':
                                $pole = array();
                        break;

                        case 'nabytek':
                                $pole = array();
                        break;
                }
                return $pole;
        }

Samozřejmě v array jsou subKategorie, ale ty jsem smazal kvůli přehlednosti i zároveň switch je delší.

V tvém případě by dotaz nebyl nalezen a tak $pole == empty a tak i empty informace leze dále :-)

Jenže u toho $text je to samozřejmě jiné to už přímo vkládá uživatel...

To co mi poslal Pythipa, tak by teoreticky mělo stačit text jen pročistit od škodlivých znaků a bylo by to ok.. Asi...

 
Nahoru Odpovědět 22.9.2015 21:41
Avatar
katrincsak
Člen
Avatar
Odpovídá na 00
katrincsak:

Je to dlouhé, ale nevím jak bych to napsal s méně popisem.

samozřejmě název proměnné je opět jiný protože to ještě leze přes úpravu textu jako odstranění velkých písmen ,odstranění diakritiky atp.. :)

Editováno 22.9.2015 21:45
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět 22.9.2015 21:43
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 10.