Portal > Foren > Ankündigungen, News und Feedback > Tutorials > [PHP] dynamischer Verzeichnisschutz mit .htaccess
Antwort
 
Themen-Optionen
Alt 21.03.2006, 15:27 Nach oben    #1
Jann Hendrik Bekaan
 
Benutzerbild von Jann Hendrik
 
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.213
Standard [PHP] dynamischer Verzeichnisschutz mit .htaccess

In diesem Tutorial wird euch die Möglichkeit geboten zu erfahren, wie ihr ein Verzeichnisschutz, welches mittels .htacces realisiert werden soll, dynamisch gestalten könnt.

Wer prinzipiell wissen möchte, wie man mit .htaccess Verzeichnisse schützen kann, der lese die notwendigen Grundlagen bitte hier nach.



Dabei stelle ich mir folgendes Scenario vor:
Wir haben eine Datenbankmit einigen usern.
Ein Verzeichnis soll nur den usern zugänglich sein, die auch in der Datenbank registriert sind. Dabei gehe ich auf die Verwaltung der Datenbank nicht ein, da ich annehme, dass diese Daten von woanders herkommen (Forum, ...)

Für dieses Beipiel verwende ich eine Tabelle, die folgende Daten hat:
  • ID
  • Name
  • Passwort (für den Verzeichnisschutz)
Wenn ihr bereits eine user-Liste habt, dann braucht ihr nun lediglich die Passwort-Spalte anzulegen.


Ich gehe nun also von dieser Tabellenstruktur aus:
sql Code:
  1. CREATE TABLE `htpwd` (
  2.   `ident` int(11) NOT NULL AUTO_INCREMENT,
  3.   `name` varchar(15) NOT NULL DEFAULT '',
  4.   `passwort` varchar(15) NOT NULL DEFAULT '',
  5.   `expiretime` date NOT NULL DEFAULT '0000-00-00',
  6.   PRIMARY KEY  (`ident`)
  7. ) AUTO_INCREMENT=1 ;
Wofür ich die Datums-Spalte verwenden werde, erkläre ich später, hier sei sie lediglich der Vollständigkeit halber aufgeführt.

Da man Passwörter nie im Klartext speichern sollte werde auch ich hier das Passwort verschlüsselt abspeichern. Hierin liegt der Trick dieses Tutorials!

Da sich alle Daten in der Datenbank befinden müßen diese lediglich ausgelesen werden:
PHP-Code:
<?php
  $sql 
"SELECT
              `name`, `passwort`
          FROM
              `htpwd`"
;
?>
das ganze dann in die eigentlichen Daten zerstückeln:
PHP-Code:
<?php
  $file_content 
= array();
  
$result mysql_query($sql) or exit('<h2>Fehler</h2>sql:'.$sql.'<br />error: '.mysql_error());

  while (
$row mysql_fetch_assoc($result))
    
$file_content[] = $row['name'].':'.$row['passwort'];

?>
Ich verwende hier bewusst ein array. Dieses erweitert sich selbst und wird anschließend zusammengesetzt:
PHP-Code:
<?php
  $file_content 
implode("\n"$file_content);
?>
nun muss der zusammengesetzte Inhalt nur noch in die Datei geschrieben werden.
PHP-Code:
<?php
  schreibeInDatei
('.htpwd'$file_content);
?>
Dazu nutze ich die Funktion, welche hier gepostet wurde:
PHP-Code:
<?php
  
function schreibeInDatei($datei$inhalt)
  {
    if(!
file_exists($datei))
    {
      
printf'Die Datei %s konnte nicht gefunden werden.
               <br />
               Bitte Pfadangaben überprüfen.'
,
               
$datei );
      return 
false;
    }


    if(!
is_writable($datei))
    {
      
printf'Die Datei %s kann nicht beschrieben werden'$datei);
      return 
false;
    }

    if(!
$handle fopen$datei"w"))
    {
      
printf'Die Datei %s kann nicht geöffnet werden'$datei);
      return 
false;
    }

    if (!
fwrite($handle$inhalt))
    {
      
printf'Es trat ein Fehler beim Schreiben des Inhalts in die Datei %s auf.'$datei);
      return 
false;
    }

    
fclose($handle);
  }
?>
Damit die Datei beschrieben werden kann muss sie natürlich mit chmod über ausreichend Rechte verfügen!


Zusammen sieht das nun so aus:
PHP-Code:
<?php
  error_reporting
(E_ALL);

  
// Verbindungsdaten zur Datenbank:
  
$db_host   'localhost';
  
$db_login  'xyz';
  
$db_passwd 'xyz';
  
$db_name   'xyz';

  
// Funktion um Datei zu beschreiben:
  
function schreibeInDatei($datei$inhalt)
  {
    if(!
file_exists($datei))
    {
      
printf'Die Datei %s konnte nicht gefunden werden.
               <br />
               Bitte Pfadangaben überprüfen.'
,
               
$datei );
      return 
false;
    }


    if(!
is_writable($datei))
    {
      
printf'Die Datei %s kann nicht beschrieben werden'$datei);
      return 
false;
    }

    if(!
$handle fopen$datei"w"))
    {
      
printf'Die Datei %s kann nicht geöffnet werden'$datei);
      return 
false;
    }

    if ( !
fwrite($handle$inhalt))
    {
      
printf'Es trat ein Fehler beim Schreiben des Inhalts in die Datei %s auf.'$datei);
      return 
false;
    }

    
fclose($handle);
  }

  
// Datenbankverbindung herstellen:
  
mysql_connect($db_host$db_login$db_passwd) or exit('<h2>Fehler</h2>Problem mit der Kommunikation der Datenbank');
  
mysql_select_db($db_name) or exit('<h2>Fehler</h2>Problem mit der Kommunikation der Datenbank');

  
$sql "SELECT
              `name`, `passwort`
          FROM
              `htpwd`"
;

  
$file_content = array();
  
$result mysql_query($sql) or exit('<h2>Fehler</h2>sql:'.$sql.'<br />error: '.mysql_error());

  while (
$row mysql_fetch_assoc($result))
    
$file_content[] = $row['name'].':'.$row['passwort'];

  
schreibeInDatei('.htpwd'$file_content);
?>
Nun kann man (daher die oben bereits erwähnte Spalte) dem user eine Art Verfallsdatum geben.
In der Tabelle gibt man ein Datum mit an, bis wann er Zugriff haben darf.
Dies kann man zB. dann nutzen, wenn er nur für die Dienstleistung für eine gewisse Zeit bezahlt hat...

Einfach das sql-statement austauschen:
PHP-Code:
  $sql "SELECT
              `name`, `passwort`, `expiretime`
          FROM
              `htaccess`
          WHERE
              `expiretime` >= '"
.date('Y-m-d')."'"
Nun wird der user nur noch hinzugefügt, wenn er noch berechtigt ist. Wobei man hier sicherlich auch noch andere Formen der Beschränkung finden kann!



Das, was ich aber bisher verschwiegen habe - wie erstellt man das verschlüsselte Passwort?

Beim Eintragen in die Tabelle muss das Passwort verschlüsselt werden, sofern es sich um ein Linux-Server handelt. Bei Windows-Servern fällt dieser Schritt insofern weg, als dass das Passwort auch unverschlüsselt eingetragen, also auch unverschlüsselt gespeichert werden muss.

Dazu beim INSERT anstelle des Passwortes das verschlüsselte eingeben:

PHP-Code:
<?php
$sql 
"INSERT INTO
            `htaccess`
            (`name`, `passwort`, `expiretime`)
        VALUES
            ('"
.$name."', '".crypt($passwort'rl')."', '".$verfallsdatum."')";
?
Diese Verschlüsselungsmethode nutzt einen salt. Mehr dazu auf crypt().
Dieser ist nicht unbedingt verfügbar.

Das kann man aber einfach testen:
PHP-Code:
<?php
  
if (CRYPT_STD_DES == 1)
    echo 
'Tutorial sollte funktionieren';
  else
    exit(
'automatisches Erstellen nicht möglich')
?>

Nun kann die Datei, welche die .htpwd erstellt per cronjob aufgerufen werden, damit täglich eine neue .htpwd erstellt wird.
Damit ist es möglich usern nur für eine gewisse Zeit Zugang zu gewähren.


Solltet Ihr Fragen zu dem Tutorial haben, so schreibt bitte einen Beitrag im Forum mit einem Verweis auf dieses Tutorial.
Danke.

Ich hoffe, dass ich Euch hier etwas weiterhelfen konnte.
Bei Verbesserungsvorschlägen würde ich mich über eine Nachricht freuen.

Grüße Jann Hendrik

Geändert von Jann Hendrik (26.05.2007 um 12:39 Uhr).
Jann Hendrik ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Apache-Zugriffskontrolle auf eine Datei per .htaccess: 500er Artemis Tools, Server, Betriebssysteme 4 23.03.2007 21:29
.htaccess wird nicht erkannt florian Tools, Server, Betriebssysteme 9 15.05.2006 18:28
[PHP] 404-Fehlerseiten als Chance PaterNoster Tutorials 0 23.04.2006 15:04
RMI und .htaccess njeri Allgemeine Java-Programmierung 7 18.01.2006 09:48
mod_rewrite - .htaccess - RewriteRules werden nicht richtig umgesetzt!?? Ben Tools, Server, Betriebssysteme 4 05.01.2006 17:42


Alle Zeitangaben in WEZ +2. Es ist jetzt 05:29 Uhr.


Powered by vBulletin® Version 3.7.3 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44