Autor | Zpráva | ||
---|---|---|---|
jefitto44 Profil |
#1 · Zasláno: 11. 3. 2015, 17:25:13
V inpute chcem, aby si formulár zapamätal to, čo do neho užívateľ zadá. Je to pochopiteľné, ak sa vyskytne chyba, nemusí všetko vypisovať odznova. Za bežných okolností by som to spravil tak
<input type="text" name="dajakeName" value="<?=((isset($_POST["dajakeName"])&&!empty($_POST["dajakeName"]))?$_POST["dajakeName"]:"")?>"> Naivne som si na tento zložitý postup urobil takúto funkciu function issetEmpty($var) { if(isset($var)&&!empty($var)) return TRUE; else return FALSE; } |
||
Corwin Profil |
tak za 1. je velice vhodné tam vypisovat POST data ošetřená přes htmlspecialchars. a za 2. !empty samo o sobě stačí. isset navíc je zbytečný.
<input type="text" name="dajakeName" value="<? if(!empty($_POST['dakeJmeno'])) echo htmlspecialchars($_POST['dakeJmeno']); ?>"> PS.: proč to hází chybu: proměnná je nejdřív zmíněná v argumentu funkce, kterou voláš. tedy issetEmpty($_POST["neco"]) vrátí notice dřív, než vůbec proběhne funkce isset a empty. |
||
tiso Profil |
#3 · Zasláno: 11. 3. 2015, 17:30:51
Stačí ti
!empty
Okrem toho normálne sa do formuláru nevypisujú priamo vstupné hodnoty. |
||
juriad Profil |
#4 · Zasláno: 11. 3. 2015, 17:32:14
Nelze to zabalit do funkce. isset funguje, protože „this is a language construct and not a function“.
|
||
jefitto44 Profil |
#5 · Zasláno: 11. 3. 2015, 17:39:12
tiso:
„Okrem toho normálne sa do formuláru nevypisujú priamo vstupné hodnoty.“ A ako ich mám teda vypísať? |
||
juriad Profil |
#6 · Zasláno: 11. 3. 2015, 17:43:23
tiso:
Naopak je to velice hodné, pokud uživatel při vyplňování formuláře udělá chybu. Přeci jej nebudeš nutit vypisovat vše znovu. |
||
tiso Profil |
#7 · Zasláno: 11. 3. 2015, 17:49:56
Napríklad takto
$default = array(...); if (isset($_POST['submit']) { //spracuj form //ak je vsetko ok redirect $default = $_POST + $default; } //vypis form, s datami z $default, nezabudni ich osetrit juriad: „Naopak je to velice hodné...“ Ale nie priamo. |
||
jefitto44 Profil |
#8 · Zasláno: 11. 3. 2015, 17:51:02
A prečo nie priamo? Hesla samozrejme nenechám vypísať do inputu, až taký luzer nie som
|
||
Joker Profil |
#9 · Zasláno: 11. 3. 2015, 18:06:09
jefitto44:
„A prečo nie priamo?“ Jednoduché: <input type="text" name="dajakeName" value="<?=((isset($_POST["dajakeName"])&&!empty($_POST["dajakeName"]))?$_POST["dajakeName"]:"")?>"> "><!-- ?
|
||
Kubo2 Profil |
#10 · Zasláno: 11. 3. 2015, 21:58:45
jefitto44:
Preto nie priamo. Mimochodom, existuje malý trik, ako zaistiť, aby tvoja funkcia kontrolovala priamo premennú, ktorú jej uvedieš ako argument miesto použitia jej hodnoty. <?php function renderVarSilent(& $var) { if(!empty($var)) { echo($var); } } $greeting = 'Hello World!'; renderVarSilent($greeting); // vypíše "Hello World!" renderVarSilent($undefined); // nevypíše nič ?> Takto ti interpret poznámku nebude generovať, pretože nepracuješ priamo s premennou (viď [#2].PS), ale s referenciou na premennú (prečítaj si o tom v manuále). |
||
Tomáš123 Profil |
Joker:
Je mi jasné, čo môže priame vypisovanie dát spôsobiť. Ako ale ošetriť možnosť, že niekto bude mať napríklad v hesle znak "<". Funkcia htmlspecialchars() ho premení na entitu. Čo ak si užívateľ tejto zmeny nevšimne (ja by som počet znakov v hesle nepočítal)? Zbytočne to spôsobí ďalšie problémy. Nenarážam na ošetrovanie vstupných dát celkovo, ale zaujíma ma spôsob, ako ošetrovať iba to vhodné.
Napadá mi vytvoriť pole s nežiadúcimi sekvenciami znakov a funkciou str_replace() prečesávať a prípadne nahrádzať vstupy. V zložitejších prípadoch možno regulárne výrazy, ale tie priveľmi spomaľujú na diagnostiku znakov.
Šlo by to takto riešiť aj v realite? jeffito44: Prepáč, ak som ti do niečoho skočil. Ty si v tomto vlákne primárny, tak sa pokojne pýtaj. Toto je len taká otázka pomimo. |
||
Keeehi Profil |
Tomáš123:
Je to naprosto jednoduché. Heslo vůbec do stránky nevypisovat. Nenapadá mě jediný scénář, kde by bylo chytré nebo dokonce nezbytné heslo vypisovat. Navíc když to proženeš htmlspecialchars() a vložíš to jako value, tak se to správně interpretuje jako jeden znak. Odkaz |
||
Tomáš123 Profil |
#13 · Zasláno: 12. 3. 2015, 16:23:38
Keeehi:
Aha, dík, nevyskúšal som si to. |
||
jefitto44 Profil |
#14 · Zasláno: 12. 3. 2015, 16:37:34
Ja vstup od užívateľa čo sa hesla týka priamo ohashujem a to znamená, že si tam môže písať čo chce a prevedie sa to na bezpečný string
|
||
Keeehi Profil |
#15 · Zasláno: 12. 3. 2015, 17:01:34
jefitto44:
Nádhera ale jako většinou zase mimo mísu. Tomáš123 měl starosti o to, jak se to bude chovat zapsané do atrubutu value u inputu. Tam bys rozhodně nechtěl psát ten hash. Když už, tak "přesně" to, co ti uživatel poslal, ale lepší bude tam nepsat nic. Jak už jsem zmiňoval dříve, neznám jedinou reálnou situaci, kdy by to bylo potřeba. Nebo ty snad ano? |
||
martin1312 Profil |
#16 · Zasláno: 12. 3. 2015, 17:39:54
Keeehi:
Čo je zlé na vypísaní odoslaného hesla pri chybe vo validácií formulára? Podľa mňa by to mala byť samozrejmosť, ako užívateľovi mi nesmierne lezie na nervy, keď sa niekde registrujem, zadám nejakú položku nesprávne (captcha,...) a po odoslaní sa mi vymaže heslo a musím ho písať znova 2x. |
||
Keeehi Profil |
#17 · Zasláno: 12. 3. 2015, 18:27:19
martin1312:
Tak už třeba proto, že se tím bude vyskytovat v kódu stránky. Ten se pak může snadno dostat do nějaké keše a z ní to může zase uniknout dál. Ne že by data byla při odesílání formuláře nějak lépe chráněná, ale na čím méně místech se heslo bude vyskytovat, tím lépe. Za další je to dost nestandardní chování. Už jsem se s tím sice setkal, ale to číslo webů, které to tak mají je mizivé. No a jelikož je to pro mě jako uživatele něco neznámého a nemám možnost si zkontrolovat, co mi to tam vlastně ta stránka předvyplnila, tak to raději smažu a napíšu znovu. Takže vyplněním jsi mi vlastně přidělal práci. Musel bys mi tam k tomu připsat nějakou veselou poznámku, že heslo je v pořádku a že potřebuješ jen opravit captchu a znemožnit mi editaci toho hesla. Pak je ale naprosto jedno, jaké znaky budou ve value toho inputu. Můžeš tam vygenerovat cokoli. Jen to musí mít stejný počet znaků jako heslo. Ve skutečnosti tam můžou být třeba pomlčky. |
||
martin1312 Profil |
Keeehi:
Jasne tomu rozumiem, že by sa malo vyskytovať na čo najmenej miestach. Zas pre mňa sa javí moja varianta ako štandardná, možno by to chcelo urobiť nejaký prieskum na bežných užívateľoch. Pár ľudí (ne IT) som sa to pred časom námatkovo pýtal a bolo to približne 50:50. |
||
Keeehi Profil |
#19 · Zasláno: 13. 3. 2015, 01:45:52
Ptaní je na nic. Musel bys udělat klasické uživatelské testování nebo vytvořit reálně vice variant, zobrazovat je různým uživatelům a zkoumat, jak se chovají.
|
||
jefitto44 Profil |
#20 · Zasláno: 13. 3. 2015, 06:33:20
Keeehi:
„Tam bys rozhodně nechtěl psát ten hash.“ A ako by som do inputu vytiahol hash? Však to by už bol hash a pri ukladaní do DB by sa z neho spravil Ďalší hash (hash z hashu), čiže heslo by tak či tak nefungovalo... Najlepšie heslo nepísať nikde a hotovo |
||
Keeehi Profil |
#21 · Zasláno: 13. 3. 2015, 07:04:16
jefitto44:
To já nevim, ty jsi začal s hashem když diskuse byla jak bezpečně poslat přijatou hodnotu zpět do formulářového prvku. Doporučil bych ti číst pořádně co píšou ostatní než se rozhodneš něco napsat a ujistit se, že chceš psát o tom samém. Stává se ti poměrně dost často, že píšeš sice třeba něco pravdivého, co ale ovšem s problémem nesouvisí. |
||
jefitto44 Profil |
#22 · Zasláno: 13. 3. 2015, 08:20:43
Problém predsa bol, ako dostať heslo do inputu... v mojom prípade to samozrejme nie je možné, nakoľko do inputu by som už dostal hash. A ak by v tom inpute bol hash, to znamená, že pri ďalšom odoslaní formulára by z toho vznikol hash z hashu z hesla. A to už nie je ot heslo, čo zadal užívateľ. O tom hovorím
|
||
tiso Profil |
#23 · Zasláno: 13. 3. 2015, 10:05:56
jefitto44: „Problém predsa bol, ako dostať heslo do inputu“
Tento problém si si vytvoril ty sám v [#8], dovtedy sa o žiadom hesle nepísalo. |
||
han5vk Profil |
#24 · Zasláno: 13. 3. 2015, 16:16:02
[#22] jefitto44
Tu sa ale hovorí o hesle, ktoré zadá v plaintexte používateľ do formulára. To potom máš v $_POST a vieš mu ho vyplniť pri vrátení formulára (ajkeď sa to tak zvyčajne pre dobré dôvody nerobí). Neriešime tu heslo, ktoré už máš uložené v databáze pri zaregistrovanom používateľovi. To heslo by nemalo byť dostupné, tobôž nie v pôvodnej podobe (bez hashu/bcryptu...).
|
||
Časová prodleva: 9 let
|
0