• 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:
    [highlight=sql]CREATE TABLE `htpwd` (
    `ident` int(11) NOT NULL auto_increment,
    `name` varchar(15) NOT NULL default '',
    `passwort` varchar(15) NOT NULL default '',
    `expiretime` date NOT NULL default '0000-00-00',
    PRIMARY KEY (`ident`)
    ) AUTO_INCREMENT=1 ;[/highlight]
    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
  • Neue Blog-Einträge

    Adventure-PHP-Framework 1.12 erschienen

    Ich bin bisher nicht dazu gekommen - und wollte eigentlich die beiden links nennen: :arrow: http://www.golem.de/1008/77097.html :arrow:...

    20.08.2010 16:09

    Britische Regierung hält am IE6 fest

    Man könnte auch sagen "Tot erhoffte leben länger" :arrow: http://www.golem.de/1008/77035.html Leider sind halt in vielen Unternehmen speziell an den IE angepasste Programme im Einsatz, die es...

    20.08.2010 16:12

    Hosting-Dienst GitHub erreicht Millionen-Marke

    Während ich persönlich noch immer gerne SVN einsetze, ist git gerade voll im Trend. GitHub hatte die Tage zu vermelden, dass es mehr als eine Million Softwareprojekte "unter seinem Dach" hat....

    20.08.2010 16:15

    Screenshot unter Windows vom aktiven Fenster erstellen

    Der Trend, nicht nur einen Bildschirm bei der Arbeit am PC zu verwenden ist imho vorhanden. Wer - wie ich - gerne zwischendurch einen screenshot macht, der dürfte sich ggf. manches Mal geärgert...

    20.08.2010 16:20

    ListView-Spalten Automatisch ausrichten

    Listviews begegnen uns eigentlich jeden Tag aufs neue bei der täglichen Arbeit. Genauso oft nervt es, wenn man z.b. im Explorer Spalten verschieben muss, um einen Dateinamen einer Datei vollständig...

    24.08.2010 13:10
  • Neue Beiträge

    Sekundentakt

    Hi,

    ich weiß nicht genau, wie Deine Subselects aussehen. Aber falls die sich so ähnlich formulieren lassen:

    Code:
    SELECT something
    

    CONCAT_WS mit LEFT JOIN

    Sekundentakt 01.09.2010 15:30 Gehe zum letzten Beitrag
    DasMööp

    *ohje ... Antwort: Subselect *rolleye, damit fällt dann der JOIN weg.

    CONCAT_WS mit LEFT JOIN

    DasMööp 31.08.2010 13:29 Gehe zum letzten Beitrag
    DasMööp

    Hallo,

    bei einer Abfrage von zwei Tabellen ist in einer in zwei Spalten je die ID der einen hinterlegt und diese brauche ich in der CONCAT.

    CONCAT_WS mit LEFT JOIN

    DasMööp 31.08.2010 12:17 Gehe zum letzten Beitrag
    floppy

    Hallo DEVWinC, Hallo Spezialisten,

    ich stehe zur Zeit auf dem gleichen Problem, bei mir gibts beim BartPE (XP) nur einen BlueScreen nach

    [Booten] ISO-Images mit Bootloader starten & BartPE

    floppy 31.08.2010 10:48 Gehe zum letzten Beitrag

Impressum · Tutorials · Nutzungsbedingungen · thematisch sortierte Linklisten · Spendenaufruf · Team · Partnerprojekte

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 45 46 47 48