Nette Http 3.2: změna přístupu ke credentials
Vyšla nová verze Nette Http 3.2, jejíž součástí je i zpětně nekompatibilní změna, ke které došlo z bezpečnostních důvodů. Týká se způsobu získání uživatelského jména a hesla při přihlašování pomocí HTTP Basic Authentication, což je nejstarší technika prováděná přímo prohlížečem.
Zatímco dříve údaje vracely metody třídy Nette\Http\Url,
nyní k tomu slouží nová metoda
Nette\Http\Request::getBasicCredentials():
// $request je objekt Nette\Http\Request
// dříve
$url = $request->getUrl();
$user = $url->getUser();
$password = $url->getPassword();
// od nette/http 3.2
[$user, $password] = $request->getBasicCredentials();
// $url->getUser() a $url->getPassword() nyní vrací ''
Důvod této změny je ryze bezpečnostní. Díky tomu, že jméno a heslo
už nejsou součástí objektu Url, zmizelo riziko, že by při
vypsání Url (tj. echo $url) došlo k jejich vyzrazení.
Přístup ke jménu a heslu skrze $request->getUrl() se
v Nette používá od počátku. Jednak třída Url už příslušné metody
měla, ale také v prohlížečích lze předávat uživatelské jméno a heslo
přímo v adrese jako http://username:password@example.com, tedy
se takové řešení nabízelo. Dnešní prohlížeče tuto funkcionalitu
různými způsoby omezují, protože se začala zneužívat k nekalým
účelům. Útočníci třeba lákali uživatele na adresu
https://YourBank.com@HackersSite.com/, která na první pohled
vypadá jako skutečná adresa banky YourBank.com, ale první
část URL ve skutečnosti představuje uživatelské jméno.
Ale zpátky k Nette. Riziku vyzrazení přihlašovacích údajů předcházela přímo třída Url, která je jednoduše nevypisovala:
// Nette 2.x (a také 0.x)
$url = new Nette\Http\Url('http://user:pass@example.org');
echo $url; // http://example.org
Časem se ale objevily žádosti o změnu tohoto chování, protože pro programátory bylo překvapivé. Počínaje Nette Http 3.0 se tak credentials vypisují:
// Nette 3.x
$url = new Nette\Http\Url('http://user:pass@example.org');
echo $url; // http://user:pass@example.org
Zároveň se v presenterech místo originálního
$request->getUrl() začalo pracovat s kopií bez credentials,
$request->getUrl()->withoutUserInfo(). Nicméně, a to je
důvod současné změny, programátoři si nemuseli být vědomi, že vypsaní
originálního $request->getUrl() nese riziko vyzrazení
přihlašovacích údajů. Od Nette Http 3.2 se proto credentials do objektu
Url nepředávají vůbec. Tedy vypsaní $request->getUrl() je
zcela bezpečné.
Místo toho se přenáší v hlavičce Authorization, jejíž
obsah umí dekódovat nová metoda
$request->getBasicCredentials():
// Nette Http 3.2
$request->getHeader('Authorization'); // 'Basic dXNlcjpwYXNzd29yZA=='
$request->getBasicCredentials(); // ['user', 'password']
Pokud prohlížeč přihlašovací údaje neposílá nebo se používá jiná
autentizační metoda (např. Digest Access Authentication), vrací
getBasicCredentials() null.
Chcete-li odeslat komentář, přihlaste se