Autor Zpráva
Tori
Profil
Pracuji na přihlašování uživatelů technikou výzva-odpověď (upravená verze návodu J.Vrány), a narazila jsem na chování formuláře, které si nevím vysvětlit. Ukázka:
<script>
// .... funkce getChallenge() a hmac() fungují podle očekávání, takže nevypisuji
function sha1form(f) {
	if (!challenge) {    // ověření, jestli se ajaxem získala poslední použitá výzva pro zadané uživatelské jméno
		return false;
	}
	f['password'].disabled = true;
	f.submit();
	f['password'].disabled = false;
	return true;
}
</script>

<form action="" method="post" onsubmit="return !sha1form(this);">
<input type="hidden" name="pwd_hash" value="">
  <table cellpadding="3">
  <tr><td class="name">Uživatel:</td><td>
    <input type="text" id="username" name="username" onchange="getChallenge(this.form);" maxlength="32" size="20">
    <script>document.getElementById('username').focus();</script> </td></tr>
  <tr><td class="name">Heslo:</td><td>
    <input type="password" name="password" onchange="hmac(this.form);" size="20"></td></tr>
  <tr><td colspan="2"><input type="submit" value="Přihlásit"></td></tr>
  </table>
</form>

Při odeslání formuláře se má vypnout pole 'password', a odešle se jen otisk hesla. Pokud má uživatel vypnutý JS a pošle heslo jako plain text, je přihlášen s nižším oprávněním. Jde o to, že se mi odesílalo i pole 'password', přestože bylo vypnuté ve chvíli odeslání formuláře (jak jsem si ověřila přes alert(f['password'].disabled) ). Nakonec pomohlo negovat návratovou hodnotu u sha1form(), jak zvýrazněno.

Můžete mně, prosím, poradit, proč to funguje takhle? Myslela jsem, že když funkce v atributu onsubmit vrátí false, tak se formulář neodešle = pokud přidám negaci, tak se odešle jen pokud proměnná challenge bude prázdná. Snažila jsem se odpověď najít na netu, ale pořád mi připadá, že to funguje přesně opačně, než by mělo.

Děkuji moc za vysvětlení.
Fred
Profil
I když je disabled stále má hodnotu.

příklad:
<input type="password" id="psw" disabled="disabled" value="heslo">
<input type="button"  onclick="alert(document.getElementById('psw').value)">
Chamurappi
Profil
Reaguji na Freda:
Hodnotu sice má, ale ta se při stavu disabled neodesílá.


Reaguji na Tori:
Myslela jsem, že když funkce v atributu onsubmit vrátí false, tak se formulář neodešle
To je pravda. Ale v uvedeném kódu (bez negace) se prohlížeč ptá tvého onsubmitu: Mám se odeslat? — a tvůj onsubmit mu odpovídá: Zakaž heslo, odešli se, povol heslo a ano, máš se odeslat. Na to první odeslání f.submit() nemá dostatek času a při druhém už heslo povolené je.
Tori
Profil
Chamurappi:
Díky moc!

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

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

0