Autor Zpráva
venca12
Profil
Ahoj,

je dobré používat toto:


if ( isset($_POST["prom"]) ? $_POST["prom"] == "you" : false ) { echo "krutá podmínka"; }


pokud chci předejít hlášení o nedefinovaných proměnných, anebo existuje lepší řešení, anebo se na to mám vyfláknout a hlášení ignorovat?
Anonymní
Profil *
programator by nemal chyby ignorovat ale snazit sa ich riesit
alternativne mozes riesit if( isset($_POST["prom"]) && $_POST["prom"] == "you" ) ..
venca12
Profil
Jj s tim souhlasím, otázka je, jestli se tahle chyba ještě vyplatí řešit, když se jedná jenom o kosmetickou úpravu. Php mi nikdy žádnou nedefinovanou proměnnou žádnou náhodnou hodnotou nenaplnilo. Není celá tahle věc, jenom přežitek z jiných prog. jazyků?

Btw. díky za řešení, byť je to nelogické, tak jsem žil v přesvědčení, že php neinteligentně otestuje všechny výrazy v podmínce i když jsou spojené andem a první z nich je false. Není to pravda, funguje to dobře.
koudi
Profil
Nebo můžeš taky všechny proměnný na začátku incializovat. Tím ti odpadne tohle a navíc se ubráníš vstupům při register_globals=on. (nikdy nevíš na jakym serveru ti to poběží)
Aesir
Profil
venca12:
Php mi nikdy žádnou nedefinovanou proměnnou žádnou náhodnou hodnotou nenaplnilo.
PHP neplní neinicializované proměnné náhodně, ale jejich standartní hodnotou podle typu (false, empty string...).

Není celá tahle věc, jenom přežitek z jiných prog. jazyků?
Podle mého je inicializace proměnných v PHP dobrý zvyk více, než kde jinde, protože PHP vás k tomu nenutí, pouze na to upozorní chybou úrovně E_NOTICE.

anebo se na to mám vyfláknout a hlášení ignorovat?
Určitě ne, práce s neinicializovanou proměnnou je asi nejčastější bezpečnostní chyba v PHP aplikacích.
Aesir
Profil
koudi:
Nebo můžeš taky všechny proměnný na začátku incializovat.
To bych u proměnných, které jsou zvenčí (post, get) nedělal. :)
venca12
Profil
Nebo můžeš taky všechny proměnný na začátku incializovat. Tím ti odpadne tohle a navíc se ubráníš vstupům při register_globals=on. (nikdy nevíš na jakym serveru ti to poběží)
Jj, měl jsem ale na mysli proměnné například předávané pomocí metody POST, GET a podobně. Tam kdybych si je inicializoval nějakou hodnotou, tak přijdu o to, co jsem si do nich předtím předal.

PHP neplní neinicializované proměnné náhodně, ale jejich standartní hodnotou podle typu (false, empty string...).
Myslel jsem si, že když je proměnná neinicializovaná, tak kompilátor neví jakého datového typu je...ale přitom si mi v nich nikdy neobjevily žádné náhodné hodnoty.

Určitě ne, práce s neinicializovanou proměnnou je asi nejčastější bezpečnostní chyba v PHP aplikacích.
To ano v případě register globals, kdy Vám může kdokoli, kamkoli podstrčit. Ale v případě nedefinované proměnné předávané například pomocí metody POST, nemám ponětí jak předejít útokům inicializací této proměnné. Respektive, jak takovou proměnnou inicializovat. Když si ji ověřím pomocí isset, tak pokud nebude takováto proměnná definovaná, můžu jí nastavit nějakou defaultní hodnotu. Pokud mi do ní ale bude chtít někdo něco podstrčít, tak definovaná bude a moje hodnota bude k prdu.
Aesir
Profil
venca12:
Myslel jsem si, že když je proměnná neinicializovaná, tak kompilátor neví jakého datového typu je...
To si zjistí podle toho, jak se s tou proměnnou zachází, PHP ji prostě přetypuje a naplní default hodnotou.

V případě proměnných zvenčí samozřejmě inicializovat nemůžete a namístě je pečlivá kontrola obsahu přijaté proměnné, tzn. nejen typu, ale například předpokládané délky, nepovolených znaků a podobně.
venca12
Profil
To si zjistí podle toho, jak se s tou proměnnou zachází, PHP ji prostě přetypuje a naplní default hodnotou.

V případě proměnných zvenčí samozřejmě inicializovat nemůžete a namístě je pečlivá kontrola obsahu přijaté proměnné, tzn. nejen typu, ale například předpokládané délky, nepovolených znaků a podobně.

Jj, php ji přetypuje, když ji naplním nějakou hodnotou. Potom už ale není proměnná neinicializovaná. A kontrola obsahu proměnné, abych zjistil jestli mi tam někdo něco nepodvrhl už také nemá s inicializací nic společného.

Když zvážím všechny tyhle alternativy, tak mi čím dál tím víc připadá kontrola nedefinovaných proměnných, jako zbytečnost.
Aesir
Profil
venca12:
Jj, php ji přetypuje, když ji naplním nějakou hodnotou. Potom už ale není proměnná neinicializovaná.
Proměnná nemusí být inicializovaná a při tom může mít typ, např.:

settype($foo, "integer");
var_dump($foo);

V tomto případě ji PHP nastaví standartní hodnotu pro integer, tedy 0.

A kontrola obsahu proměnné, abych zjistil jestli mi tam někdo něco nepodvrhl už také nemá s inicializací nic společného.
Má společného právě s proměnnými, které nemůžete ve skriptu inicializovat, bez této kontroly vzniká velké bezpečnostní riziko.
Joker
Profil *
Já bych řekl, že nejjednodušší řešení je vypnutí chybových hlášek úrovně NOTICE :-)

A neřekl bych, že to představuje nějaké bezpečnostní riziko... typicky se to týká proměnných získaných "zvenku" (get, post a tak), kam mi tak jako tak může každý podstrčit cokoliv chce. S proměnnou uvnitř PHP se mi tohle ještě nestalo, jelikož proměnné tak jako tak nejdřív přiřadím nějakou hodnotu a až potom s ní nějak pracuju :)

Já to prostě budu řešit nezobrazováním těch hlášek :)
Jinak by každý skript musel začínat blokem:
if(!isset($_GET["promenna"])) $_GET["promenna"] = "";
přičemž pokud jeden skript za různých situací zobrazuje různé stránky a přijímá různé sady GET a POST proměnných, případně v některých případech kontroluje cookie nebo session, můžu takhle na začátku inicialializovat desítky proměnných, přičemž s většinou z nich pak vůbec nepracuju.

anebo přepsat všechny IFy, například:

if((intval($_POST["id"]) > 0) || ((intval($_POST["kontrola") > 0) && (intval($_POST["kontrola"]) == intval($_SESSION["kontrola"]))))

na:

if((isset($_POST["id"]) && (intval($_POST["id"]) > 0)) || (((isset($_POST["kontrola") && isset($_SESSION["kontrola"])) && (intval($_POST["kontrola"]) > 0) && (intval($_POST["kontrola"]) == intval($_SESSION["kontrola"])))))


přičemž zde máte názornou ukázku, jak to zesložití a znečitelní celou tu podmínku
koudi
Profil
Aesir
To bych u proměnných, které jsou zvenčí (post, get) nedělal. :)
No tak to je poměrně samozřejmý :)
Anonymní
Profil *
a co skusit nieco podobne:
$_GET_def=array(
'kluc1'=> 'hodnota1',
'kluc2' => 'hodnota2');
$_GET=array_merge($_GET_def, $_GET);
Toto téma je uzamčeno. Odpověď nelze zaslat.