<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/features.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'de',
  ),
  'this' => 
  array (
    0 => 'features.http-auth.php',
    1 => 'HTTP-Authentifizierung mit PHP',
    2 => 'HTTP-Authentifizierung mit PHP',
  ),
  'up' => 
  array (
    0 => 'features.php',
    1 => 'Features',
  ),
  'prev' => 
  array (
    0 => 'features.php',
    1 => 'Features',
  ),
  'next' => 
  array (
    0 => 'features.cookies.php',
    1 => 'Cookies',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'de',
    'path' => 'features/http-auth.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="features.http-auth" class="chapter">
  <h1 class="title">HTTP-Authentifizierung mit PHP</h1>


  <p class="simpara">
   Man kann die Funktion <span class="function"><a href="function.header.php" class="function">header()</a></span> verwenden, um die
   Nachricht <code class="literal">&quot;Authentifizierung erforderlich&quot;</code> an den
   Client-Browser zu senden, damit dieser ein Fenster zur Eingabe von
   Benutzername/Passwort öffnet. Hat der Benutzer diese eingegeben, wird die
   URL des PHP-Skripts mit den
   <a href="reserved.variables.php" class="link">vordefinierten Variablen</a>
   <var class="varname">PHP_AUTH_USER</var>, <var class="varname">PHP_AUTH_PW</var> und
   <var class="varname">AUTH_TYPE</var>, die den Benutzernamen, das Passwort und den
   Typ der Authentifizierung enthalten, erneut aufgerufen. Diese
   vordefinierten Variablen befinden sich im Array
   <var class="varname"><a href="reserved.variables.server.php" class="classname">$_SERVER</a></var>. Es wird <em>nur</em> die
   Authentifizierungsmethode &quot;Basic&quot; unterstützt. Näheres hierzu bei der
   Funktion <span class="function"><a href="function.header.php" class="function">header()</a></span>.
  </p>

  <p class="para">
   Ein Auszug aus einem Skript, das die Clientauthentifizierung auf einer
   Seite erzwingt, würde so aussehen:
  </p>
  <p class="para">
   <div class="example" id="example-1">
    <p><strong>Beispiel #1 Beispiel: Basic-HTTP-Authentifizierung</strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">if (!isset(</span><span style="color: #0000BB">$_SERVER</span><span style="color: #007700">[</span><span style="color: #DD0000">'PHP_AUTH_USER'</span><span style="color: #007700">])) {<br />    </span><span style="color: #0000BB">header</span><span style="color: #007700">(</span><span style="color: #DD0000">'WWW-Authenticate: Basic realm="My Realm"'</span><span style="color: #007700">);<br />    </span><span style="color: #0000BB">header</span><span style="color: #007700">(</span><span style="color: #DD0000">'HTTP/1.0 401 Unauthorized'</span><span style="color: #007700">);<br />    echo </span><span style="color: #DD0000">'Text, der gesendet wird, falls der Benutzer auf Abbrechen drückt'</span><span style="color: #007700">;<br />    exit;<br />} else {<br />    echo </span><span style="color: #DD0000">"&lt;p&gt;Hallo </span><span style="color: #007700">{</span><span style="color: #0000BB">$_SERVER</span><span style="color: #007700">[</span><span style="color: #DD0000">'PHP_AUTH_USER'</span><span style="color: #007700">]}</span><span style="color: #DD0000">.&lt;/p&gt;"</span><span style="color: #007700">;<br />    echo </span><span style="color: #DD0000">"&lt;p&gt;Sie gaben </span><span style="color: #007700">{</span><span style="color: #0000BB">$_SERVER</span><span style="color: #007700">[</span><span style="color: #DD0000">'PHP_AUTH_PW'</span><span style="color: #007700">]}</span><span style="color: #DD0000"> als Passwort ein.&lt;/p&gt;"</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
  </p>

  <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
   <strong>Hinweis zur Kompatibilität</strong><br />
   <p class="para">
    Achten Sie für die maximale Kompatibilität mit allen Clients bei den
    Header-Zeilen auf die richtige Schreibweise! Das Schlüsselwort &quot;Basic&quot;
    sollte genau so geschrieben werden, der Realm-String muss in doppelte
    (nicht einfache) Anführungszeichen gesetzt werden und in der
    <em>HTTP/1.0 401</em>-Zeile darf nur genau ein Leerzeichen vor
    dem <em>401</em>-Code stehen. Die Authentifizierungsparameter
    müssen durch Kommata getrennt werden.
   </p>
  </p></blockquote>

  <p class="para">
   Anstatt <var class="varname">PHP_AUTH_USER</var> und <var class="varname">PHP_AUTH_PW</var>
   wie im Beispiel oben einfach nur auszugeben, werden Sie den Benutzernamen
   und das Passwort auf Gültigkeit überprüfen wollen. Dies kann durch das
   Abfragen einer Datenbank oder die Suche des Benutzers in einer Textdatei
   geschehen.
  </p>

  <p class="para">
   Vorsicht bei einigen Internet Explorer-Versionen - sie scheinen sehr
   wählerisch zu sein, was die Reihenfolge der Header angeht. Abhilfe schafft
   hier das Senden des <em>WWW-Authenticate</em>-Headers vor dem
   <code class="literal">HTTP/1.0 401</code>-Header.
  </p>

  <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
   <strong>Konfigurationshinweis</strong><br />
   <p class="para">
    PHP prüft das Vorhandensein einer <code class="literal">AuthType</code>
    Apache-Direktive, um zu entscheiden, ob eine externe Authentifizierung
    aktiv ist.
   </p>
  </p></blockquote>

  <p class="simpara">
   Zu beachten ist, dass Obenstehendes keinesfalls jemanden, der auf demselben
   Server die Kontrolle über eine nicht authentifizierte URL hat, davon
   abhalten kann, Passwörter von authentifizierten URLs auszulesen.
  </p>
  <p class="simpara">
   Sowohl Netscape als auch der Internet Explorer löschen den lokalen
   Authentifizierungscache des Browserfensters, wenn der Server eine
   401-Meldung zurückgibt. Dies kann verwendet werden, um einen Benutzer
   &quot;auszuloggen&quot; und eine erneute Eingabe des Benutzernamens/Passworts zu
   erzwingen. Manchmal wird dieses Verhalten für das automatische Ausloggen
   nach Ablauf einer bestimmten Zeitspanne oder für einen Logout-Button
   genutzt.
  </p>
  <p class="para">
   <div class="example" id="example-2">
    <p><strong>Beispiel #2 HTTP-Authentifizierung, mit erneuter Anforderung von Name/Passwort</strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">authentifizieren</span><span style="color: #007700">() {<br />    </span><span style="color: #0000BB">header</span><span style="color: #007700">(</span><span style="color: #DD0000">'WWW-Authenticate: Basic realm="Test Authentication System"'</span><span style="color: #007700">);<br />    </span><span style="color: #0000BB">header</span><span style="color: #007700">(</span><span style="color: #DD0000">'HTTP/1.0 401 Unauthorized'</span><span style="color: #007700">);<br />    echo </span><span style="color: #DD0000">"Bitte geben Sie eine gültige Login-ID und das Passwort für den<br />        Zugang ein\n"</span><span style="color: #007700">;<br />    exit;<br />}<br /><br />if (!isset(</span><span style="color: #0000BB">$_SERVER</span><span style="color: #007700">[</span><span style="color: #DD0000">'PHP_AUTH_USER'</span><span style="color: #007700">]) ||<br />    (</span><span style="color: #0000BB">$_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">'Gesehen'</span><span style="color: #007700">] == </span><span style="color: #0000BB">1 </span><span style="color: #007700">&amp;&amp; </span><span style="color: #0000BB">$_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">'AlteAuth'</span><span style="color: #007700">] == </span><span style="color: #0000BB">$_SERVER</span><span style="color: #007700">[</span><span style="color: #DD0000">'PHP_AUTH_USER'</span><span style="color: #007700">])) {<br />    </span><span style="color: #0000BB">authentifizieren</span><span style="color: #007700">();<br />} else {<br />    echo </span><span style="color: #DD0000">"&lt;p&gt;Willkommen: " </span><span style="color: #007700">. </span><span style="color: #0000BB">htmlspecialchars</span><span style="color: #007700">(</span><span style="color: #0000BB">$_SERVER</span><span style="color: #007700">[</span><span style="color: #DD0000">'PHP_AUTH_USER'</span><span style="color: #007700">]) . </span><span style="color: #DD0000">"&lt;br /&gt;"</span><span style="color: #007700">;<br />    echo </span><span style="color: #DD0000">"Alt: " </span><span style="color: #007700">. </span><span style="color: #0000BB">htmlspecialchars</span><span style="color: #007700">(</span><span style="color: #0000BB">$_REQUEST</span><span style="color: #007700">[</span><span style="color: #DD0000">'AlteAuth'</span><span style="color: #007700">]);<br />    echo </span><span style="color: #DD0000">"&lt;form action='' method='post'&gt;\n"</span><span style="color: #007700">;<br />    echo </span><span style="color: #DD0000">"&lt;input type='hidden' name='Gesehen' value='1' /&gt;\n"</span><span style="color: #007700">;<br />    echo </span><span style="color: #DD0000">"&lt;input type='hidden' name='AlteAuth' value=\"" </span><span style="color: #007700">. </span><span style="color: #0000BB">htmlspecialchars</span><span style="color: #007700">(</span><span style="color: #0000BB">$_SERVER</span><span style="color: #007700">[</span><span style="color: #DD0000">'PHP_AUTH_USER'</span><span style="color: #007700">]) . </span><span style="color: #DD0000">"\" /&gt;\n"</span><span style="color: #007700">;<br />    echo </span><span style="color: #DD0000">"&lt;input type='submit' value='Erneut Anmelden' /&gt;\n"</span><span style="color: #007700">;<br />    echo </span><span style="color: #DD0000">"&lt;/form&gt;&lt;/p&gt;\n"</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
  </p>
  <p class="simpara">
   Dieses Verhalten wird vom Authentifizierungsstandard <code class="literal">HTTP
   Basic</code> nicht gefordert, daher sollte man sich nie darauf
   verlassen. Tests mit <code class="literal">Lynx</code> haben gezeigt, dass
   <code class="literal">Lynx</code> die Authentifizierungsinformationen bei Erhalt
   einer 401-Meldung nicht löscht. Solange der benötigte Berechtigungsnachweis
   nicht geändert wird, kann der Benutzer auf die vorhergehende Seite zurück
   und danach vorwärts und die angeforderte Adresse wieder öffnen. Der
   Benutzer kann die Authentifizierungsinformationen aber durch Drücken von
   <code class="literal">&#039;_&#039;</code> löschen.
  </p>
  <p class="simpara">
   Damit die HTTP-Authentifizierung funktioniert, wenn der IIS mit der
   CGI-Version von PHP verwendet wird, müssen Sie die &quot;<code class="literal">Directory
   Security</code>&quot; Ihrer IIS-Konfiguration ändern. Klicken Sie auf
   &quot;<code class="literal">Edit</code>&quot; und aktivieren Sie nur &quot;<code class="literal">Anonymous
   Access</code>&quot;. Alle anderen Felder sollten deaktiviert bleiben.
  </p>
  <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
   <strong>IIS-Anmerkung:</strong><br />
   <span class="simpara">
    Damit die HTTP-Authentifizierung mit dem IIS funktioniert, muss die
    PHP-Konfigurationsanweisung
    <a href="ini.core.php#ini.cgi.rfc2616-headers" class="link">cgi.rfc2616_headers</a> auf
    <code class="literal">0</code> (die Voreinstellung) gesetzt sein.
   </span>
  </p></blockquote>

 </div>
<?php manual_footer($setup); ?>