HTTP-autentisering med PHP

Från Wiki.linux.se
Version från den 3 september 2024 kl. 07.21 av Admin (diskussion | bidrag) (→‎Sidslut)
(skillnad) ← Äldre version | Nuvarande version (skillnad) | Nyare version → (skillnad)
Hoppa till navigering Hoppa till sök

HTTP-autentisering med PHP

Det är möjligt att använda funktionen header() för att skicka ett meddelande om att "Autentisering krävs" till klientens webbläsare, vilket gör att en inmatningsruta för användarnamn och lösenord visas. När användaren har fyllt i ett användarnamn och ett lösenord, kommer URL:en som innehåller PHP-skriptet att anropas igen med de fördefinierade variablerna PHP_AUTH_USER, PHP_AUTH_PW och AUTH_TYPE inställda på användarnamnet, lösenordet och autentiseringstypen. Dessa fördefinierade variabler finns i arrayen $_SERVER. Endast "Basic" autentiseringsmetod stöds. Se funktionen header() för mer information.

Ett exempel på ett skript som skulle tvinga klientautentisering på en sida ser ut så här:

Exempel #1 Grundläggande HTTP-autentiseringsexempel

<?php
if (!isset($_SERVER['PHP_AUTH_USER'])) {
    header('WWW-Authenticate: Basic realm="My Realm"');
    header('HTTP/1.0 401 Unauthorized');
    echo 'Text att visa om användaren trycker på Avbryt-knappen';
    exit;
} else {
    echo "<p>Hej {$_SERVER['PHP_AUTH_USER']}.</p>";
    echo "<p>Du angav {$_SERVER['PHP_AUTH_PW']} som ditt lösenord.</p>";
}
?>

Notering: Kompatibilitetsnotering Var noga med att skriva HTTP-headerlinjerna korrekt. För att garantera maximal kompatibilitet med alla klienter bör nyckelordet "Basic" skrivas med en stor bokstav "B", realm-strängen måste omges av dubbla (inte enkla) citattecken, och exakt ett mellanslag ska föregå 401-koden i HTTP/1.0 401-headerlinjen. Autentiseringsparametrar måste separeras med kommatecken som visas i exemplet med digest ovan.

Istället för att bara skriva ut PHP_AUTH_USER och PHP_AUTH_PW, som gjorts i exemplet ovan, kanske du vill kontrollera användarnamn och lösenord för giltighet. Detta kan göras genom att skicka en fråga till en databas eller genom att söka efter användaren i en dbm-fil.

Se upp för felaktiga Internet Explorer-webbläsare. De verkar vara mycket känsliga för ordningen på headers. Att skicka WWW-Authenticate-headern före HTTP/1.0 401-headern verkar fungera för tillfället.

Notering: Konfigurationsnotering PHP använder närvaron av en AuthType-direktiv för att avgöra om extern autentisering är aktiverad.

Observera dock att ovanstående inte förhindrar någon som kontrollerar en icke-autentiserad URL från att stjäla lösenord från autentiserade URL:er på samma server.

Både Netscape Navigator och Internet Explorer rensar autentiseringscachen för den lokala webbläsaren för realmet efter att ha mottagit ett serverrespons på 401. Detta kan effektivt "logga ut" en användare och tvinga dem att ange sitt användarnamn och lösenord igen. Vissa använder detta för att "tidsbegränsa" inloggningar eller tillhandahålla en "logga ut"-knapp.

Exempel #2 HTTP-autentisering som tvingar ett nytt namn/lösenord

<?php
function authenticate() {
    header('WWW-Authenticate: Basic realm="Test Authentication System"');
    header('HTTP/1.0 401 Unauthorized');
    echo "Du måste ange ett giltigt inloggnings-ID och lösenord för att få tillgång till denna resurs\n";
    exit;
}

if (!isset($_SERVER['PHP_AUTH_USER']) ||
    ($_POST['SeenBefore'] == 1 && $_POST['OldAuth'] == $_SERVER['PHP_AUTH_USER'])) {
    authenticate();
} else {
    echo "<p>Välkommen: " . htmlspecialchars($_SERVER['PHP_AUTH_USER']) . "<br />";
    echo "Gammalt: " . htmlspecialchars($_REQUEST['OldAuth']);
    echo "<form action='' method='post'>\n";
    echo "<input type='hidden' name='SeenBefore' value='1' />\n";
    echo "<input type='hidden' name='OldAuth' value=\"" . htmlspecialchars($_SERVER['PHP_AUTH_USER']) . "\" />\n";
    echo "<input type='submit' value='Återautentisera' />\n";
    echo "</form></p>\n";
}
?>

Detta beteende krävs inte enligt HTTP Basic autentiseringsstandarden, så du bör aldrig lita på detta. Testning med Lynx har visat att Lynx inte rensar autentiseringsuppgifterna med ett 401-serverrespons, så att trycka på bakåt och sedan framåt igen kommer att öppna resursen så länge som autentiseringskraven inte har ändrats. Användaren kan trycka på '_' för att rensa sina autentiseringsuppgifter.

För att få HTTP-autentisering att fungera med IIS-servern med CGI-versionen av PHP måste du redigera din IIS-konfiguration "Directory Security". Klicka på "Edit" och markera endast "Anonymous Access", alla andra fält ska vara avmarkerade.

Notering: IIS Notering För att HTTP-autentisering ska fungera med IIS måste PHP-direktivet cgi.rfc2616_headers vara inställt på 0 (standardvärdet).

Sidslut

Orginalhemsidan på Engelska :https://www.php.net/manual/en/security.cgi-bin.default.php

PHP

Funktioner


Det här är en maskinöversättning av PHP-manualen till svenska. Om du hittar fel är vi tacksamma om du rapporterar dem via formuläret som finns på https://www.linux.se/kontaka-linux-se/

Tack till Datorhjälp.se som har sponsrat Linux.se med webserver.