HTTP Basic auth

(publikováno 21.06.2016) PHP, Bezpečnost, Tipy & triky

Pomocí HTTP Basic Auth můžete jednoduše zamezit přístupu na stránku, bez zbytečných komplikací s frameworky a cookies.

HTTP Basic auth

Pokud nepotřebujete registraci, zapomenuté hesla a další funkce, opravdu stačí jen zabezpečit přístupu proti náhodným a nežádoucím přístupům, můžete vytvořit velmi jednoduše toto chování pomocí HTTP Basic Auth.

Řešení pomocí souboru .htaccess je v novém článku

Jméno a heslo se předává v každém requestu, a při navštívení stránky vám prohlížeč zobrazí okno, pro zadání údajů. Ty si poté zapamatuje a automaticky je při prohlížení webu vždy posílá. Tuto techniku samozřejmě můžete využít s jakýmkoli jazykem, my si ale ukážeme řešení v PHP.

Následující kód jednoduše vložte do index.php nebo souboru, který chcete zabezpečit, a to úplně nahoru.

if (empty($_SERVER['PHP_AUTH_USER']) ||
     $_SERVER['PHP_AUTH_USER'] != "login" ||
     $_SERVER['PHP_AUTH_PW'] != "pass") {
    header('WWW-Authenticate: Basic realm="My Realm"');
    header('HTTP/1.0 401 Unauthorized');
    echo 'Zde nemáte přístup bez jména a hesla';
    exit;
}

Vyplnění jména a hesla

Možnosti jak vyplnit jméno a heslo jsou hned tři, první je závislá na prohlížeči, další 2 doplňují údaje do URL nebo hlavičky requestu.

Možnost 1: Při navštívení prohlížeč zobrazí při přístupu na stránku dialogové okno, případně text Zde nemáte přístup... pokud uživatel klikne na Storno.

HTTP Basic auth formulář

Možnost 2: Jména a heslo lze doplnit přímo do URL ve formátu:

http://jmeno:heslo@domain.com/

Možnost 3: Doplnění přímo do hlaviček požadavku. Toto řešení již je závislé na použité technologii. Viz článek o wget, který na to má přímo parametry.

Wedos a FastCGI

Pokud chcete využít HTTP autentizace a používáte hosting Wedos nebo FastCGI, tyto hlavičky v PHP nepřečtete. Řešení je ale jednoduché, stačí vložit do souboru .htaccess:

RewriteEngine on
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L] 

a před první použití proměnných také tento PHP kód:

list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW'])
  = explode(':' , base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6)), 2);

Chování a bezpečnost

Protože jméno i heslo se posílá v hlavičce s každým requestem, odposlechnout tyto údaje je ještě jednodušší. Navíc nejsou nijak šifrovány, pouze zakódovány pomocí Base64. Tomu se dá zamezit použitím certifikátu a HTTPS protokolu.

Druhé omezení spočívá v nemožnosti vložit do jména znak :, protože ten slouží jako oddělovat mezi jménem a heslem. Přesto pro jednoduché zamezení přístupu může tato metoda dostačovat.


Úvodní fotka převzata z Freepik

K tomuto článku již není možné přidávat další komentáře