Autor | Zpráva | ||
---|---|---|---|
xlifer Profil |
#1 · Zasláno: 12. 10. 2011, 16:40:41
Je nutné nebo doporučuje se v samostatném skriptu inicializovat proměnnou jako prázdnou? Příklad:
verze 1: $text = ""; // inicializace? $text .= "ahoj"; echo $text; verze 2: $text .= "ahoj"; echo $text; Omlouvám se možná za stupid dotaz, ale docela mě zajímá názor na věc... Osobně bych volil kód verze 2, protože pokud skript proběhne pouze jednou a před ani potom se proměnná text už nepoužívá, tak není riziko, že by se něcím naplnila nežádoucím. |
||
Joker Profil |
#2 · Zasláno: 12. 10. 2011, 16:48:28
xlifer:
Na co je tam to spojování? $text = "ahoj"; echo $text; Ta otázka mi přijde nesmyslná, přece vždycky se do proměnné musí něco přiřadit předtím než se s ní pracuje. Pokud se kód větví, jsem pro inicializaci, ušetří to potenciální problémy. Příklad: $text = ""; if($_GET["a"] == "b") { $text = "ahoj"; } echo($text); |
||
Alphard Profil |
#3 · Zasláno: 12. 10. 2011, 17:36:07
Joker:
„Ta otázka mi přijde nesmyslná, přece vždycky se do proměnné musí něco přiřadit předtím než se s ní pracuje.“ Ten příklad je hodně jednoduchý, ale typicky při plnění v cyklu vždy před cyklem dávám $text = ""; a pak už jen $text.="..."; (pokud není vhodnější plnit a pak spojit pole, ale v tom případě nejdřív vytvořím pole). Takže jsem pro variantu 1.
|
||
xlifer Profil |
#4 · Zasláno: 13. 10. 2011, 16:09:54
Alphard:
Díky za názor a varianta 1 mi přijde asi i přehlednější. |
||
xlifer Profil |
#5 · Zasláno: 13. 10. 2011, 16:11:28
Joker:
To spojování bylo myšleno tak, že se někde v průběhu běhu může něco přidat do $text, ale taky nemusí. Proto spojování. |
||
vynalezce_ Profil * |
#6 · Zasláno: 13. 10. 2011, 19:40:21
Jsem rozhodně pro variantu 1.
Krom důvodů, které zde padly je tu ještě problém, pokud je na tvém hostingu nastaveno register_globals ON (To ti umožní přistupovat k hodnotě $_POST["asdf"] / $_GET... i přes $asdf) Sice je to už defaultně vypnuté, ale na některých hostinzích (WebZdarma, IC,...) je to stále zapnuté.... Co vlastně hrozí? Příklad: login.php <? if($_GET["heslo"]=="Tajne_Heslo"){ $vpusten="1"; } if($vpusten=="1"){ echo "tajny obsah"; } ?> Co se ale stane, když zadám example.org/login.php?vpusten=1: Interpreter: Do proměnné vpusten ukládám hodnotu 1 z $_GET["vpusten"], <-- Za toto může register_globals ON. Podmínka na řádku 2 není splněna, přeskakuji, Proměnná vpusten MÁ hodnotu jedna => vypisuji "tajny obsah".... |
||
jenikkozak Profil |
#7 · Zasláno: 13. 10. 2011, 20:36:02
vynalezce:
„Co vlastně hrozí?“ Má to dva háčky: 1) Musíš do nápovědy hackerům napsat, že používáš proměnnou $vpusten. 2) Musíš psát ten skript tak hloupě, jak bylo uvedeno výše. Co třeba if($_GET["heslo"]=="Tajne_Heslo") //když je teda nutné tajné heslo posílat metodou get { echo "Tajnej obsah"; } |
||
Majkl578 Profil |
#8 · Zasláno: 14. 10. 2011, 00:13:25
[#1] xlifer:
2. případ má jeden zásadní problém. Emituje E_NOTICE (Notice: Undefined variable: text). Proměnné by se měly inicializovat vždy. Předejdeš tím výše zmíněnému problému s nedefinovanou proměnnou a zároveň budeš mít vždy jistotu nad tím, co v té proměnné je. [#6] vynalezce, [#7] jenikkozak: Problém s register_globals už není tak žhavý, jako před několika lety, jelikož verze 5.2 je už poměrně dlouho nepodporovaná, verze 5.3 byla vydána před dlouhou dobou a verze 5.4 (která mimochodem register_globals zcela odstraňuje) klepe na dveře a bude vydána ještě letos.
Pokud někdo používá hosting s povoleným/vynuceným register_globals , měl by ho okamžitě opustit.
|
||
Joker Profil |
#9 · Zasláno: 14. 10. 2011, 08:13:47
Alphard:
„typicky při plnění v cyklu vždy před cyklem dávám $text = ""; a pak už jen $text.="...";“ Jo, to je pravda, v tomhle případě je to taky užitečné, stejně jako u větvení. jenikkozak: „1) Musíš do nápovědy hackerům napsat, že používáš proměnnou $vpusten.“ Založit bezpečnost aplikace na „On hacker stejně nebude vědět, že se ta proměnná jmenuje zrovna takhle“ se už pár programátorům dost vymstilo. Navíc nejde jen o hackery. Další riziko neinicializování proměnných, zvláště u proměnných se jménem jako $text, je, že stejně pojmenovaná proměnná se už používá ve skriptu někde výše, případně později někdo o 200 řádků výš udělá úpravu a tu proměnnou zavede. A vůbec nejlépe v té proměnné něco bude jen za určitých podmínek, takže při testování na to nikdo nepřijde a na ostrém webu budou vznikat divné „náhodné“ chyby. Další věc je: Je nějaký důvod to nedělat? Je to jeden řádek kódu, dopad na rychlost skriptu je nulový (resp. neměřitelný) a má to výhody popsané výše. |
||
Časová prodleva: 12 dní
|
|||
jara Profil * |
#10 · Zasláno: 26. 10. 2011, 00:05:59
No mám asi podobný problém na eshopu jak píše Joker. Po nějaké době mě vypadne zboží z košíku. Vypadává nepravidelně po různě dlouhé době a tím vznikají divné náhodné chyby - viz. poslední příspěvek od Joker.
Mrknul byste se mě někdo na to za nějaký peníz? |
||
Časová prodleva: 14 let
|
0