Zugriffsrechte beim Fileupload in PHP

waldjunge

Grünschnabel
Guten Morgen,

ich habe auf meiner Homepage einen Fileupload eingebaut.Dieser funktioniert bisher eigentlich problemlos. Aber ich habe Spamm Probleme bei dem Ordner in den ich die Uploads zulasse.
Die Uploadfunktion steht nur eingeloggten (vertrauenswürdigen) Usern zur Verfügung. Von denen kommt der Spamm also sicher nicht.
Damit der Upload richtig läuft, muss ich die Berechtigung des Ordners in den ich hochlade auf 777 setzen, sonst bekomme ich eine Fehlermeldung.
Genau hier liegt wohl auch das Problem mit dem Spamm. So kann mir jeder seine Dateien in den Ordner schieben.

Kann mir jemand von euch eine Möglichkeit sagen wie ich das verhindern kann?

Wenn ich das richtig verstehe liegt es an der verwendeten Funktion move_uploaded_file.
Diese wirft bei mir nur dann keinen Fehler, wenn die Berechtigungen des Ordners, in den geuploadet werden soll, wirklich auf 777 stehen.


Hier mal mein Code:


PHP:
<?php
	if (logged_in()) {
		if(isset($_POST['submit'])){ 
			upload();
		}else{
			?>
			<form action="index.php?page=upload&submit=true" method="post" enctype="multipart/form-data">
				<input type="file" name="datei" tabindex="1"><br/><br/>
				<input name="submit" type="submit" id="submit" tabindex="2" value="Hochladen">
			</form>
			<?php
		}
	}else{
		?>
			<p>
				<b>Bitte einloggen...</b><br /><br />
				Sorry, nur Members k&ouml;nnen Dateien Uploaden!
			</p>
			<br />

		<?php
	}
?>

die upload Funktion:

PHP:
	if($_FILES['datei']['size'] <  10240000){
		move_uploaded_file($_FILES['datei']['tmp_name'], "uploads/".$_FILES['datei']['name']);
		$filename= $_FILES['datei']['name'];
		logUpload($filename);
		echo "<p>Die Datei wurde Erfolgreich nach uploads/".$_FILES['datei']['name']." hochgeladen</p>";
	}else{
        	echo "<p>Die Datei darf vorerst nicht größer als 10 mb sein </p>";
	}

Im Netz gibt es genug tutorials zu Fileuploads. Davon hab ich mir auch schon einige angeschaut. Mein "Fehlerabfang" könnte sicherlich besser sein, aber mir geht es um die Zugriffsberechtigung des Uploadordners und dazu konnte ich leider nichts brauchbares finden.

Es wäre nett, wenn sich jemand einen Augenblick für mich Zeit nehmen würde, um mir zu helfen, das Problem zu lösen.

Vielen Dank,
waldjunge :)
 
Prüfst du denn bei deiner Upload-Funktion auch irgendwo, ob man eingeloggt ist...das ist aus dem Code nicht ersichtlich.
 
Erst einmal danke für die Reaktion.

Zu deiner Frage:
Ja und nein.

In der upload Funktion prüfe ich das nicht. Aber bevor das upload Formular angezeigt wird, bzw. die upload Funktion aufgerufen wird, prüfe ich den Login.

PHP:
<?php 
    if (logged_in()) { // hier wird geprüft ob der User überhaupt eingeloggt ist und die Funktion funktioniert meines erachtens auch.
        if(isset($_POST['submit'])){  
            upload(); 
        }else{ 
            ?> 
            <form action="index.php?page=upload&submit=true" method="post" enctype="multipart/form-data"> 
                <input type="file" name="datei" tabindex="1"><br/><br/> 
                <input name="submit" type="submit" id="submit" tabindex="2" value="Hochladen"> 
            </form> 
            <?php 
        } 
    }else{ 
        .... // kein member
    }
 
Kannst du zeigen was logged_in() macht?

Ausserdem wäre es vielleicht eine Idee wenn du hier:
PHP:
move_uploaded_file($_FILES['datei']['tmp_name'], "uploads/".$_FILES['datei']['name']);
überprüfst ob jemand eingeloggt ist. Also zusätzlich.
Zum Beispiel
PHP:
        if ( logged_in () )
        {
            move_uploaded_file($_FILES['datei']['tmp_name'], "uploads/".$_FILES['datei']['name']);
        }
 
Hier ist der Code der funktion logged_in:

PHP:
<?php
function logged_in()
{ 
    $sql="SELECT UserId 
    FROM tblUsers 
    WHERE UserSession='".addslashes(htmlspecialchars(session_id()))."' 
    LIMIT 1"; 
    $result= mysql_query($sql); 
    return ( mysql_num_rows($result)==1); 
} 
?>

nach einem erfolgreichen Login speichere ich die aktuelle Session eines Users in meine DB. Logged_in() prüft dann, ob die aktuelle Session die selbe ist, wie die in der DB.

Die erneute Prüfung des Login innerhalb der upload Funktion ist keine schlechte Idee, hätte ich früher drauf kommen können. :D
Werde das auf jeden Fall noch einbauen. Vieleicht hilft es ja und genau da lag der Fehler.

Aber meine Vermutung ist, dass es an keiner der Funktionen liegt, sondern an den Berechtigungen des Upload Ordners. Die Spammfiles werden wohl nicht über die upload Funktion in meinen Ordner gespeichert, sondern von auserhalb.
Gibt es keine Möglichkeit von einer Website aus Dateien hoch zu laden, ohne die Berechtigungen auf 777 zu stellen?

Gruß waldjunge
 
Test mal bitte auch folgendes:
PHP:
function logged_in()
{ 
    $sql="SELECT UserId 
    FROM tblUsers 
    WHERE UserSession='".addslashes(htmlspecialchars(session_id()))."' 
    LIMIT 1"; 
    $result= mysql_query($sql); 
    
    if ( mysql_num_rows ( $result ) == 1 )
    {
        return TRUE;
    } else
        {
            return FALSE;
        }
}  
// Und dann so abfragen:
if ( logged_in() == TRUE )
 
Danke für die erneute Antwort.

Das ist jetzt nicht böse gemeint, also bitte nicht falsch verstehen. Ich bin ja froh, dass du dich bemühst, mir zu helfen.

Aber macht dein Code nicht absolut genau das selbe wie meiner, nur ist deiner vieleicht etwas länger und dafür besser zu verstehen? :confused:
 
Hi,
mal eine kurze Rückmeldung von mir.
Ich habe vorgestern abend, nachdem ich hier gepostet habe, die Logginprüfung zusätzlich in die upload() Funktion eingebaut.
Bisher kam kein Spamm durch. Es scheint also wirklich daran gelegen zu haben.
Ich werde das im Auge behalten und wenn in ein oder zwei Tagen immer noch alles sauber ist, gebe ich euch nochmal eine Rückmeldung. Dann kann man hier dicht machen.

Nochmal vielen Dank für eure Hilfe :)
 
Inzwischen sind einige Tage vergangen.
Leider ist der Spamm wieder aufgetaucht. Die zusätzliche Prüfung des Loginstatus innerhalb der upload Funktion hat also leider nichts gebracht :(

Hat noch jemand eine Idee oder Vorschläge?

Gruß waldjunge
 
Hast du mal in den Serverlogfiles gecheckt, ob die Files wirklich über den Aufruf dieser Seite kommen?
Wenn jemand sich den Login eines Users besorgt hat, was, wenn er dort schonmal ein PHP File hochgeladen hatte welches ausführbar war kein großes problem darstellt, bringt dir die login-Prüfung herzlich wenig.
Kannste mal den Code zeigen, wo du die Logins ablegst? Vielleicht ist da auch 'nen Loch.
 
Zurück