Zeitlich begrenzter Zugang zu einem Download

Anwendungen für Webseiten. Künstliche Intelligenz verwenden.
Volker
Moderator
Moderator
Beiträge: 1431
Registriert: Sa 12. Dez 2020, 22:35

Re: Zeitlich begrenzter Zugang zu einem Download

Ungelesener Beitrag von Volker »

Ich hab mal Chat GPT gefragt :
wenn mein freund der bei ionos ist ein verzeichnis download-limited erstellt und dort die scripte rein packt macht das script angeblich daraus download und nicht doenload-limited
ChatGPT:

Ah, ich verstehe, das ist ein klassisches Problem mit relativen Pfaden. 😅

Wenn du z. B. im Browser https://example.com/download-limited/admin.php aufrufst, der Code aber __DIR__."/download.php" verwendet, erzeugt PHP die Links relativ zum aktuellen Script, also /download.php statt /download-limited/download.php. Deshalb sieht es so aus, als ob es den Ordner „download“ statt „download-limited“ verwendet.

Lösung:

Verwende absolute Pfade für die Links:
In admin.php beim Link zum Download:

<a href="<?= $_SERVER['SCRIPT_NAME'] ?>/download.php?token=<?= $tk ?>" target="_blank">


oder noch besser:

<a href="<?= dirname($_SERVER['SCRIPT_NAME']) ?>/download.php?token=<?= $tk ?>" target="_blank">


dirname($_SERVER['SCRIPT_NAME']) sorgt dafür, dass immer der aktuelle Ordner (z. B. download-limited) benutzt wird.

Alle anderen internen Links anpassen:
Jede Stelle, die bisher nur download.php?token=... hatte, muss so angepasst werden:

<a href="<?= dirname($_SERVER['SCRIPT_NAME']) ?>/download.php?token=<?= $tk ?>">


Damit ist egal, ob das Script in /www/download-limited oder direkt /www liegt – es greift immer korrekt auf den Unterordner zu.

Serverseitige Pfade ($protectedDir, $storageFile) bleiben gleich, die betreffen nur PHP-Dateisystemzugriffe, nicht die URLs.
Gruß Volker
Benutzeravatar
Tommy Herrmann
Site Admin
Site Admin
Beiträge: 7752
Registriert: So 6. Dez 2020, 07:37
Wohnort: Berlin
Kontaktdaten:

Re: Zeitlich begrenzter Zugang zu einem Download

Ungelesener Beitrag von Tommy Herrmann »

> Klicke ich im Admin-Bereich unten auf den Button "Öffnen" wird das korrekte Verzeichnis angezeigt.

> Klicke ich auf den Button "Kopieren" (daneben) wird in beiden Fällen ein falscher Link erstellt.


Verzeichnis.jpg
Volker
Moderator
Moderator
Beiträge: 1431
Registriert: Sa 12. Dez 2020, 22:35

Re: Zeitlich begrenzter Zugang zu einem Download

Ungelesener Beitrag von Volker »

tausch mal die admin.php mit diesem code hier:

Code: Alles auswählen

<?php
$adminUser = "admin";
$adminPass = "geheim";
session_start();

// Login prüfen
if (!isset($_SESSION['admin'])) {
    if (isset($_POST['user'], $_POST['pass'])) {
        if ($_POST['user'] === $adminUser && $_POST['pass'] === $adminPass) {
            $_SESSION['admin'] = true;
            header("Location: admin.php");
            exit;
        } else {
            $error = "❌ Falsche Zugangsdaten";
        }
    }
    ?>
    <!DOCTYPE html>
    <html lang="de">
    <head>
        <meta charset="UTF-8">
        <title>Admin Login</title>
        <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
    </head>
    <body class="bg-light d-flex align-items-center justify-content-center vh-100">
    <div class="card shadow p-4" style="max-width:400px;width:100%;">
        <h3 class="mb-3 text-center">🔑 Admin Login</h3>
        <?php if(isset($error)) echo "<div class='alert alert-danger'>$error</div>"; ?>
        <form method="post">
            <div class="mb-3"><label class="form-label">Benutzer</label><input type="text" name="user" class="form-control" required></div>
            <div class="mb-3"><label class="form-label">Passwort</label><input type="password" name="pass" class="form-control" required></div>
            <button type="submit" class="btn btn-primary w-100">Login</button>
        </form>
    </div></body></html>
    <?php exit;
}

// Pfade & Variablen
$storageFile = __DIR__."/tokens.json";
$protectedDir = __DIR__."/schutz";
$blacklist = ['.htaccess', '.gitignore'];
$tokens = file_exists($storageFile) ? json_decode(file_get_contents($storageFile), true) : [];
$message="";

// Token erstellen (nur bei POST und Create)
if($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['create'])){
    $files = $_POST['files'] ?? [];
    $hours = intval($_POST['hours']);
    $maxDownloads = intval($_POST['maxDownloads'] ?? 1);
    if(!empty($files) && $hours>0 && $maxDownloads>0){
        $token = bin2hex(random_bytes(16));
        $expires = time() + ($hours * 3600);
        $downloads = [];
        foreach($files as $f) $downloads[$f] = 0;
        $tokens[$token] = [
            "files" => $files,
            "expires" => $expires,
            "downloads" => $downloads,
            "maxDownloads" => $maxDownloads
        ];
        file_put_contents($storageFile, json_encode($tokens), LOCK_EX);
        // Nachricht vorbereiten, kein Redirect -> kein doppelter Token
        $message = "<div class='alert alert-success'>✅ Token erstellt!</div>";
    } else {
        $message = "<div class='alert alert-warning'>⚠️ Bitte mindestens eine Datei und gültige Zeit angeben!</div>";
    }
}

// Token löschen
if(isset($_GET['delete'])){
    unset($tokens[$_GET['delete']]);
    file_put_contents($storageFile,json_encode($tokens));
    $message="<div class='alert alert-info'>🗑️ Token gelöscht</div>";
}

// Funktion: Token-Link dynamisch
function tokenLink($tk){
    $dir = dirname($_SERVER['SCRIPT_NAME']); // aktueller Ordner
    return $dir . "/download.php?token=$tk";
}
?>
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<title>Token Verwaltung</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
<style>
/* Accordion Stil für Ordner */
.folder { cursor:pointer; }
.subfolder { margin-left:20px; display:none; }
</style>
</head>
<body class="bg-light">
<div class="container py-4">
<div class="d-flex justify-content-between align-items-center mb-4">
<h2>🔐 Token-Verwaltung</h2>
<a href="?logout=1" class="btn btn-outline-danger">🚪 Logout</a>
</div>

<?= $message ?>

<!-- Token erstellen -->
<div class="card shadow mb-4"><div class="card-body">
<h4 class="card-title">Neuen Token erstellen</h4>
<form method="post">
<div class="mb-3">
    <label class="form-label">Gültigkeit (Stunden)</label>
    <input type="number" name="hours" value="24" class="form-control" required>
</div>
<div class="mb-3">
    <label class="form-label">Max Downloads pro Datei</label>
    <input type="number" name="maxDownloads" value="5" class="form-control" required>
</div>
<div class="mb-3"><label class="form-label">Dateien auswählen</label><br>
<?php
// Ordner rekursiv anzeigen
function listFiles($dir, $prefix=""){
    global $blacklist;
    $items = array_diff(scandir($dir),['.','..']);
    foreach($items as $item){
        $full = "$dir/$item";
        $id = uniqid("f_");
        if(is_dir($full)){
            echo "<div class='folder' onclick=\"toggleFolder('$id')\">📁 ".htmlspecialchars($prefix.$item)."</div>";
            echo "<div class='subfolder' id='$id'>";
            listFiles($full, $prefix.$item."/"); // rekursiv
            echo "</div>";
        } else {
            if(in_array($item,$blacklist)) continue;
            echo "<div class='form-check'><input class='form-check-input' type='checkbox' name='files[]' value='".htmlspecialchars($prefix.$item)."' id='$id'>
            <label class='form-check-label' for='$id'>".htmlspecialchars($prefix.$item)."</label></div>";
        }
    }
}
listFiles($protectedDir);
?>
</div>
<button type="submit" name="create" class="btn btn-success">Token erstellen</button>
</form>
</div></div>

<!-- Bestehende Tokens -->
<div class="card shadow"><div class="card-body">
<h4 class="card-title">Bestehende Tokens</h4>
<?php if(empty($tokens)){ echo "<p class='text-muted'>Keine Tokens vorhanden.</p>"; } else { ?>
<div class="table-responsive"><table class="table table-striped table-bordered align-middle">
<thead class="table-light"><tr>
<th>Token</th><th>Dateien</th><th>Downloads</th><th>Ablauf</th><th>Link</th><th>Aktion</th>
</tr></thead>
<tbody>
<?php foreach($tokens as $tk=>$entry){ ?>
<tr>
<td><code><?= substr($tk,0,10) ?>...</code></td>
<td><?= implode(", ", $entry['files']) ?></td>
<td>
<?php 
$dl = [];
foreach($entry['files'] as $f){
    $count = $entry['downloads'][$f] ?? 0;
    $max = $entry['maxDownloads'] ?? 5;
    $dl[] = htmlspecialchars($f)." ($count/$max)";
}
echo implode("<br>", $dl);
?>
</td>
<td><?= date("d.m.Y H:i",$entry['expires']) ?></td>
<td>
<div class="d-flex gap-2">
<a href="<?= tokenLink($tk) ?>" target="_blank" class="btn btn-sm btn-primary">🔗 Öffnen</a>
<button class="btn btn-sm btn-secondary" onclick="copyLink('<?= $tk ?>')">📋 Kopieren</button>
</div>
</td>
<td><a href="?delete=<?= $tk ?>" class="btn btn-sm btn-danger" onclick="return confirm('Token wirklich löschen?');">❌ Löschen</a></td>
</tr>
<?php } ?>
</tbody></table></div><?php } ?>
</div></div>
</div>

<script>
function copyLink(token){
    const link = `${window.location.origin}${'<?= dirname($_SERVER['SCRIPT_NAME']) ?>'}/download.php?token=${token}`;
    navigator.clipboard.writeText(link).then(()=>{ alert('Link kopiert: '+link); }).catch(err=>{ alert('Fehler beim Kopieren: '+err); });
}
function toggleFolder(id){
    const el = document.getElementById(id);
    if(el.style.display==="none" || el.style.display==="") el.style.display="block";
    else el.style.display="none";
}
</script>

<?php
if(isset($_GET['logout'])){ session_destroy(); header("Location: admin.php"); exit; }
?>
</body></html>
Hat Chat GPT gerade für mich geändert
Gruß Volker
Benutzeravatar
Tommy Herrmann
Site Admin
Site Admin
Beiträge: 7752
Registriert: So 6. Dez 2020, 07:37
Wohnort: Berlin
Kontaktdaten:

Re: Zeitlich begrenzter Zugang zu einem Download

Ungelesener Beitrag von Tommy Herrmann »

geht :tu:

... - auch in dem alten Verzeichnis "save" geht es jetzt, das ich soeben aber gelöscht habe.

https://www.mobirise-tutorials.com/down ... 81590f7e87

Code: Alles auswählen

https://www.mobirise-tutorials.com/download-limited/download.php?token=bc9f5e08ba1d18fe5c391681590f7e87
Wie gut dass Du eine Tester hast :freude: :hurra: :freunde:
Benutzeravatar
Tommy Herrmann
Site Admin
Site Admin
Beiträge: 7752
Registriert: So 6. Dez 2020, 07:37
Wohnort: Berlin
Kontaktdaten:

Re: Zeitlich begrenzter Zugang zu einem Download

Ungelesener Beitrag von Tommy Herrmann »

Schreibe dann bitte auch noch eine verständliche readme.txt und gib Bescheid, wenn und wo das neue Download liegt.

Ich werde das morgen als Tutorial mit einbauen...
Volker
Moderator
Moderator
Beiträge: 1431
Registriert: Sa 12. Dez 2020, 22:35

Re: Zeitlich begrenzter Zugang zu einem Download

Ungelesener Beitrag von Volker »

Ich hab den Fehler gefunden :D

War mein Fehler :angst:

Hier das komplette ZIP: https://www.niederastroth.de/schutz.7z
Gruß Volker
Benutzeravatar
Tommy Herrmann
Site Admin
Site Admin
Beiträge: 7752
Registriert: So 6. Dez 2020, 07:37
Wohnort: Berlin
Kontaktdaten:

Re: Zeitlich begrenzter Zugang zu einem Download

Ungelesener Beitrag von Tommy Herrmann »

… noch ein neuer Fehler:

X Datei nicht freigegeben


https://www.mobirise-tutorials.com/down ... 6fecbf48da

Code: Alles auswählen

https://www.mobirise-tutorials.com/download-limited/download.php?token=d677a33f403ff49700ba056fecbf48da

Ich habe noch Unterordner angelegt:


Ordner vom Download.jpg
Volker
Moderator
Moderator
Beiträge: 1431
Registriert: Sa 12. Dez 2020, 22:35

Re: Zeitlich begrenzter Zugang zu einem Download

Ungelesener Beitrag von Volker »

Man darf der KI nicht blind vertrauen ;)
Die hat auch Fehler eingebaut und mir das Bootstrap geklaut :eek:

Ich habe es jetzt ausgiebig getetstet und für gut befunden : https://www.niederastroth.de/schutz.7z
Gruß Volker
Benutzeravatar
Tommy Herrmann
Site Admin
Site Admin
Beiträge: 7752
Registriert: So 6. Dez 2020, 07:37
Wohnort: Berlin
Kontaktdaten:

Re: Zeitlich begrenzter Zugang zu einem Download

Ungelesener Beitrag von Tommy Herrmann »

Ich gucke gleich nochmals …

Du musst der KI immer explizit mitteilen, dass sie das Skript überprüfen soll und Änderungen kommentieren muss. Sie soll nur Änderungen zu dem Fehler vornehmen und ansonsten keinerlei Änderungen am Skript vornehmen. Diese Anweisungen sind inzwischen Standard bei mir.
Benutzeravatar
Tommy Herrmann
Site Admin
Site Admin
Beiträge: 7752
Registriert: So 6. Dez 2020, 07:37
Wohnort: Berlin
Kontaktdaten:

Re: Zeitlich begrenzter Zugang zu einem Download

Ungelesener Beitrag von Tommy Herrmann »

Ich würde die Verzeichnisse "test1" und "test" aus dem Verzeichnis "schutz" noch für den Download entfernen. Kein Mensch wird diese so nennen.

Dann enthält Dein derzeitiges Download auch ein Token, der sollte nicht dabei sein.

Das schließende </html> Tag sitzt komisch neben dem </body> Tag in der Datei "admin.php".

Eine ausführliche und verständliche Datei "readme.txt" fehlt noch.


Der Fehler ist aber noch immer da. Die freigegebenen Dateien können nicht herunter geladen werden. Das kann doch nur an dem neuen Pfad liegen oder?!

https://www.mobirise-tutorials.com/down ... 3be9adca75

Code: Alles auswählen

https://www.mobirise-tutorials.com/download-limited/download.php?token=3cc47cb33e586989fff0aa3be9adca75

Ich muss leider für heute Schluss machen und gucke dann morgen früh wieder. Bis denne ...
Benutzeravatar
Tommy Herrmann
Site Admin
Site Admin
Beiträge: 7752
Registriert: So 6. Dez 2020, 07:37
Wohnort: Berlin
Kontaktdaten:

Re: Zeitlich begrenzter Zugang zu einem Download

Ungelesener Beitrag von Tommy Herrmann »

Als ZIP Archiv lassen sie sich downloaden - aber nicht einzeln.

Alles auch korrekt im ZIP in den richtigen Ordnern und Unterordnern :) :tu:

Da ist nur noch ein Fehler im Download der einzelnen Dateien.
Volker
Moderator
Moderator
Beiträge: 1431
Registriert: Sa 12. Dez 2020, 22:35

Re: Zeitlich begrenzter Zugang zu einem Download

Ungelesener Beitrag von Volker »

So, nun ist aber alles wieder OK.

Ich habe die Ordner ordner1 und ordner2 genannt, das werde ich dann in der readme.txt erklären was es damit ausf sich hat ;)

jetzt erstmal für dich zum testen Tommy: https://www.niederastroth.de/schutz.7z
Gruß Volker
Benutzeravatar
Tommy Herrmann
Site Admin
Site Admin
Beiträge: 7752
Registriert: So 6. Dez 2020, 07:37
Wohnort: Berlin
Kontaktdaten:

Re: Zeitlich begrenzter Zugang zu einem Download

Ungelesener Beitrag von Tommy Herrmann »

Funktioniert alles einwandfrei :tu:

https://www.mobirise-tutorials.com/down ... 01b4d04214

Code: Alles auswählen

https://www.mobirise-tutorials.com/download-limited/download.php?token=f64688908c79e93df4ad7801b4d04214
Einzeln und auch als ZIP mit allen Ordnern.


:winken:
Volker
Moderator
Moderator
Beiträge: 1431
Registriert: Sa 12. Dez 2020, 22:35

Re: Zeitlich begrenzter Zugang zu einem Download

Ungelesener Beitrag von Volker »

Na wenigstens einer der es auch brauchen kann ;)

Readme ist nun auch im zip
Gruß Volker
Benutzeravatar
Tommy Herrmann
Site Admin
Site Admin
Beiträge: 7752
Registriert: So 6. Dez 2020, 07:37
Wohnort: Berlin
Kontaktdaten:

Re: Zeitlich begrenzter Zugang zu einem Download

Ungelesener Beitrag von Tommy Herrmann »

Das werden viele brauchen können - ganz sicher :tu:
Volker
Moderator
Moderator
Beiträge: 1431
Registriert: Sa 12. Dez 2020, 22:35

Re: Zeitlich begrenzter Zugang zu einem Download

Ungelesener Beitrag von Volker »

Tommy,

mein Problem bei chat gpt ist, das ich da nicht lange mit der Tante sprechen / schreiben kann, weil mein Limmit immer sehr schnell voll ist.

Ich hatte der nur die admin hoch geladen mit der bitte die fehler zu beseitigen. Dann habe ich einfach - ohne zu prüfen- den code an dich weiter gegeben.

Ich werde noch ein ausführliche Video dazu machen heute oder morgen
Gruß Volker
Benutzeravatar
Tommy Herrmann
Site Admin
Site Admin
Beiträge: 7752
Registriert: So 6. Dez 2020, 07:37
Wohnort: Berlin
Kontaktdaten:

Re: Zeitlich begrenzter Zugang zu einem Download

Ungelesener Beitrag von Tommy Herrmann »

Bin gleich weg, gerade nur am Handy.

ChatGPT finde ich derart genial, dass ich bereits seit 6 Monaten die 23,00 Euro/Monat zahle. Dann erhält man sehr viel bessere Antworten, schnell und fast unbegrenzt und immer mit der aktuell besten Version, im Moment v5.o.

Das kann man auch monatlich wieder kündigen, wenn mal nicht so viel geplant ist.
Volker
Moderator
Moderator
Beiträge: 1431
Registriert: Sa 12. Dez 2020, 22:35

Re: Zeitlich begrenzter Zugang zu einem Download

Ungelesener Beitrag von Volker »

Tommy Herrmann hat geschrieben: Sa 6. Sep 2025, 18:40 Bin gleich weg, gerade nur am Handy.

ChatGPT finde ich derart genial, dass ich bereits seit 6 Monaten die 23,00 Euro/Monat zahle. Dann erhält man sehr viel bessere Antworten, schnell und fast unbegrenzt und immer mit der aktuell besten Version, im Moment v5.o.

Das kann man auch monatlich wieder kündigen, wenn mal nicht so viel geplant ist.
Ja verdammt :D

Warum hast du die Tante nicht mal so ein script schreiben lassen :D

Ich hab da kein Geld für :confused:
Gruß Volker
Benutzeravatar
Tommy Herrmann
Site Admin
Site Admin
Beiträge: 7752
Registriert: So 6. Dez 2020, 07:37
Wohnort: Berlin
Kontaktdaten:

Re: Zeitlich begrenzter Zugang zu einem Download

Ungelesener Beitrag von Tommy Herrmann »

Habe ich ja schon ganze viele. Die haben fast immer auch gleich funktioniert.

Zwischen der bezahlten und der freien Version liegen, wie ich finde, Welten.

Kannst das doch mal einen Monat testen und dann einen Tag vor der automatischen Erweiterung kündigen. Hatte ich eigentlich auch vor :D
Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste