Wer prinzipiell wissen möchte, wie man mit .htaccess Verzeichnisse schützen kann, der lese die notwendigen Grundlagen bitte
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)
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
$sql = "SELECT
`name`, `passwort`
FROM
`htpwd`";
?> <?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'];
?> <?php
$file_content = implode("\n", $file_content);
?> <?php
schreibeInDatei('.htpwd', $file_content);
?> <?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);
}
?> Zusammen sieht das nun so aus:
<?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);
?> 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:
$sql = "SELECT
`name`, `passwort`, `expiretime`
FROM
`htaccess`
WHERE
`expiretime` >= '".date('Y-m-d')."'";
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
$sql = "INSERT INTO
`htaccess`
(`name`, `passwort`, `expiretime`)
VALUES
('".$name."', '".crypt($passwort, 'rl')."', '".$verfallsdatum."')";
? Dieser ist nicht unbedingt verfügbar.
Das kann man aber einfach testen:
<?php
if (CRYPT_STD_DES == 1)
echo 'Tutorial sollte funktionieren';
else
exit('automatisches Erstellen nicht möglich')
?> 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

Bereiche
Kategorien (Alle Bereiche)
Neue Artikel
Neue Blog-Einträge
Neue Beiträge
STDIN-Daten auslesen, falls vorhanden
Moin moin!
Server-Administratoren arbeiten ja zumeist auf der Console und nutzen kleine oder große Shell-Scripte, um ihre Arbeitsabläufe zu vereinfachen oder Funktionen bereit zu stellen, für die es noch keine Komplett-Lösung gibt. Hierbei sind die Möglichkeiten nahezu grenzenlos.