• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Dateiupload sicher?

Furien

Mitglied
Hi Leute, ich habe mir einen kleinen Dateiupload mit Mysql Einträgen
und Anzeige gebastelt und wollte euch nun fragen,
ob das ganze auch sicher genug ist.

PHP:
<?php
$abfrage="SELECT id, name, datum, gold, autor, beschreibung, pfad, email, userid FROM tracks ORDER BY (datum) DESC";
$ergebnis=mysql_query($abfrage);

if ($_GET["modus"] == "geloescht") {
    echo "Die Datei wurde erfolgreich gelöscht!";
}
echo "<table>";
echo "<tr class='upper'><td>ID</td><td>Ersteller</td><td>Trackname</td><td>Goldmedaillenzeit</td><td>Beschreibung</td><td>Hochgeladen</td><td>Download</td></tr>";
while($row=mysql_fetch_object($ergebnis))
{
    echo "<tr><td>".$row->id."</td><td>".$row->autor."</td><td>".$row->name."</td><td>".$row->gold."</td><td>".$row->beschreibung."</td><td>".$row->datum."</td><td><a href='dl.php?track=".$row->pfad."'>Klick</a></td>";
    if ($_COOKIE["userid"] == $row->userid) {
        echo "<td><a href='trackmania.php?modus=l&q=alle_tracks'>löschen</a></td>";
        if ($_GET['modus'] == "l") {
        unlink("tracks/".$row->pfad);
            mysql_query("DELETE FROM tracks WHERE ID='$row->id' ;");
            mysql_query("ALTER TABLE tracks AUTO_INCREMENT=".$row->id);            
            echo '<meta http-equiv="refresh" content="3; URL=trackmania.php?q=alle_tracks&modus=geloescht">';        
            break;        
        }
        
    }    
    echo "</tr>";
}
echo "</table>"; 
?>
        
        <?php
        }
        if ($_GET["q"] == "tracks_hochladen") {
        ?>
        <br />
        <a name="2">
        <h1>Tracks hochladen und zum download freigeben</h1>
<p>Bitte ladet nur ZIP-Dateien oder .gbx Dateien hoch, alles andere werde ich löschen ;)</p>
<table>
<form method="post" action="" enctype="multipart/form-data">
    <tr>
        <td> Track Auswählen: </td>
        <td> <input name="datei[]" type="file" /> </td>
    </tr>
    <tr>
        <td> Ersteller Name: </td>
        <td> <input name="autorname" type="Input" /> </td>
    </tr>
    <tr>
        <td> E-Mail: </td>
        <td> <input name="email" type="Input" /> </td>
    </tr>
    <tr>
        <td> Trackname: </td>
        <td> <input name="trackname" type="Input" /> </td>
    </tr>
    <tr>
         <td> Zeit für Gold: </td>
         <td> <input name="gold" type="Input" /> </td>
    </tr>
    <tr>
        <td> Beschreibung: </td>
        <td> <textarea name="beschreibung" style="height: 80px"></textarea>    </td>
    </tr>
</table>
<input style="float:right;" type="submit" name="sendfiles" value="Hochladen" class="button "/>
</form>



        <?php
        }
        ?>
<?php
if (isset($_POST['sendfiles'])){ // Sofern auf hochladen geklickt wurde

    if(!empty($_FILES['datei']['tmp_name'])){  // Pruefen ob Datei angegeben wurde
    
        $uploaddir = "tracks"; //Verzeichnis in das die Dateien gespeichert werden sollen
    
            foreach($_FILES['datei']['name'] as $key => $value){
            
                //  Dateigroesse pruefen => Datei darf nicht groesser als 100 000 Bytes sein (1024 byte = 1 kB)    
                if ($_FILES['datei']['size'][$key] > 0 && $_FILES["file"]["size"] < 100000){
                
                    // definiert wohin die Datei muss
                    $uploadfile = $uploaddir."/".basename($_FILES['datei']['name'][$key]);
                
                    // Datei in angegebenes Verzeichnis verschieben
                     if (move_uploaded_file($_FILES['datei']['tmp_name'][$key], $uploadfile)){            
                        echo "<strong><a href='trackmania.php?q=alle_tracks#1'>".$value ."</a></strong> wurde erfolgreich hochgeladen <br />\n"; 

$autorname = htmlspecialchars(mysql_real_escape_string($_POST['autorname'])); //holen der variable aus dem Name: eingabefeld
$trackname = htmlspecialchars(mysql_real_escape_string($_POST['trackname'])); //hier holen wir die hp
$gold = htmlspecialchars(mysql_real_escape_string($_POST['gold']));
$beschreibung = htmlspecialchars(mysql_real_escape_string($_POST['beschreibung']));
$email = htmlspecialchars(mysql_real_escape_string($_POST['email']));
$userid = htmlspecialchars(mysql_real_escape_string($_COOKIE['userid']));

mysql_query("
INSERT INTO `furien`.`tracks` (
`id` ,
`name` ,
`datum` ,
`gold` ,
`autor` ,
`beschreibung` ,
`pfad` ,
`email` ,
`userid`
)
VALUES (
NULL , '$trackname', now(), '$gold', '$autorname', '$beschreibung', '$value' , '$email' , '$userid'
);") or die(mysql_error());  
                    }
                    
                } // close dateigroesse    
             }// close foreach    
    }// close datei angegeben
} // close submit

?>
EDIT: Achja und ich wollte noch fragen, was ich hier noch einfügen muss, um nur .zip und .gbx zuzulassen ;)
EDIT2 : Und eigentlich ist es das löschen, was mit zu denken gibt, aber einfach &modus=l eingeben löscht nichts, zum Glück!
EDIT3 (OH mann): Und ich meine, es gab mal eine Möglichkeit, Fehlermeldungen zu switchen. Wisst ihr was darüber?(Also wenn z.B. im Formular nichts eingegeben wurde)
 
Zuletzt bearbeitet:
Werbung:
Hallo, Furien!

Soweit ich dein Script beurteilen kann ist es ganz gut abgesichert!

PHP:
    if ($_COOKIE["userid"] == $row->userid) {
        echo "<td><a rel='nofollow' href='trackmania.php?modus=l&amp;q=alle_tracks'>löschen</a></td>";
        if ($_GET['modus'] == "l") {
        unlink("tracks/".$row->pfad);
            mysql_query("DELETE FROM tracks WHERE ID='$row->id' ;");
            mysql_query("ALTER TABLE tracks AUTO_INCREMENT=".$row->id);            
            echo '<meta http-equiv="refresh" content="3; URL=trackmania.php?q=alle_tracks&modus=geloescht">';        
            break;        
        }
        
    }
In diesem Codesegment wird - bevor der ausgewählte Track gelöscht wird - geprüft, ob der zur Zeit eingeloggte User wirklich der zu dem Track registrierte User ist. Sprich, deine Ängste sind unbegründet. :)

PHP:
    <tr>
        <td> Track Auswählen: </td>
        <td> <input name="datei[]" type="file" /> </td>
    </tr>
[/QUOTE]
So wie das aussieht willst du gleich mehrere Dateien hochladen...? Aber du behandelst glaube ich nur 1 Datei. Wollte ich nur mal anmerken. Wenns funktioniert... So ganz im Reinen mit Uploads bin ich eh nicht. Mag sie nicht so ;D

[quote="Furien, post: 252267"][PHP]<?php
if (isset($_POST['sendfiles'])){ // Sofern auf hochladen geklickt wurde

    if(!empty($_FILES['datei']['tmp_name'])){  // Pruefen ob Datei angegeben wurde
    
        $uploaddir = "tracks"; //Verzeichnis in das die Dateien gespeichert werden sollen
    
            foreach($_FILES['datei']['name'] as $key => $value){
            
                //  Dateigroesse pruefen => Datei darf nicht groesser als 100 000 Bytes sein (1024 byte = 1 kB)    
                if ($_FILES['datei']['size'][$key] > 0 && $_FILES["file"]["size"] < 100000){
                
                    // definiert wohin die Datei muss
                    $uploadfile = $uploaddir."/".basename($_FILES['datei']['name'][$key]);
                
                    // Datei in angegebenes Verzeichnis verschieben
                     if (move_uploaded_file($_FILES['datei']['tmp_name'][$key], $uploadfile)){            
                        echo "<strong><a rel='nofollow' href='trackmania.php?q=alle_tracks#1'>".$value ."</a></strong> wurde erfolgreich hochgeladen <br />\n"; 

$autorname = htmlspecialchars(mysql_real_escape_string($_POST['autorname'])); //holen der variable aus dem Name: eingabefeld
$trackname = htmlspecialchars(mysql_real_escape_string($_POST['trackname'])); //hier holen wir die hp
$gold = htmlspecialchars(mysql_real_escape_string($_POST['gold']));
$beschreibung = htmlspecialchars(mysql_real_escape_string($_POST['beschreibung']));
$email = htmlspecialchars(mysql_real_escape_string($_POST['email']));
$userid = htmlspecialchars(mysql_real_escape_string($_COOKIE['userid']));

mysql_query("
INSERT INTO `furien`.`tracks` (
`id` ,
`name` ,
`datum` ,
`gold` ,
`autor` ,
`beschreibung` ,
`pfad` ,
`email` ,
`userid`
)
VALUES (
NULL , '$trackname', now(), '$gold', '$autorname', '$beschreibung', '$value' , '$email' , '$userid'
);") or die(mysql_error());  
                    }
                    
                } // close dateigroesse    
             }// close foreach    
    }// close datei angegeben
} // close submit

?>
Auch in diesem Teil schon recht gut abgesichert, bis auf, wie du bereits selbst erkannt hast, die Dateierweiterung. Die kann sehr gefährlich werden, wenn ein Hacker es schaffen sollte, Schadscript hochzuladen. Du könntest haftbar gemacht werden, sollten Schäden entstehen... Zur Dateierweiterungserkennung gleich mehr. ;)
Ansonsten: Prima Sicherheitsroutinen, das Escapen sichert, dass XSS nicht im Namen oder sonstwas eingebaut werden kann. :D


EDIT: Achja und ich wollte noch fragen, was ich hier noch einfügen muss, um nur .zip und .gbx zuzulassen ;)
Es gibt im assoziativen Array $_FILES[ "Datei" ] gibt es... ich nenne es mal das Attribut "type". Damit kannst du die Datei-Erweiterung einschränken. Da du .zip-Dateien willst wäre das "application/zip", was die .gbx Dateien betrifft musst du selbst suchen, ich kenne diese Erweiterung nicht. xD
Beispiel:

PHP:
if( $_FILES[ "Datei" ][ "type" ] == "application/zip" ) {
    // Weiter mit deinem eigentlichen Code
} else {
    // Die Datei ist keine ZIP-Datei!
    // Mach was!
}


EDIT2 : Und eigentlich ist es das löschen, was mit zu denken gibt, aber einfach &modus=l eingeben löscht nichts, zum Glück!
Bereits zu Begin geklärt. ^^


EDIT3 (OH mann): Und ich meine, es gab mal eine Möglichkeit, Fehlermeldungen zu switchen. Wisst ihr was darüber?(Also wenn z.B. im Formular nichts eingegeben wurde)
Naja... ich bastle mir meistens dazu JavaScripts, da das meistens Clientfreundlicher ist... Wenn ein Feld nicht ausgefüllt ist muss die Seite nicht noch extra laden, was für mich als O2-Surfstick-Benutzer deutlich erkennbar ist. ;)
Wie auch immer... Wie genau meinst Du das? Soweit ich das verstehe würde ich darauf antworten, dass mir eine solche Methode unbekannt ist... Ich würde im Beispiel Formular höchstens einzeln überprüfen, ob die Felder ausgefüllt sind oder nicht.

Fazit: Dein Upload- und View-Script ist gut geschützt. Aber merke Dir eines: Richtige sogenannte "Blackhats"-Hacker können kreativ sein - wenn sie wollen. Sogar YouTube ist nicht 100% sicher! Bin noch relativ frisch im Gebiet Security, aber dein Script dürfte Hacker, die auf leichte Beute aus sind, auf jeden Fall von deiner Seite abhalten. :D


Mit freundlichen Grüßen,
DarkDragon1993
 
DarkDragon193 schrieb:
In diesem Codesegment wird - bevor der ausgewählte Track gelöscht wird - geprüft, ob der zur Zeit eingeloggte User wirklich der zu dem Track registrierte User ist. Sprich, deine Ängste sind unbegründet.

Leider sind sie das nicht, da ich in meinem Cookie (auf dem Clientrechner gespeicherte Datei) einfach das Feld "userid" verändern kann. Sessions (meine Empfehlung) oder irgendeine Art von Hashing/Verschlüsselung der Cookie-Werte wären hier angebracht.

Kurz gesagt: Cookie-Daten sind sehr einfach manipulierbar.

Ansonsten: Prima Sicherheitsroutinen, das Escapen sichert, dass XSS nicht im Namen oder sonstwas eingebaut werden kann.

Stimmt prinzipiell, nur speichert man üblicherweise die Originaldaten in die Datenbank und escapet erst für die Ausgabe. Heißt:

PHP:
$var = mysql_real_escape_string($var); // vor Einsetzen in SQL-String

echo htmlspecialchars($var); // bei Ausgabe

Übrigens: Wenn beide Funktionen, dann in jedem Fall umgekehrt geschachtelt (also mysql_real_escape_string nach außen).

Es gibt im assoziativen Array $_FILES[ "Datei" ] gibt es... ich nenne es mal das Attribut "type". Damit kannst du die Datei-Erweiterung einschränken. Da du .zip-Dateien willst wäre das "application/zip", was die .gbx Dateien betrifft musst du selbst suchen, ich kenne diese Erweiterung nicht.

Soweit ich weiß, ist der vom Client als Metadatum mitgeschickte MIME-Type manipulierbar und kann zudem von Client zu Client mehr oder weniger stark variieren. Eine Datei mit Endung .php dürfte dem Server zum Beispiel als application/zip untergejubelt werden können.

Ich würde deshalb in jedem Fall in erster Linie über die Dateiendung gehen, auch wenn die natürlich auch einfach verändert werden kann. Ein (zum Beispiel) PHP-Script mit falscher Endung wird vom Server allerdings (in aller Regel) nicht ausgeführt, weil es eben keine Endung hat, die mit dem PHP-Interpreter assoziiert ist.

Aus dem Kopf:

PHP:
$whitelist = array('zip', 'jpg', 'jpeg');
$extension = strtolower(pathinfo($_FILES['feldname']['name'],
                                 PATHINFO_EXTENSION));

if (in_array($extension, $whitelist)) {
    // in Ordnung
} else {
    // nicht in Ordnung
}

Zusätzlich könnten dann noch Funktionen wie PHP: finfo_open - Manual (ab PHP 5.3, vorher PHP: mime_content_type - Manual) auf die hochgeladene Datei auf dem Server angewendet werden, um den Inhalt weiter zu untersuchen. (Bei Bildern wäre auch PHP: getimagesize - Manual eine Möglichkeit.)
 
Werbung:
An dem Script stimmt insgesamt leider eine ganze Menge nicht. Ich habe versucht, es ein wenig umzustellen, aber es ist ehrlichgesagt zu viel, um es in einem Schritt in halbwegs vertretbarer Zeit zu schaffen.

Ich liste mal die gröbsten Sachen auf:

- EVA-Prinzip nicht beachtet. Erst Eingaben verarbeiten, dann Ausgaben generieren. Das schafft dir aktuell einen Haufen Probleme. Wenn du etwa eine Datei löschen willst, wird diese *vorher* in die Liste der vorhandenen Dateien in den HTML-Code geschrieben. Beim Hinzufügen von Dateien werden diese erst in die Datenbank geschrieben, wenn der HTML-Code mit den vorhandenen Dateien schon rausgeschickt wurde (tauchen da also nicht auf).

- Die if-Bedingung in diesem Teil ist zwar kreativ, aber inhaltlich von der Ablauflogik leider arg daneben:

PHP:
echo "<table>";
echo "<tr class='upper'><td>ID</td><td>Ersteller</td><td>Trackname</td><td>Goldmedaillenzeit</td><td>Beschreibung</td><td>Hochgeladen</td><td>Download</td></tr>";
while($row=mysql_fetch_object($ergebnis))
{
    echo "<tr><td>".$row->id."</td><td>".$row->autor."</td><td>".$row->name."</td><td>".$row->gold."</td><td>".$row->beschreibung."</td><td>".$row->datum."</td><td><a href='dl.php?track=".$row->pfad."'>Klick</a></td>";
    if ($_COOKIE["userid"] == $row->userid) {
        echo "<td><a href='trackmania.php?modus=l&q=alle_tracks'>löschen</a></td>";
        if ($_GET['modus'] == "l") {
        unlink("tracks/".$row->pfad);
            mysql_query("DELETE FROM tracks WHERE ID='$row->id' ;");
            mysql_query("ALTER TABLE tracks AUTO_INCREMENT=".$row->id);
            echo '<meta http-equiv="refresh" content="3; URL=trackmania.php?q=alle_tracks&modus=geloescht">';
            break;
        }

    }
    echo "</tr>";
}
echo "</table>";

Da hakt es auch am fehlenden EVA. Du musst die Einträge löschen, bevor du beginnst, Ausgaben (also HTML-Code) zu generieren.

Mache außerdem absolut niemals sowas:

PHP:
mysql_query("ALTER TABLE tracks AUTO_INCREMENT=".$row->id);

Das fliegt dir um die Ohren. Durch Löschung entstehende Lücken im Index sind in Datenbanken normal und designtechnisch notwendig. Die Zeile muss ersatzlos gestrichen werden.

- Operationen, die persistente Daten verändern, sollten zudem per POST ausgeführt werden. Das betrifft bei dir die Löschoperation.

- Du hast schlicht und ergreifend zu viel zu unterschiedlichen Code auf der Seite, der es schwierig macht, den Überblick zu behalten. Normalerweise würde man zwischen Formularlogik und "Model-Logik" trennen und Operationen wie das Verschieben der Dateien und das Einfügen oder Löschen aus der Datenbank auslagern.

Von der Idee ganz grob so:

PHP:
foreach ($_FILES['datei']['name'] as $key => $value) {
    model_trackmania_importFile($key, $value);
}

Wie gesagt, das ist leider alles nicht mal eben so zu erklären/reparieren.
 
Das ganze hatte ich mal in Relation zu seinem Wissenstand geschrieben... x.x
Natürlich geht das ganze noch viel besser... Mit mehr Übung und mehr Wissen wird das auch schon noch alles. Und grundsätzlich sind Dateiuploads böse. ;) Zumindest habe ich mir das so gemerkt...
Und ja, das Script ist unschön... Ich setz meine PHP-Skripte lieber in den Kopf der Seite oder lasse alles durch echo's ausgeben, was allerdings auch keine brillante Lösung ist.
 
Werbung:
Hey danke erstmal für die ganzen Antworten :)
Mermshaus, soll ich jetzt etwa die Ausgaben in ein anderes Dokument tun
und die Verarbeitung dort lassen?
Ich habe mir halt auch Sachen zusammenkopiert und hatte nicht wirklich lust,
alles einzurücken und so weiter ^^
Und ich frage mich auch, wie jemand die 5 Stellige UserID erraten möchte und
diese im Cookie ändern ;)

EDIT Oha ich hab jetzt was viel schlimmeres gefunden.
Den Datei Download!
Eigentlich soll man damit nur die Dateien aus einem Ordner Downloaden,
aber wenn man z.B. in die Adressleiste ?track=../index.php
eingibt, kann man die Datei wirklich downloaden.
Wie mache ich, dass das nicht geht?

Code:
<?php
if (empty($_GET["track"])) die("Keine Datei wurde übergeben");
if ($_GET["track"] ==  ".htaccess" OR $_GET["track"] ==  ".htpasswd" ) die("Das lädst du nicht runter"); 
$downloadfile = "tracks/".$_GET["track"];
$filename = "track.".rand('000','999').$_GET["track"];
$filesize = filesize($downloadfile);

header("Content-Type: application/zip");
header("Content-Disposition: attachment; filename=$filename");
header("Content-Length: $filesize");

readfile($downloadfile);

exit;
?>
EDIT2:
Ich weiß zwar nicht, ob es so sicher ist, aber es funktioniert:
Code:
<?php
if (empty($_GET["track"])) die("Keine Datei wurde übergeben");
if ($_GET["track"] ==  ".htaccess" OR $_GET["track"] ==  ".htpasswd" ) die("Das lädst du nicht runter"); 
$downloadfile = "tracks/".$_GET["track"];
$dl = explode("/", $downloadfile);
if ($dl[1] == "..") die("Nein.");

$filename = "track.".rand('000','999').$_GET["track"];
$filesize = filesize($downloadfile);

header("Content-Type: application/zip");
header("Content-Disposition: attachment; filename=$filename");
header("Content-Length: $filesize");

readfile($downloadfile);

exit;
?>
 
Zuletzt bearbeitet:
Ich habe mir halt auch Sachen zusammenkopiert und hatte nicht wirklich lust,
alles einzurücken und so weiter ^^
idr. haben wir dann auch keine lust dazu, den code zu "rekonstruieren"

erstelle eine liste von daten die der benutzer runterladen darf.

php.net/glob
php.net/basename
php.net/in_array
 
Hey Leute, Eure Tipps mit dem trennen waren SUPER, ist jetzt viel übersichtlicher :>
Nunja, aber immer alles zu trennen geht ja schlecht. Der Code folgt!

trackmania_upload_form.php mache ich jetzt nicht rein. Ist ja eher uninteressant..

trackmania_upload_verarbeitung.php:
Code:
<?php        
    include 'head.php';
    include 'sql.inc.php';
    if (isset($_POST["loeschen"])) {
            $id = $_SESSION["id"];
            $pfad = $_SESSION["pfad"];
            mysql_query("DELETE FROM tracks WHERE ID='$id' ;");
            if(unlink("tracks/".$pfad)) {
            echo "<p class='red'><a href='trackmania_upload_ausgabe.php'>Zurück</a> Die Strecke wurde erfolgreich gelöscht.</p>";
            }            
            //echo '<meta http-equiv="refresh" content="3; URL=trackmania.php?q=alle_tracks&modus=geloescht">';            
    }
    if (isset($_POST['sendfiles'])){ // Sofern auf hochladen geklickt wurde

        if(!empty($_FILES['datei']['tmp_name'])){  // Pruefen ob Datei angegeben wurde
    
            $uploaddir = "tracks"; //Verzeichnis in das die Dateien gespeichert werden sollen
    
            foreach($_FILES['datei']['name'] as $key => $value){
            
                //  Dateigroesse pruefen => Datei darf nicht groesser als 100 000 Bytes sein (1024 byte = 1 kB)    
                if ($_FILES['datei']['size'][$key] > 0 && $_FILES["file"]["size"] < 100000){
                
                    // definiert wohin die Datei muss
                    $uploadfile = $uploaddir."/".basename($_FILES['datei']['name'][$key]);
                
                    // Datei in angegebenes Verzeichnis verschieben
                     if (move_uploaded_file($_FILES['datei']['tmp_name'][$key], $uploadfile)){            
                        echo "<p class='red'><strong><a href='trackmania_upload_ausgabe.php'>".$value ."</a></strong> wurde erfolgreich hochgeladen </p>"; 

                        $autorname = htmlspecialchars(mysql_real_escape_string($_POST['autorname'])); 
                        $trackname = htmlspecialchars(mysql_real_escape_string($_POST['trackname']));
                        $gold = htmlspecialchars(mysql_real_escape_string($_POST['gold']));
                        $beschreibung = htmlspecialchars(mysql_real_escape_string($_POST['beschreibung']));
                        $email = htmlspecialchars(mysql_real_escape_string($_POST['email']));
                        $userid = htmlspecialchars(mysql_real_escape_string($_COOKIE['userid']));

                        mysql_query("
                        INSERT INTO `furien`.`tracks` (
                        `id` ,
                        `name` ,
                        `datum` ,
                        `gold` ,
                        `autor` ,
                        `beschreibung` ,
                        `pfad` ,
                        `email` ,
                        `userid`
                        )
                        VALUES (
                            NULL , '$trackname', now(), '$gold', '$autorname', '$beschreibung', '$value' , '$email' , '$userid'
                        );") or die(mysql_error());  
                    }
                    
                } // close dateigroesse    
             }// close foreach    
        }// close datei angegeben
    } // close submit
    include 'foot.php';
?>
Und trackmania_upload_ausgabe.php:

Code:
<?php include 'head.php'; ?>
<h1>alle hochgeladenen strecken</h1>
<?php
    function convertdate($date) {
     $tmp = explode(' ', $date);
     $tmp_datum = explode('-', $tmp[0]);
     $tmp_zeit = explode(':', $tmp[1]);
     return $tmp_datum[2] . '.' . $tmp_datum[1] . '.' . $tmp_datum[0] . ' ' . $tmp_zeit[0] . ':' .$tmp_zeit[1];
     }
    include 'sql.inc.php';
    $abfrage="SELECT id, name, datum, gold, autor, beschreibung, pfad, email, userid FROM tracks ORDER BY (datum) DESC";
    $ergebnis=mysql_query($abfrage);
    echo "<table>";
    echo "<tr class='upper'><td>ID</td><td>Ersteller</td><td>Trackname</td><td>Goldmedaillenzeit</td><td>Beschreibung</td><td>Hochgeladen</td><td>Download</td></tr>";
    while($row=mysql_fetch_object($ergebnis)) {
        echo "<tr><td>".$row->id."</td><td>".$row->autor."</td><td>".$row->name."</td><td>".$row->gold."</td><td>".$row->beschreibung."</td><td>".convertdate($row->datum)."</td><td><a href='dl.php?track=".$row->pfad."'>Klick</a></td>";    
        if ($_COOKIE["userid"] == $row->userid) {
            echo '<td><form method="post" action="trackmania_upload_verarbeitung.php"><input class="button" type="submit" name="loeschen" value="Löschen" class="button"/></form></td>';
            $_SESSION['pfad'] = $row->pfad;
            $_SESSION['id'] = $row->id;
        }
        echo "</tr>";
    }
    echo "</table>";
    include 'foot.php';
?>
Und dann wollte ich nochmal fragen, warum es so böse ist, automatisch das Auto_Increment nach einer Löschung zurückzusetzen.

EDIT Ich habe jetzt noch einmal Fehlermeldungen hinzugefügt, aber diese greifen nicht, wenn man etwas nicht eingibt.

trackmania_upload_verarbeitung.php:

Code:
if (isset($_POST['sendfiles'])) {    
        if(empty($_FILES['datei']['tmp_name'])) die ("Bitte wähle eine Datei aus."); 
        if (!isset($_POST['autorname'])) die ("Bitte gebe deinen Namen an.");
        if (!isset($_POST['email'])) die ("Bitte gebe deine E-Mail Adresse ein.");
        if (!isset($_POST['trackname'])) die ("Bitte gebe den Namen der Strecke an.");
        if (!isset($_POST['gold'])) die ("Bitte gebe die Zahl für die Goldmedaille an.");
        if (!isset($_POST['beschreibung'])) die ("Bitte gebe eine Beschreibung zu der Strecke an.");
    }
und trackmania_upload_form.php:

Code:
<table>
    <form method="post" action="trackmania_upload_verarbeitung.php" enctype="multipart/form-data">
        <tr>
            <td> Track Auswählen: </td>
            <td> <input name="datei[]" type="file" /> </td>
        </tr>
        <tr>
            <td> Ersteller Name: </td>
            <td> <input name="autorname" type="Input" /> </td>
        </tr>
        <tr>
            <td> E-Mail: </td>
            <td> <input name="email" type="Input" /> </td>
        </tr>
        <tr>
            <td> Trackname: </td>
            <td> <input name="trackname" type="Input" /> </td>
        </tr>
        <tr>
            <td> Zeit für Gold: </td>
             <td> <input name="gold" type="Input" /> </td>
        </tr>
        <tr>
            <td> Beschreibung: </td>
            <td> <textarea name="beschreibung" style="height: 80px"></textarea>    </td>
        </tr>
    </table>
    <input style="float:right;" type="submit" name="sendfiles" value="Hochladen" class="button "/>
</form>
Ich versteh echt nicht, worans liegt.


EDIT 2 empty war das Stichwort ^^
 
Zuletzt bearbeitet:
Werbung:
Geh mal einfach davon aus, du setzt das Auto_Increment automatisch zurück, hast aber nen kleinen Denkfehler... Auto Increment bei 5, letzter Eintrag ebenso... Eintrag 3 wird gelöscht, Auto Increment auf 4. Neuer Eintrag, => Doppelter Eintrag auf 5 => funzt nicht...
So würde ich mir das mal denken... Ich lasse den Auto Increment immer so, steigert zudem noch ein wenig die Unübersicht wenn jemand meint damit was hacken zu wollen, zum Beispiel bei der User-ID. :)
 
Stiiiiiimmt..
Totaler Denkfehler xD
Danke!
Müsste jetzt eigentlich alles abgehakt sein.
mfg Furien

PS: Man könnte aber theoretisch gucken, wieviele Datensätze es gibt und dann halt Autoincrement dementsprechend setzen.
Und ist es schlimm, wenn ich die ID der Datensätze ausgebe ?=

EDIT Hmm ich habe doch noch ein Problem.
Und zwar funktioniert das mit dem [file][type] da nicht.
Ich bekomme gar keinen Text, wenn ich versuche etwas hochzuladen.
Hätte ich eine Fehlermeldung, also ein else, würde wohl das kommen.
Code:

PHP:
if (isset($_POST['sendfiles'])){ // Sofern auf hochladen geklickt wurde

        if(!empty($_FILES['datei']['tmp_name'])){  // Pruefen ob Datei angegeben wurde
    
            $uploaddir = "tracks"; //Verzeichnis in das die Dateien gespeichert werden sollen
    
            foreach($_FILES['datei']['name'] as $key => $value){
            
                //  Dateigroesse pruefen => Datei darf nicht groesser als 100 000 Bytes sein (1024 byte = 1 kB)    
                if ($_FILES['datei']['size'][$key] > 0 && $_FILES["file"]["size"] < 100000){
                    // Dateityp = zip
                      if($_FILES["datei"]["type"] == "application/zip" ) {
                        // definiert wohin die Datei muss
                        $uploadfile = $uploaddir."/".basename($_FILES['datei']['name'][$key]);

                        // Datei in angegebenes Verzeichnis verschieben
                         if (move_uploaded_file($_FILES['datei']['tmp_name'][$key], $uploadfile)){            
                            echo "<p class='red'><strong><a href='trackmania_upload_ausgabe.php'>".$value ."</a></strong> wurde erfolgreich hochgeladen </p>";
Danch kommt noch die MySQL Eintragung und dann die ganzen Klammern, hab ich jetzt aber weggelassen. Hat sich auch erledigt. ich hatte das [$key] vergessen.. :)
 
Zuletzt bearbeitet:
Werbung:
Hat sich auch erledigt. ich hatte das [$key] vergessen.. :smile:
.......trotzdem...danke;)
Und ich habe nooch ne Frage ^^
Wie kann ich den Namen der hochgeladenen Datei ändern? Also schon beim Upload? Hab
schon alles probiert, funktioniert aber nicht.




Jetzt habe ich noch ein Problem -.-
Wenn man 2 Files nacheinnander hochgeladen hat, wird wenn man auf löschen klickt das falsche File gelöscht.
Hab mir die ID nach dem löschen mal ausgeben lassen und tatsächlich die Falsche!
Die ID wird ja in der Schleife in die Session eingetragen.
Liegt da möglicherweise der Fehler?

Okay ich hab jetzt verstanden, dass man die ID von dem File in der Session hat, das als letztes durch die Schleife ging.
Aber wie kann ich es ändern, dass die drin ist, von der der Button gedrückt wurde =?
 
Zuletzt bearbeitet:
Falls du noch Hilfe suchst, wäre es glaube ich ganz gut, wenn du deinen aktuellen Code noch einmal komplett posten könntest. Sonst reden alle am Ende nur aneinander vorbei.
 
Okay ich erläutere mein Problem nochmal.
In der Schleife wird ja jedem Eintrag, sofern die UserID des Users im Cookie
stimmt ein löschen Button eingefügt.
Das mit löschen klappt auch ganz gut, hat der User aber 2 Strecken
nacheinander hochgeladen und will nun die erste löschen,
wird die zweite gelöscht. Ich übergebe die ID nämlich per Session
und in der Session steht dann natürlich die ID der Strecke, die als letztes
durch die Schleife kam. Nun ist meine Frage: Wie kann ich OHNE get (zu unsicher)
die ID der richtigen Strecke übermitteln?

Hier die Codes:
trackmania_upload_form.php:
Code:
<?php include 'head.php'; ?>
<h1>Tracks hochladen und zum download freigeben</h1>
<p class="red">Bitte ladet nur ZIP-Dateien hoch!</p>
<table>
    <form method="post" action="trackmania_upload_verarbeitung.php" enctype="multipart/form-data">
        <tr>
            <td> Track Auswählen: </td>
            <td> <input name="datei[]" type="file" /> </td>
        </tr>
        <tr>
            <td> Ersteller Name: </td>
            <td> <input name="autorname" type="Input" /> </td>
        </tr>
        <tr>
            <td> E-Mail: </td>
            <td> <input name="email" type="Input" /> </td>
        </tr>
        <tr>
            <td> Trackname: </td>
            <td> <input name="trackname" type="Input" /> </td>
        </tr>
        <tr>
            <td> Zeit für Gold: </td>
             <td> <input name="gold" type="Input" /> </td>
        </tr>
        <tr>
            <td> Beschreibung: </td>
            <td> <textarea name="beschreibung" style="height: 80px"></textarea>    </td>
        </tr>
    </table>
    <input style="float:right;" type="submit" name="sendfiles" value="Hochladen" class="button "/>
</form>
<?php include 'foot.php'; ?>

trackmania_upload_verarbeitung.php:
PHP:
<?php        
    include 'head.php';
    include 'sql.inc.php';
    // fehlermeldungen {
    if (isset($_POST['sendfiles'])) {    
        if(empty($_FILES['datei']['tmp_name'])) die ("<p class='red'>Bitte wähle eine Datei aus.</p>"); 
        if (empty($_POST['autorname'])) die ("<p class='red'>Bitte gebe deinen Namen an.</p>");
        if (empty($_POST['email'])) die ("<p class='red'>Bitte gebe deine E-Mail Adresse ein.</p>");
        if (empty($_POST['trackname'])) die ("<p class='red'>Bitte gebe den Namen der Strecke an.</p>");
        if (empty($_POST['gold'])) die ("<p class='red'>Bitte gebe die Zahl für die Goldmedaille an.</p>");
        if (empty($_POST['beschreibung'])) die ("<p class='red'>Bitte gebe eine Beschreibung zu der Strecke an.</p>");
    }
    // }
    if (isset($_POST["loeschen"])) {
            $id = $_SESSION["id"];
            echo $id;
            $pfad = $_SESSION["pfad"];
            mysql_query("DELETE FROM tracks WHERE ID='$id' ;");
            if(unlink("tracks/".$pfad)) {
            echo "<p class='red'><a href='trackmania_upload_ausgabe.php'>Zurück</a> Die Strecke wurde erfolgreich gelöscht.</p>";
            }            
            //echo '<meta http-equiv="refresh" content="3; URL=trackmania.php?q=alle_tracks&modus=geloescht">';            
    }
    if (isset($_POST['sendfiles'])){ // Sofern auf hochladen geklickt wurde

        if(!empty($_FILES['datei']['tmp_name'])){  // Pruefen ob Datei angegeben wurde
    
            $uploaddir = "tracks"; //Verzeichnis in das die Dateien gespeichert werden sollen
    
            foreach($_FILES['datei']['name'] as $key => $value){
            
                //  Dateigroesse pruefen => Datei darf nicht groesser als 100 000 Bytes sein (1024 byte = 1 kB)    
                if ($_FILES['datei']['size'][$key] > 0 && $_FILES["file"]["size"] < 100000){
                    // Dateityp = zip
                    if($_FILES["datei"]["type"][$key] == "application/zip" ) {
                        // definiert wohin die Datei muss
                        $uploadfile = $uploaddir."/".basename($_FILES['datei']['name'][$key]);

                        // Datei in angegebenes Verzeichnis verschieben
                         if (move_uploaded_file($_FILES['datei']['tmp_name'][$key], $uploadfile)){            
                            echo "<p class='red'><strong><a href='trackmania_upload_ausgabe.php'>".$value ."</a></strong> wurde erfolgreich hochgeladen </p>"; 

                            $autorname = htmlspecialchars(mysql_real_escape_string($_POST['autorname'])); 
                            $trackname = htmlspecialchars(mysql_real_escape_string($_POST['trackname']));
                            $gold = htmlspecialchars(mysql_real_escape_string($_POST['gold']));
                            $beschreibung = htmlspecialchars(mysql_real_escape_string($_POST['beschreibung']));
                            $email = htmlspecialchars(mysql_real_escape_string($_POST['email']));
                            $userid = htmlspecialchars(mysql_real_escape_string($_COOKIE['userid']));
                            $ip = $_SERVER["REMOTE_ADDR"];  
                              
                            mysql_query("
                            INSERT INTO `furien`.`tracks` (
                            `id` ,
                            `name` ,
                            `datum` ,
                            `gold` ,
                            `autor` ,
                            `beschreibung` ,
                            `pfad` ,
                            `email` ,
                            `userid` ,
                            `ip`
                            )
                            VALUES (
                                NULL , '$trackname', now(), '$gold', '$autorname', '$beschreibung', '$value' , '$email' , '$userid' , '$ip'
                            );") or die(mysql_error());  
                        }//close verschieben
                    
                    }//close dateityp
                    else die("<p class='red'>Die Datei ist keine Zip-Datei!</p>");
                 }//close dateigrösse
                  else die("<p class='red'>Die Datei ist zu groß!</p>");
            }//close foreach
        }//close datei angegeben?
    }//close submit
        
    include 'foot.php';
?>

Und zu guter Letzt:
trackmania_upload_ausgabe.php:

PHP:
<?php include 'head.php'; ?>
<h1>alle hochgeladenen strecken</h1>
<?php
    function convertdate($date) {
     $tmp = explode(' ', $date);
     $tmp_datum = explode('-', $tmp[0]);
     $tmp_zeit = explode(':', $tmp[1]);
     return $tmp_datum[2] . '.' . $tmp_datum[1] . '.' . $tmp_datum[0] . ' ' . $tmp_zeit[0] . ':' .$tmp_zeit[1];
     }
    include 'sql.inc.php';
    $abfrage="SELECT id, name, datum, gold, autor, beschreibung, pfad, email, userid FROM tracks ORDER BY (datum) DESC";
    $ergebnis=mysql_query($abfrage);
    echo "<table>";
    echo "<tr class='upper'><td>ID</td><td>Ersteller</td><td>Trackname</td><td>Goldmedaillenzeit</td><td>Beschreibung</td><td>Hochgeladen</td><td>Download</td></tr>";
    while($row=mysql_fetch_object($ergebnis)) {
        echo "<tr><td>".$row->id."</td><td>".$row->autor."</td><td>".$row->name."</td><td>".$row->gold."</td><td>".$row->beschreibung."</td><td>".convertdate($row->datum)."</td><td><a href='dl.php?track=".$row->pfad."'>Klick</a></td>";    
        if ($_COOKIE["userid"] == $row->userid) {
            $_SESSION['pfad'] = $row->pfad;
            $_SESSION['id'] = $row->id;
            echo '<td><form method="post" action="trackmania_upload_verarbeitung.php"><input class="button" type="submit" name="loeschen" value="Löschen" class="button"/></form></td>';
        }
        echo "</tr>";
    }
    echo "</table>";
    include 'foot.php';
?>

Wenn ihr wollt, könnt ihrs auch live testen:
Furien Website
 
Werbung:
Übergib die Werte nicht per Session, sondern per POST:

PHP:
    while($row=mysql_fetch_object($ergebnis)) {
        echo "<tr><td>".$row->id."</td><td>".$row->autor."</td><td>".$row->name."</td><td>".$row->gold."</td><td>".$row->beschreibung."</td><td>".convertdate($row->datum)."</td><td><a href='dl.php?track=".$row->pfad."'>Klick</a></td>";
        if ($_COOKIE["userid"] == $row->userid) {
            /*$_SESSION['pfad'] = $row->pfad;
            $_SESSION['id'] = $row->id;*/
            echo '<td><form method="post"
                            action="trackmania_upload_verarbeitung.php">
                  <input type="hidden" name="pfad" value="' .  htmlspecialchars($row->pfad) .'" />
                  <input type="hidden" name="id" value="' .  htmlspecialchars($row->id) .'" />
                  <input class="button" type="submit" name="loeschen" value="Löschen" class="button"/>
                  </form></td>';
        }
        echo "</tr>";
    }
 
Daran hatte ich ehrlich gesagt auch schon gedacht, war mir aber nicht sicher,
ob hidden Inputs dafür so konform sind :D
Trotzdem danke!
mfg furien

Edit: Jepjep, hat perfekt geklappt :)
 
Zuletzt bearbeitet:
Werbung:
Zurück
Oben