Autor Zpráva
jefitto44
Profil
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;
}
, ktorá by mala vraciať true, alebo false podľa toho, či je to nastavené a zároveň či v tom niečo je. Lenže, vypisuje mi to stále notice, že undefined index. Ako sa to dá vypsraviť, aby som zakaždým nemusel vypisovať isset aj !empty?
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
Stačí ti !empty
Okrem toho normálne sa do formuláru nevypisujú priamo vstupné hodnoty.
juriad
Profil
Nelze to zabalit do funkce. isset funguje, protože „this is a language construct and not a function“.
jefitto44
Profil
tiso:
Okrem toho normálne sa do formuláru nevypisujú priamo vstupné hodnoty.

A ako ich mám teda vypísať?
juriad
Profil
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
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
A prečo nie priamo? Hesla samozrejme nenechám vypísať do inputu, až taký luzer nie som
Joker
Profil
jefitto44:
A prečo nie priamo?
Jednoduché:
<input type="text" name="dajakeName" value="<?=((isset($_POST["dajakeName"])&&!empty($_POST["dajakeName"]))?$_POST["dajakeName"]:"")?>">
Jak to dopadne, když hodnota $_POST["dajakeName"] bude: "><!--?
Kubo2
Profil
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
Keeehi:
Aha, dík, nevyskúšal som si to.
jefitto44
Profil
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
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
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
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
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
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
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
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
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
[#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...).

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: