PHP [php] File Upload script - hochgeladener Link verschlüsseln und automatisch löschen

Zeig mir mal so einen verschlüsselten Link als Beispiel.
Verstehe dein Problem nicht wirklich.

Du kannst mit base64 enkodieren und dekodieren oder mit Prüfsummen, sogennanten "Hashs" arbeiten wie MD5/SHA512 etc.
Das ganze auch natürlich mit mod_rewrite noch entsprechend kombinieren; aber der Sinn des ganzen ergibt sich mir nicht.

Ergänzung:
Oder wird hier von SSL-Zertifikaten bzw. deren zusammenhängenden Verschlüsslungen geredet?

unixp schrieb:
Außerdem möchte ich noch zusätzlich in das Script einbauen, dass der man festlegen kann wielange der Link online sein soll und danach nach der eingestellten Zeit automatisch gelöscht wird.
Hast du eine konkrete Frage oder wo ist das Problem dabei?
 
Zuletzt bearbeitet:
OP weiß wohl nicht, was verschlüsselung bedeutet.
Und mit base64 verschlüsseln wäre mir sehr neu :E
 
Außerdem möchte ich noch zusätzlich in das Script einbauen, dass der man festlegen kann wielange der Link online sein soll und danach nach der eingestellten Zeit automatisch gelöscht wird.

Das kannst Du ganz leicht per SQL machen:
Als erstes erstellst Du eine Tabelle :

Code:
id = auto ( int 22 ) 
zeit = eingestellte Zeit ( varchar 50 ) 
link = der Link ( varchar 100 ) 
userid = die id vom user ( bei Anmeldepflicht ) (int 22)

Dann ein Formular wo er die Zeit eintragen kann :

Die <form> soll nur verdeutlichen, baue das <select> in dein vorhandenes script ein!
HTML:
<form action="deinedatei" method="POST or GET" name="name">
<select name="time">
        <option>1 Tag</option><option>2 Tage</option></select>
</form>

Auswertung - >

PHP:
if($_POST["time"] =="1 Tag") {
$sec = "86400";
}
if($_POST["time"] =="2 Tage") {
$sec = "172800";
}
//etc pp
//Speichere alles in die DB -> 

INSERT INTO
    deinedb(zeit, link, userid)
VALUES
    ("$sec",
     "$link",
     "$userid");
Userid natürlich nur wenn Anmeldepflicht besteht!
PHP:
function get_date_time($timestamp = 0)
{
if ($timestamp)
return date("Y-m-d H:i:s", $timestamp);
}

//Funktion zum automatisch löschen ->
function tuewas() {
$res = mysql_query("SELECT zeit FROM deineDB");
while($row = mysql_fetch_array($res)) {
$secs = $row["zeit"];
$dt = get_date_time(time() - $secs);
$sql =("DELETE FROM deineDB WHERE zeit <= $dt"); 
mysql_query($sql) or die('Error[DELETE|LINK]: <br><pre>' . $sql . '</pre><br>MySQL-Error: ' . mysql_error());
}
}

Und die Funktion tuewas() dann irgend wo einbinden, im header oder so.
Besser noch, lasse die per CronJob aufrufen!


Bisschen grob aber vom Ansatz her würde ich dass so machen!
 
unixp schrieb:
Nun möchte ich diesen Link automatisch nach Upload verschlüsseln lassen.
Hashing ist hier wohl einfacher. Einfach irgendwo hinterlegen und je nach Hash reagieren.
unixp schrieb:
Außerdem möchte ich noch zusätzlich in das Script einbauen, dass der man festlegen kann wielange der Link online sein soll und danach nach der eingestellten Zeit automatisch gelöscht wird.
Cronjob oder pro Seitenaufruf alle Möglichkeiten durchgehen (recht rechenintensiv).
 
volcem schrieb:
Das kannst Du ganz leicht per SQL machen:

Ist klar. Für einen solchen Minidatensatz eine schön fette Datenbank benutzen.
Manchmal begreife ich echt nicht, wie manche Leute ihre merkwürdigen Ideen bekommen.
 
Fette Datenbank?

Warum sollte man dafür keine Datenbank nutzen?
Die Daten die abgefragt werden bzw geschrieben werden sind so klein, da fällt dass nicht ins Gewicht!

Wenn Du meinen Ansatz kritisieren willst, dann poste doch bitte gleich eine Lösung wo der User angeben kann wie lange der Link zur Verfügung steht, ohne DB.

Wenn eh schon eine Datenbank zur Verfügung steht, wieso nicht eine kleine Tabelle nutzen?
 
@volcem,
Stimme dir zu.
Unter einer fetten Datenbank versteh ich sowiso etwas anderes..
Und bei diesem Fall könnte man gleich weitere Daten zu dem jeweiligen File in die Tabelle eintragen.
Prüfsumme, Uploader-IP, evtl. UserName, Zeit des Uploads , Grösse des Files.....

@asdfman
Was für eine Lösung siehst du ?
 
volcem schrieb:
Wenn eh schon eine Datenbank zur Verfügung steht, wieso nicht eine kleine Tabelle nutzen?
Warum mit Kanonen auf Spatzen schießen?

Weißt du ob das Projekt nicht nur privat ist und keinerlei kommerzieller Zweck dahinter steht und weißt du, ob bei privatem Nutzen nicht nur fünf User darauf zugreifen oder gar hunderte oder tausende?

Für die fünf User, reicht eine stink normale INI oder gar ein Text-/CSV-File vollends aus.

Ohne mehr Hintergrundwissen, würde ich hier keinerlei Empfehlung geben, sondern rein auf die Basis ausweichen (Textfiles eben). Der TE ist sicherlich in der Lage selbst entscheiden zu können was performanter und komfortabler ist (einige Erfahrung wird er ja haben).
 
Es wird ein Script für privat mit durchschnittlich 20-50 User die drauf zugreifen werden.

Der Begriff Hashing ist das was ich gesucht habe thx!

@Eagle-PsyX-:

Habe mir falsch ausgedrückt.
Ich möchte den vorhandenen Link umschreiben damit keine Informationen aus dem Link herausgelesen werden können. Zb. mit einern Zahlenreihe.
Gibt es ein howto wie ich das mit mod_rewrite kombinieren kann?

@volcem:

Danke für den Vorschlag würde es so gerne mal realisieren.

Ich habe noch allgemeine Fragen dazu:
Ich habe einen MySQL Server auf dem ich die Tabelle erstellen kann.

Man muss doch im php script angeben das er auf diese Tabelle auf dem Server zugreifen soll. Dann benötige ich eine Authentifizierung zum Server im script oder?


Anmeldepflicht zum Dateien hochladen besteht nicht.
 
unixp schrieb:
Anmeldepflicht zum Dateien hochladen besteht nicht.
Dann lass die User-Geschichte gleich komplett sein und leg einfach folgende Daten an: Datei (+ evtl. Größe, würde ich eher just in time abfragen), Hash und Ablaufdatum. Der Rest wird von den Usern dann sowieso nicht ausgefüllt. Die Uhrzeit zu speichern halte ich genauso für überflüssig oder interessiert den User, wann irgendwas hochgeladen wurde? Falls trotzdem benötigt, kannst du die Zeit des Uploads ebenso über das Dateisystem abfragen (filectime()).
 
Code:
RewriteRule ^file/(.*)(\.htm?)$ file.\php?hash=$1 [L]
Mit dieser mod_rewrite-Regeln, könntest du Links nachdem Schema:
www.domain.de/file/098f6bcd4621d373cade4e832627b4f6.htm
aufrufen und es wird intern die Datei file.php geöffnet mit dem GET-Parameter hash mit dem Wert 098f6bcd4621d373cade4e832627b4f6.
Also dann über $_GET['hash'] abrufbar. Dann müsste dein Skript nur genau entscheiden was es tut. So könnte dem Hash einen Eintrag in einer Datenbank mit der zugehörigen Datei aussuchen etc.

Eine andere Methode wäre es, wenn du die komplett Rewrite-Regel dynamisch abspeichern würdest, so dass der Link direkt auf die Datei führt.
Was glaube ich aber nicht so perfomant ist bei tausenden Dateien.

P.S: Das Beispiel war mit einem MD5-Hash.
 
Zuletzt bearbeitet:
Ggf. aufpassen, dass du temporäre Dateien überträgst, sonst sieht man im Downloadlink ja die originale URL der Datei. Und Verzeichnisse mittels .htaccess absichern nicht vergessen.
 
@unixp

Ganz genau, Du musst eine Datei erstellen die sich zum MySQL Server verbindet.

Diese würde ich dann da includen wo Sie benötigt wird, so hast Du nach her weniger Schreibkram:

online.php ->

PHP:
<?php
    $_config = array();
    $_config['host'] = 'localhost'; //Server  
    $_config['user'] = 'benutzer';  // Benutzername der Rechte für die DB hat      
    $_config['password']  = 'passwort'; // Passwort
    $_config['database'] = 'Datenbankname'; //Datenbankname 

// Erstellen der Verbindung zur MySQL-Datenbank 
          if( !$connection = mysql_connect( $_config['host'], $_config['user'], $_config['password'] ) ) {
               die( 'Verbindung zum Datenbankserver konnte nicht hergestellt werden.' );
          }

          if( !mysql_select_db( $_config['database'], $connection ) ) {
              die ( 'Die Datenbank ' . $_config['database'] . ' kann nicht verwendet werden. <br />
                       MySQL-Error: <br />' . mysql_error() );
          }
?>

Die bindest Du dann einfach in deine PHP Seite ein ->

PHP:
include_once("online.php"); //evtl mit Verzeichnis ( "include/online.php" ) je nach dem wo Du die Datei hast. 

/*

Hier der restliche PHPcode .....

*/

Erstelle aber einen Benutzer der wirklich nur die nötigsten Rechte hat. Alles andere ist ein Sicherheitsrisiko!

Achte bei GET und POST werten darauf dass Du eine Escape-Funktion benutzt.
Zahlen mit int überprüfen und so weiter, ein nettes Thema zum lesen :
http://www.php-faq.de/q-sql-injection.html
 
Apropos Zahlen mit INT überprüfen.
Ich hab mal vorkurzem folgendes probiert, würdet ihr das als sicher ansehen?

PHP:
$_GET['var'] = 2;
if($var = @intval($_GET['var'])) {
  echo $var;  # als INTEGER
  unset($_GET['var']);
}
# oder klassisch
if(is_int($_GET['var'])) {
  $var = $_GET['var'];
  echo $var; # als INTEGER
  unset($_GET['var']);
}
#erstes sollte etwas platz sparen :D
 
Zuletzt bearbeitet:
@volcem:

Also ich habe eine Tabelle mit dem namen "links" auf dem SQL Server angelegt.

Ich habe die online.php Datei angelegt und die Zugangsdaten hinterlegt.
Anschließend habe ich den Befehl include_once("online.php"); in der Datei ganz oben eingebunden.

So sieht nun die index.php aus:

Code:
<?php
/* 
  ============================================
  ========= Filesharing Script V 1.42 ========
  ============================================
  
   Script by Sebastian-Fuss
   www.sebastian-fuss.de.vu
   Support: SFuss@gmx.net
  

==========================================================
====== An dieser Datei am besten nichts verändern!! ======
==========================================================
== Einstellungen können Sie in der config.php vornehmen ==
==========================================================

 */
 require_once("config.php");
 include_once("online.php");
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta name="author" content="Coded by Sebastian Fuss (www.sebastian-fuss.de.vu)">
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title><?php if ($title!=""){echo $title;}else{echo "File Sharing";}?></title>
  <style type="text/css">
  /* <![CDATA[ */
  
a{
color:#3C86D1;
text-decoration:none;
}
a:hover{
color:#0067CE;
text-decoration:underline;
}

  /* ]]> */
  </style>
 
<?php
	function get_date_time($timestamp = 0)
	{
	if ($timestamp)
	return date("Y-m-d H:i:s", $timestamp);
	}

//Funktion zum automatisch löschen ->
	function tuewas() {
	$res = mysql_query("SELECT zeit FROM links");
	while($row = mysql_fetch_array($res)) {
	$secs = $row["zeit"];
	$dt = get_date_time(time() - $secs);
	$sql =("DELETE FROM links WHERE zeit <= $dt"); 
	mysql_query($sql) or die('Error[DELETE|LINK]: <br><pre>' . $sql . '</pre><br>MySQL-Error: ' . mysql_error());
	}
	}  
?> 
 

<script type="text/javascript">
function go(){

document.getElementById("load").style.display="inline";
}
</script>
</head>
<body>
<table border=0 align=center>
 <tr>
  <td>
  <?php if($title!=""){echo "<h1>$title</h1>";}?>
  <?php
#Hier gehts raus, falls eine Datei gelöscht werden soll.
if (isset($_GET['action'])){
if ($_GET['action']=="unlink"){

if (is_dir("$ordner/".$_GET['file'])){
if ($indexfile){
 $datei = "$ordner/".$_GET['file']."/index.php"; // Name der Datei
 }else{
  $datei = "$ordner/".$_GET['file']."/safety.php"; // Name der Datei
 }
 require_once($datei); //Datei wird eingelesen
 if ($code==$_GET['code']){

$verzeichnis = openDir("$ordner/".$_GET['file']); 
while ($file = readDir($verzeichnis)) {
 if ($file != "." && $file != "..") { 
 #Jede Datei im Verzeichniss wird gelöscht
  unlink("$ordner/".$_GET['file']."/$file");
 }
}
closeDir($verzeichnis); // Verzeichnis schließen
#Dann wird das Verzeichnis gelöscht (geht nur, wenn es leer ist)
rmdir("$ordner/".$_GET['file']);
#Überprüfung ob das Verzeichnis noch da ist
if (!is_dir("$ordner/".$_GET['file'])){
#Falls nicht, konnte es gelöscht werden und alle Dateien darin auch
#Ausgabe des Textes
echo "<h3><font color=red>Datei erfolgreich gel&ouml;scht.</font></h3>";}

}else{
echo "<h3><font color=red>Der Sicherheits-Code ist falsch!</font></h3>";
}
}else{
echo "<h3><font color=red>Die Datei ist nicht (mehr) vorhanden.</font></h3>";
}
}
}
?>
   <h3>Datei-Upload</h3>
  </td>
 </tr>
 <tr>
  <td>
   <form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post" enctype="multipart/form-data">
    Datei: <input name="datei" type="file"> <input type="submit" name="loadup" value="Upload" <?php if(!$load_icon==""){ echo 'onclick="go();"';}?>><br />
    <?php if ($show_max_size){ echo "<small style=\"float:right;\">Max. $max_size MB</small>";}
   echo "<small>";
   if ($show_allowed_ext){ 
    if ($only_some_filetypes==0){ echo "Alle Dateitypen erlaubt";}
    if ($only_some_filetypes==1){ echo "Folgende Dateitypen sind erlaubt: $extensions";}
    if ($only_some_filetypes==2){ echo "Folgende Dateitypen sind <b>nicht</b> erlaubt: $extensions";}
    }
    if($show_ip_log){
    echo "<br />Ihre IP-Adresse wird bei einem Upload gespeichert!";
    }
    echo "</small>";
     ?>
    </form>
    
<!-- Abfrage Löschen des Links -->
    <p>Der Link wird gelöscht nach:</p>
    <form action="links" method="POST or GET" name="name">
	<select name="time">
        <option>1 Min</option><option>1 Tag</option><option>2 Tage</option></select>
    </form>
    
    <?php
     if($_POST["time"] =="1 Min") {
	$sec = "60";
	}
	if($_POST["time"] =="1 Tag") {
	$sec = "86400";
	}
	if($_POST["time"] =="2 Tage") {
	$sec = "172800";
	}
//etc pp
//Speichere alles in die DB -> 

INSERT INTO
    links(zeit, link)
VALUES
    ("$sec",
     "$link",);
     ?>
    
   
    <?php 
     if(!$load_icon==""){ ?>
    <center><img src="<?php echo $load_icon;?>" id="load" style="display: none;" alt="Upload läuft..." ></center>
  <?php } ?>
  </td>
 </tr>

</table>
<table border=0 align=center>
  <colgroup>
    <col width="50%">
    <col width="50%">
  </colgroup>

 <tr>
  <td>
<?php
 # Original Script © Homepage-Total.de
 # Moded by Sebastian-Fuss.de.vu
if (isset($_POST['loadup'])){
if($_FILES["datei"]["name"] == "") {
    echo "<font color=red><h3>Keine Datei &uuml;bertragen.</h3></font>"; 
 
}else{

if($_FILES["datei"]["tmp_name"] == "") {
    echo "<font color=red><h3>Fehler bei der &Uuml;bertragung, ist die Datei zu groß?</h3></font>"; 
 
}else{

if($_FILES["datei"]["size"] == 0) {
  echo "<font color=red><h3>Leere Datei!</h3></font>";

}else{
// Überprüfen der Dateiendung
if ($only_some_filetypes!=0){
// Dateiendung herausfinden, falls nicht es alles erlaubt ist
$ext=explode(".",$_FILES["datei"]["name"]);
$endung=$ext[count($ext)-1];
}
if ($only_some_filetypes==1 && strpos($extensions,$endung)!==FALSE || $only_some_filetypes==2 && strpos($extensions,$endung)===FALSE || $only_some_filetypes==0){

if ($_FILES["datei"]["size"]<($max_size*1048576)){

#Generieren des Ordnernames
if ($folder_type==1){
$folder=time(); 
}else{
$folder= substr(md5 (uniqid (rand())),0,8);
}
#Erstellen des Ordners "uploads", falls er nicht vorhanden ist
if(!is_dir("$ordner/")){
mkdir("$ordner/",0777);
}
//Falls der Ordner mit dem selben Namen bereits vorhanden ist, wird ein zufälliger Wert angehängt
if(is_dir("$ordner/$folder")){
$folder=$folder.mt_rand(0,10);
}
#erstellen des Ordners, in den der Upload hinein soll
if(mkdir("$ordner/".$folder,0777)){
#Hier gehts weiter, falls der Ordner erstellt wurde
#Upload
move_uploaded_file($_FILES["datei"]["tmp_name"],
                   "$ordner/$folder/".$_FILES["datei"]["name"]);
#Upload Datei Rechte setzen
@chmod("$ordner/$folder/".$_FILES["datei"]["name"], 0777);
#Ausgabe der "Upload erfolgreich"-Meldung
echo "<font color=red><h3>Datei <i>".$_FILES["datei"]["name"]."</i> erfolgreich &uuml;bertragen.</h3></font>";
# Anti-List-Folder-Index Datei kopieren
if ($indexfile){
$dateiname = "$ordner/$folder/index.php"; // Name der Datei
}else{
$dateiname = "$ordner/$folder/safety.php"; // Name der Datei
}
$code=substr(md5 (uniqid (rand())),0,12);
$text = '<?php'; // Dateiinhalt
$text .= "\n"; // Dateiinhalt
$text .= ' $code="'.$code.'";'; // Dateiinhalt
if ($log_ip){
$text .= "\n"; // Dateiinhalt
$text .= ' $ip="'.$_SERVER['REMOTE_ADDR'].'";'; // Dateiinhalt
}
$text .= "\n ?"; // Dateiinhalt
$text .= '>'; // Dateiinhalt
$handler = fOpen($dateiname , "w+"); // Datei öffnen, wenn nicht vorhanden dann wird die Datei erstellt.
fWrite($handler , $text); // Dateiinhalt in die Datei schreiben
fClose($handler); // Datei schließen

#Ausgabe der Zwei Links
?>
  </td>
 </tr>
<tr>
<td align="center"><a href="<?php echo dirname($_SERVER['PHP_SELF'])."/$ordner/$folder/".$_FILES["datei"]["name"];?>" />Download <?php echo $_FILES["datei"]["name"];?></a></td>
<?php if ($show_delete){ ?>
<td align="center"><a href="<?php echo $_SERVER['PHP_SELF']."?action=unlink&amp;file=$folder&amp;code=".$code;?>" >L&ouml;schen</A></td>
<?php } ?></tr>
<?php if (!$show_only_links){ ?>
<tr>
<td><textarea style="width:100%;" rows="3" readonly >http://<?php echo $_SERVER['SERVER_NAME'].dirname($_SERVER['PHP_SELF'])."/$ordner/$folder/".$_FILES["datei"]["name"];?></Textarea></td>
<?php if ($show_delete){ ?>
<td><textarea style="width:100%;" rows="3" readonly >http://<?php echo $_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']."?action=unlink&amp;file=$folder&amp;code=".$code; ?></Textarea></td>
<?php } ?>
</tr>

<?php
}

}else{
#Ausgabe der Fehlermeldung, falls der Ordner nicht erstellt werden konnte
echo "<h3><font color=red>Fehler beim erstellen des Ordners!</font></h3>";

}
}else{
echo "<h3><font color=red>Diese Datei (".round(($_FILES["datei"]["size"]/1048576),2)." MB) ist zu groß!</font></h3>";
}
}else{
echo "<h3><font color=red>Dieser Dateityp ($endung) ist nicht erlaubt!</font></h3>";
}
}
}
}
}
?>
</table>
 <?php if ($show_adm_link){ ?>
<p  style="text-align:center;"><small><a href="<?php echo $adminphp;?>" >Admin Login</a></small></p>
<?php
}
?>
</body>
</html>

Ich erhalten wenn ich auf die Seite gehe folgende Meldung:


Parse error: syntax error, unexpected T_STRING in /var/www/web719/html/filesharing/index.php on line 155


Das wäre folgender Parameter:
Code:
INSERT INTO

Ist dieser falsch deklariert oder was ist falsch?
 
Ähm...Hast du jemals mit SQL gearbeitet?

Du musst erstmal eine Datenbankverbindung aufbauen und wenn du diese hast, schickst du SQL-Statesments mit z.B. mysql_query(); an den SQL-Server.
Du kannst nicht(!) einfach so SQL-Statements in PHP schreiben, da dies überhaupt nichts mit PHP zu tun hat sondern eine gesonderte Sprache ist.

Wenn überhaupt, dann mit:
PHP:
mysql_query("
INSERT INTO
    links(zeit, link)
VALUES
    ($sec,
     $link)
");
Und das letzte Komma im SQL-Befehl war auch fehl am Platz hier.
 
@Eagle-PsyX-:
Danke jetzt geht es. Die Verbindunge zum SQL baue ich über die online.php auf.

Die Verbindung baut er nun auf und ich kann auch auf das Script zugreifen. Ich teste es gerade mal.
 
Zuletzt bearbeitet:
@Eagle-PsyX-:
Ja habe ich verstanden. Ich habe bei meiner Seite auch ein include von SQL im php script, welches Links aus ner Tabelle zieht. Habs vorhin beim Testen nur übersehen. Danke!


@volcem:

Also man kann jetzt wieder normal Files uploaden, welche dann auf dem Server in dem Verzeichnis uploads gespeichert werden. Bei jedem Upload wird ein neuer Ordner im uploads Verzeichnis angelegt, in dem sich die hochgeladene Datei befindet.

Damit die File wieder gelöscht wird muss denke ich das Script erneut aufgerufen werden, damit die Fuktion tuewas() greift, oder?

Jetzt sollte mit dem obigen Script eine hochgeladene File, welche nach 1 Min auto. gelöscht werden soll, nach einem erneuten Aufruf der script Seite egentlich gelöscht werden oder?

Momentan lädt er sie nur hoch, löscht aber nichts.
 
Zuletzt bearbeitet:

Ähnliche Themen

Antworten
10
Aufrufe
2.023
Zurück
Oben