Jméno a heslo v adresách

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
mkrause
Člen | 20
+
0
-

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
+
0
-

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
+
0
-

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
+
+1
-

Trošku ten problém rozeberu:

  1. 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.
  2. 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.
  3. 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).

mkrause
Člen | 20
+
0
-

To zní asi rozumně. Těším se na zapracování :)