cgboard - classic games

Normale Version: Link verstecken
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo,

ich arbeite ja grade an meiner Seite, hab da jetzt aber ein Problem mit PHP.
Unzwar hab ich einen Download Button gemacht der auf einen in der Datenbank hinterlegten Link verweist.

Der Code sieht so aus.
Code:
$file=$row["dlurl"];
$dlurl="<div align=\\"center\\"><button type=\\"button\\" style=\\"background-color: transparent; background-image: url(http://localhost/download/lang/german/images/img_download.gif); width: 105px; height: 22px; border: 0px; cursor: pointer;\\" onclick=\\"location.href='$file'\\" onfocus=\\"this.blur()\\"></button></div>";

Jetzt hab ich aber das Problem, wenn ich im Quelltext schaue, dass der Url zur File dort steht.
Ich möchte aber das dort nur z.B. der Link zur Detailansicht des Spiels steht, der so aus sieht.

Code:
http://localhost/testseite/index.php?page=games&id=466

Ist das irgendwie möglich, hab mich daran jetzt schon mehrere Stunden versucht.
dir geht es darum hotlinking zu vermeiden, richtig?

versuch doch mal anstelle deines buttons eine form zu machen mit den parametern action="neueseite.php?id=466" und method="post". in dieser neueseite.php erfragst du den konkreten Link innerhalb der Datenbank anhand der ID. Diesen rufst du dann in der neueseite.php über den php befehl "header" auf. Würde das nicht funktionieren?

edit: ....ach nee... hab da was verplant... ich überleg morgen nochmal Wink
Habe ich richtig verstanden, dass Du auf der Detailansicht des Downloads einen Link für den eigentlichen Download unterbringen möchtest, ohne, dass dieser im Klartext im Seitenquelltext auftaucht? Ohne PHP-Skript, das einfach den Inhalt der Datei weiterreicht, wird es nicht gehen. Solche Skripte gibt es aber haufenweise im Internet, falls Du es nicht selber machen willst.

Für den Rest gibt es verschiedene Möglichkeiten:

1. Du bringst die Spiel-Id beim Aufruf der Detailseite bei den Sessionvariablen unter und machst dann einen Link auf das Download-Skript.

2. Du verschlüsselst die Spiel-Id irgendwie mit der Session-Id, gibst die verschlüsselte Id im Link zum Download-Skript an und das Download-Skript entschlüsselt diese wieder.

3. Du wertest im Download-Skript den Referrer aus. Damit kann dann das Spiel nur heruntergeladen werden, wenn die Download-Url von der Detailseite aus aufgerufen wurde. Gegen diese Variante gibt es aber Tools und jeder, der die Methode kennt, kann diese mit Hilfe eines 0815-Downloadmanagers umgehen.

EDIT: Hast Du Zugriff auf Konfigurationsdatei des Webservers?
Danke für die Antworten, ja es ist richtig das im Quelltext niemand den genauen Link zur Datei sehen soll.

Mit den Session wäre das bestimmt eine gute Lösung, da ich bereits damit schon Arbeite, hab hier mal den vorhandenen Code aus dem oberen Bereich der Datei.

Code:
<?php
if(!defined('INCLUDE')) {
   header("Location: ../../index.php");
}

if (!isset($_GET["id"])){
$_GET["id"]=NULL;
}

if (!isset($Seitenzahlen)){
$Seitenzahlen=NULL;
}

if (!isset($_GET["start"])){
$_GET["start"] =NULL;
}

$strsort = $_GET[sort];
$filter = $_GET[filter];
$genre = $_GET[genre];

include("includes/settings.php");
include("includes/functions.php");

$tpl = new Template();

session_start();
$default_lang = 'de';
if (!isset($_SESSION['lan'])){
$_SESSION['lan'] = $default_lang ;
}
if ( isset($_GET['lan'])){
$_SESSION['lan'] = trim($_GET['lan']);
}
$lan = $_SESSION['lan'];
switch ($lan)
{
case 'de':
$langs[] = "de/main.php";
$lang = $tpl->loadLanguage($langs);
break;
case 'en':
$langs[] = "en/main.php";
$lang = $tpl->loadLanguage($langs);
break;
}
              
$tpl->assign("path", SITE_PATH);
$tpl->assign("lang", SITE_TEMPLATES_PATH);
$tpl->out();

Jetzt muss ich nur noch Überlegen wie ich die Sessionvariable noch dazu nutze, aber nicht mehr zu der Stunde. Smile

Zur Zeit hab ich den Script noch auf meinem Rechner über XAMPP Laufen, worauf ich vollen Zugriff habe.
Hab aber auch bei meinem Hoster vollen Zugriff, da ich dort für jedes Verzeichnisi z.B. auch eine eigene php.ini anlegen kann.
Ich habs jetzt mit Session geschafft, war eigentlich einfach der Code.

Zitat:$_SESSION['dlurl'] = $row["dlurl"];

Jetzt kann ich z.B. mit dem Code in einer neuen Datei zum Download weiterleiten.

Code:
header('Location: '.$_SESSION["dlurl"].'');

Den genauen Url sieht man jetzt auch nicht mehr im Quelltext.
Es dürfte auch kein direktlink zum Downloadurl mehr möglich sein, da sich immer nur das zuletzt angeschaute Spiel in der Session befindet.

EDIT:
Ich hab jetzt grade mal wieder das mit den Sessions verworfen und Versuche einen den ich ohne Probleme aus der Datei rauß nehmen kann.

Der sieht so aus und Funktioniert schonmal recht gut.

Code:
$file = $_GET[file];
            if ($file==download && $row['status'] == "1") {
              header('Location: '.$row["dlurl"].'');
            } else {
              echo "Der Download ist Offline";
            }

Der Original link zur Detailansicht des Spiels sieht zum Beispiel so aus.

index.php?page=games&id=444

Wenn man das Spiel jetzt laden möchte, kommt dann nur noch "&file=download" drann.
Jetzt sieht der ganze Link im Quelltext so aus.

?page=games&id=444&file=download

Jetzt muss ich nur noch die Weiterleitung zur Datei meine bedürfnissen anpassen.
An für sich gut, jedoch fehlt hier das Downloadskript. Smile

Wenn ich jetzt als jemand, der HTTP ganz gut kennt, die Download-URLs herausbekommen wollte, würde ich früher oder später auf die Idee kommen, mir die HTTP-Header anzuschauen und im Location-Header die Download-URL zu einem bestimmten Spiel finden. Diesen Link nehme ich dann und biete den Download auf meiner Seite "Feltzkrones mühsam gesammelte Oldgame-Downloads" an.

Die Klartext-URL taucht zwar nicht mehr im Quelltext auf, dafür aber an anderer Stelle beim Client. Dieses "beim Client" ist das Problem.


Um gegen Link-Stealing und Site-Ripping zu schützen, hilft nur ein Downloadskipt, dass die eigentliche URL aus der Session liest und die Daten (=den Inhalt der Datei) zum Client durchschleust und womöglich noch voraussetzt, dass zwischen Anklicken der Detailseite und Anklicken des Download-Buttons mind. 3 Sekunden vergangen sein müssen (Siterip-Programme wie HTTrack berücksichtigen sowas i.d.R. nicht und machen dazwischen praktisch keine Pause). Außerdem kann das Downloadskript per Referrer noch prüfen, ob der User wirklich von der Detailseite aus den Download gestartet hat.

Wenn Du den Traffic beim Hoster später mal selbst bezahlen musst, wenn er Limit X überschreitet, würde ich an Deiner Stelle einen solchen Schutz einbauen. Ich hätte kein Problem damit, Dir dabei detaillierter unter die Arme zu greifen, aber ich glaube, dass das hier im Forum den Rahmen sprengt.
Wär schön wenn du mir hier irgendwie Helfen könntest.

Werde da aber auch noch einen Code einfügen, dass der Download nur für registrierte User geht.
Beim Anklicken den Download Buttons sollen dazu zwei Sachen passieren.

1. Soll es das klicken Zählen. (also Downloads + 1)
2. Soll es den Download starten.

Noch besser wäre es natürlich das es den Download erst zählt, wenn die Datei geladen wurde.

Das mit der Session hatte ich so gemacht, dass ich es mit in die Onlineanzeige gesetzt habe, wenn also ein Spiel Online ist hab ich $_SESSION['dlurl'] gemacht, wenn es Offline ist hab ich die Session mit unset($_SESSION['dlurl']); entladen.
Das mit der Session entfernen müsste ich dann vielleicht noch auf allen anderen Seiten einfügen.

Wenn zwischen dem Anklicken noch 3 Sekunden vergehen müssen, können man dann nicht irgendwie bevor es die Session anlegt noch den Befehl sleep(3) Schreiben.
Dann wartet es ja 3 Sekunden bis es die weiteren Scripts ausführt.

Falls alles weitere echt den Rahmen des Forums sprengt, können wie ja auch gerne per PN weiterreden. Wink