Vajíčková mánie Vajíčková mánie
Vyšlehej si extra vědomosti! Až 100% bodů na prémiový obsah zdarma! Více zde
Avatar
Václav Methez:17.11.2018 19:48

Mám funkci na autoloader tříd kde mám dvě proměnné po sobě 2x

function autoload($class){

    $class = ltrim($class, '\\');
    $last = strripos($class, '\\');

    if($last){
        // Jak tohle kurva může fungovat?
        $namespace = substr($class, 0, $last);
        $namespace = str_replace('\\', DIRECTORY_SEPARATOR, $namespace);
        $class = substr($class, $last + 1);
        $class = str_replace('_', DIRECTORY_SEPARATOR, $class);

        $file  = $namespace  . DIRECTORY_SEPARATOR . $class . '.php';
    }
    else{
        $file = $class . '.php';
    }

    $paths = explode(PATH_SEPARATOR, get_include_path());


    foreach($paths as $path){
        if(file_exists($path . "/" . $file)){
            require($path . "/" . $file);
            return true;
        }
    }

    return false;
}

spl_autoload_register("autoload");
spl_autoload_extensions(".php");

Zkusil jsem: Nic

Chci docílit: Můj dotaz je jestli to lze v obyčejné funkci. takto mít, protože zatím vše funguje jak má a divim se tomu jak je možné že to funguje? :D Možná je to blbý dotaz ale fakt by mě to zajímalo jak je možné že to funguje :D

 
Odpovědět 17.11.2018 19:48
Avatar
Jirka
Člen
Avatar
Odpovídá na Václav Methez
Jirka:17.11.2018 20:14

Ahoj,

řekl bych, že to $namespace a $class prostě změní typ.

Možná to není úplně košer, ale jinak OK. Jde o slabě typované PHP.

Editováno 17.11.2018 20:15
Nahoru Odpovědět 17.11.2018 20:14
Kdo nic nedělá, nic nezkazí.
Avatar
Jirka
Člen
Avatar
Odpovídá na Václav Methez
Jirka:17.11.2018 20:24

Omyl. Omlouvám se, asi nejde o změnu typu.

Nahoru Odpovědět  +1 17.11.2018 20:24
Kdo nic nedělá, nic nezkazí.
Avatar
Peter Mlich
Člen
Avatar
Odpovídá na Václav Methez
Peter Mlich:19.11.2018 8:19

A co presne ti neni jasne? Co podle tebe a jak melo fungovat?

http://php.net/

$class = "\\\aaa\bbb\ccc_ddd"
ltrim - odstrani ze zacatku stringu \ (str) // "aaa\bbb\ccc_ccc"
strripos - najde od konce pozici posledniho \ (int / false) // -3 nebo strlen("aaa\bbb\")
substr - od 0 po lomitko \ uloz do $namespace // "aaa\bbb"
str_replace - nahrad \ za jiny znak // "aaa/bbb"
substr($class, $last + 1); - ziskej druhou cast na text na konci // "ccc_ddd"
str_replace - nahrad _ za jiny znak  // "ccc/ddd"

$file  = $namespace  . DIRECTORY_SEPARATOR . $class . '.php';
"aaa/bbb" + / + "ccc/ddd" +  '.php'

ELSE, pokud tam lomitko neni, cili string je neco takoveho
"aaa_bbb_ccc_ccc"
$file = $class . '.php';
"aaa_bbb_ccc_ccc" +  '.php'

Super je, ze cely ten kod ma nulove zabezpeceni. Klidne mu tam muzes dat "../../xxx" nebo "xxx/../../../yyy" nebo ".htaccess"

Editováno 19.11.2018 8:21
 
Nahoru Odpovědět 19.11.2018 8:19
Avatar
Odpovídá na Peter Mlich
Václav Methez:25.11.2018 23:26

Dobře měl bych otázku. Jak se tedy vyvaruji této chyby aby někdo nemohl načíst htaccess nebo aby se funkce nedostala kam měla? Děkuji za rady.

 
Nahoru Odpovědět 25.11.2018 23:26
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:26.11.2018 7:54

Zablokujes to pres htaccess a nastaveni prav u souboru a slozek?
A nebo muzes kontrolovat strom slozek.
Ten algoritmus nedela zadna overovani. Sice pekne posklada adresu, ale to je vsechno.

 
Nahoru Odpovědět 26.11.2018 7:54
Avatar
Odpovídá na Peter Mlich
Václav Methez:26.11.2018 8:58

Aha tak to jo. Mě jde jen o to načíst třídy které mají namespace. Myslel jsem že je přímo v tom kódu nějaká bezpečnostní chyba?

 
Nahoru Odpovědět 26.11.2018 8:58
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:26.11.2018 15:55

Spoustu.

 
Nahoru Odpovědět 26.11.2018 15:55
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 8 zpráv z 8.