Jméno a heslo v adresách
- mkrause
- Člen | 20
Ahoj Davide, nejsem si jist, že je rozumné, když třída Uri při generování vkládá do absolutního URL na zaheslovaném webu jméno a heslo. Jednak mi to nepřipadá moc bezpečné (jméno a heslo se tak může ukládat např. v keších), jednak to IMHO zbytečně supluje funkci prohlížeče, který si přihlášení pamatuje sám a hlavně, prohlížeče se proti takto formulovaným URL zřejmě z bezpečnostních důvodů brání, takže ve Firefoxu 3 to např. u CSS a JS naopak vynutí vyhození dialogu pro zadání jména a hesla a Opera se uživatele ptá, jestli to URL chce opravdu navštívit.
- David Grudl
- Nette Core | 8218
To je rozhodně nechtěné, ale kde konkrétně se to projevuje, nemůžu to nějak vystopovat? Našel jsem to jen u Presenter::redirect() – je to ještě jinde?
- mkrause
- Člen | 20
Podle mě se to děje všude tam, kde se generuje absolutní URL pomocí třídy Uri, protože relevantní metody vypadají takto:
/**
* Returns the entire URI including query string and fragment.
* @return string
*/
public function getAbsoluteUri()
{
return $this->scheme . '://' . $this->getAuthority() . $this->path
. ($this->query == '' ? '' : '?' . $this->query)
. ($this->fragment == '' ? '' : '#' . $this->fragment);
}
/**
* Returns the [user[:pass]@]host[:port] part of URI.
* @return string
*/
public function getAuthority()
{
$authority = $this->host;
if ($this->port && ($this->scheme !== 'https' || $this->port != 443) && ($this->scheme !== 'http' || $th
$authority .= ':' . $this->port;
}
if ($this->user != '') { // ----- PROBLÉM JE TADY
$authority = $this->user . ($this->pass == '' ? '' : ':' . $this->pass) . '@' . $authority;
}
return $authority;
}
Já jsem na to narazil při přímém použití této třídy, když si do šablony propaguji baseUri, respektive když někde potřebuji pracovat s aktuálním URL.
- David Grudl
- Nette Core | 8218
Trošku ten problém rozeberu:
- Třída Uri je obecným zapouždřením jakéhokoliv URL (tedy zatím jen
URL), tudíž se chová vcelku korektně, když při generování řetězce bere
v potaz i jméno a heslo. Píšu „vcelku“, protože žádná HTTP
specifikace syntax
http://user:pass@host
nepřipouští. Náš problém by vyřešilo vynechání user:pass při generování řetězce pro schémata http a https. - Třída HttpRequest vrací požadované URL jako objekt Uri (resp. UriScript), protože se tím zjednodušuje manipulace s URL a také samotné API třídy HttpRequest. Faktem je, že originální URL zadané do prohlížeče není na straně serveru k dispozici, proto se skládá: schéma se detekuje podle portu, host je uložen v hlavičce Host (HTTP 1.1) nebo se použije jméno serveru (HTTP 1.0), user:pass se dekódují z hlavičky Authorization, fragment prohlížeč neposílá vůbec. Objekt Uri je tedy spíš jen úložiště dat (Value Object?). Náš problém by vyřešilo user:pass do objektu vůbec nezapisovat.
- Problém vznikne při použití onoho úložiště $httpRequest->uri pro
generování HTML výstupu. Vyřešilo by jej očištění objektu od
nechtěného, tedy nastavit:
$uri = $httpRequest->uri; $uri->user = $uri->pass = '';
a teprve tento klon poslat do šablony.
Které řešení zvolit? Čislo 2) by šlo proti intuitivnosti, možnosti 1) a 3) mi připadají podobně logické, otázkou pak zůstává, jestli může vzniknout situace, kdy by bylo vhodné, aby Uri generovalo URL s user:pass. Myslím, že snad ani ne, takže použiju řešení 1).