PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Dateiname in include-datei nicht bekannt



Spreeatom
18-03-2005, 16:06
Hallo zusammen,

ich möchte 3 Dateien hochladen, die mittels HTML- Form ausgewählt werden.
Diese Dateien will ich vor dem Hochladen auf Gültigkeit überprüfen( format, größe).

ich habe dazu in der Datei, die nach drücken des "submit" Buttons aufgerufen wird, eine Datei folgender maßen includiert:


include("library/check.php");

In der Datei check.php ist dann die Funktion:

function checkFile( $file ) {

Aber $file ist ohne Inhalt!

Augerufen wird die Funktion folgendermaßen von mir:


checkFile( $datei_1 )


In der von Submit aufgerufenen Datei haben folgende Aufrufe noch Erfolg:


$type = $_FILES['datei_1']['type'];
echo "Type : $type";


Ja, woran liegt es das ich in checkFile() kein Ergebnis bekomme?

Vielen Dank

Pingu
18-03-2005, 17:10
Zum lösen Deiner Probleme würde ich mir an Deiner Stelle folgende Fragen stellen und versuch sie für mich selbst zu beantworten, um damit auf den richtigen Lösungsweg zu kommen.

Ist denn die Variable $datei_1 gesetzt?
Wenn ja: Was steht drin?
- Steht das richtige drin? Was ist das richtige?

Wenn nein: Warum ist sie nicht gesetzt? Wer ist eigentlich für das Setzten dieser Variablen zuständig? Muß vielleicht ich die Variable setzen, z. B. durch $datei_1 = $_FILES["datei_1"]?

Wenn bei $datei_1 alles richtig ist: Was mach die Funktion checkFile() mit den übergebenen Daten?


Das sind alles Fragen die sich jeder Programmierer selber stellen sollte. Die wir Dir nicht beantworten können. Warum? Weil wir 1. Deine Konfiguration nicht kennen (ich sage mal: register_globals). 2. Nicht wissen wie Du Deine Daten sendest (ich sage mal: HTML-Source). 3. Nicht wissen wie Du Deine Daten weiter verarbeitest (ich sage mal: PHP-Source). 4. Ich es langsam leid bin, daß jeder Hilfe möchte aber alle Information nur häppchenweise zur Verfügung stellt und sich keine Gedanken macht wie andere ein Problem analysieren sollen, wenn sie nur weniger als die Hälfte der Daten zur Analyse haben.

Pingu

Spreeatom
18-03-2005, 17:50
Du wirst es kaum glauben, aber die Fragen habe ich mir alle schon gestellt!
Bin aber zu keiner Lösung gekommen, so dass ich um Hilfe gebeten habe.

Die Variabele $datei_1 hat Inhalt. Sonst würde ich ja kein Ergebniss bei den Aufrufen

$type = $_FILES['datei_1']['type'];
echo " Type : $type\n <br> ";

bekommen.
Die Ausgabe lautet hier: "Type: /image/jpeg"

Problem ist halt wenn ich das selbe in checkFiles() mache, bekomme ich keine
Ergebnisse bei 'echo'.
Die Funktion rufe ich bekanntermaßen so auf: checkFiles( $datei_1 );

Und checkFiles() ist halt nicht in der Datei die duch das abschicken des HTML-Formulars aufgerufen wird. <form ACTION="send.php" ... >

Und da ich in send.php Ergebnisse bekomme ist register_globals auch auf on.
Meine Php Version ist 4.3.6.

Sorry, wenn ich mich nicht klar genug ausgedrückt habe...

rkauskh
18-03-2005, 18:47
Hi

Achtung: Amatuer beim wilden Spekulieren!!!

Du deklarierst die Funktion checkfile und sagst sie erwartet $file als Parameter/Argument. Beim Aufruf gibst du ihr aber $datei_1. $file muss also leer sein. Soll als Ergebnis von checkfile das Ergebnis als $file zurückgegeben werden?
Ich würde sagen dann muß es so aussehen:

function checkFile( $datei_1 ) {
dann den abzuarbeitenden Code und zum Schluß

return $file;
Den Aufruf so lassen wie er ist.

MfG
rk

Spreeatom
18-03-2005, 19:36
Mit
function checkFile( $datei_1 )
in der Deklaration funktioniert es.

OK. - globale Variable und so...
So funktioniert es ja auch ohne $datei_1 im Funktionskopf...


Aber so kann ich mir die Sache auch sparen, da ich jede der drei Dateien in ein und der selben Funktion auf Gültigkeit hin überprüfen möchte.


Gibt es den keine Möglichkeit in PHP, dass ich den Inhalt von $datei_1 (respektive 2 & 3 ) an checkFile() übergeben kann. -
Die Funktion die Datei untersucht und dann entweder ein True oder ein False zurückgibt? Ich dachte bisher immer, dass man den Inhalt von Varaiabeln hin und her kopierern kann so oft man möchte ( Wenn man will versteht sich ) oder geht das nur in diesem Fall nicht weil ich hier mit
$_FILES arbeite bzw einem Dateinamen aus einem HTML Formular nutze.

Vielecht kann ja jemand einen "Amateur" unter die Arme greifen?

Danke

rkauskh
18-03-2005, 20:28
Hi

Sind es immer 3 Dateien? Dann könnte man ja der Einfachheit halber

function checkFile( $datei_1, $datei_2, $_datei3 )
schreiben und somit alle 3 als Argument übergeben. Die Prüfung in eine Schleife setzen und $file1, $file2, $file3 mit return zurückgeben.
Oder wenn checkfile ($file) für $datei_1 true ist erfolgt der zweite Schleifendurchlauf, wenn $file bei $datei_2 true ist der dritte und wenn der dritte Durchlauf auch true ergibt wird die Schleife beendet und $file zurückgegeben. Wenn $file dann true ist verliefen alle 3 Prüfungen erfolgreich, sonst paßt was nicht.
So, und wenn ich Ahnung hätte, würde nicht so eine alberne Beschreibung, sondern fertiger Code da stehen.

MfG
rk

Pingu
19-03-2005, 22:48
Gibt es den keine Möglichkeit in PHP, dass ich den Inhalt von $datei_1 (respektive 2 & 3 ) an checkFile() übergeben kann. -
Doch das geht. Aber wie gesagt :rolleyes: :

Wenn bei $datei_1 alles richtig ist: Was mach die Funktion checkFile() mit den übergebenen Daten?

Übrigens ich habe von Dir immer noch keinen Code gesehen (insbesondere der Funktion checkFile() ), bis auf wie Du die Funktion aufrufst. Aber ich kann ja mal meine Glaskugel heraus holen, vielleicht steht das da alles drin.

Pingu

Spreeatom
20-03-2005, 13:33
Erstmal sorry für meine deletantischen Informationen. Verspreche Besserung!

1. Es ist mindestens eine Datei und höchstens drei Dateien die hochgeladen werden sollen.
Ja und wie gesagt, wenn ich mit der globalen Variabel arbeite, kann ich es auch
ohne $datei_1 im Funktionskopf gestalten. So funktioniert es dann auch:


function checkFile( )

Sieht wohl so aus, dass ich es auch so machen werde. Also in CheckFile() einfach prüfen, ob der Dateiname gesetzt ist und dann auf Gültigkeit hin überprüfen.

Für mich als PHP Anfänger ist jetzt nur interessant, wieso es nicht
mit Paramterübergabe klappt.



2. Ja und wenn wen Pingu in seine Glaskugel schaut, sollte er folgendes sehen:

Der Aufruf in der nach "submit" aufgerufenen Datei:


if( $datei_1 != "" ) {
if( checkFile( $datei_1 ) )
uploadFile( $datei_1 );
}


Die Funktion checkFile() :



function checkFile( $file ) {

$type = $_FILES['datei_1']['type'];
$size = $_FILES['datei_1']['size'];

echo " SIZE : $size\n <br> ";
echo " TYPE : $type\n <br> ";


if( $type != "image/gif" && $type != "image/jpeg") {
echo "Nur .gif und .jpg Dateien erlaubt!";
return 0;
}


if( $size > "200000" ) {
echo "Die Datei ist zu gross!<br>
Maximale Dateigrosse beträgt 200 KB!";
return 0;
}

return 1;
}





Wie gesagt $file ist leer bzw. nicht gesetzt. Woran liegt es?
Diese Beispiel funktioniert




$text ="hello World \n";
checkFile( $text )

function checkFile( $file ) {

echo $file;
}



Ausgabe: hello World.


Vielen dank nochmals für eure Ausdauer!

Pingu
20-03-2005, 16:52
Das ist doch mal etwas womit man etwas anfangen kann.

Nach dem nochmaligem Durchlesen ist meine Vermutung, daß "register_globals" ausgeschaltet (wie es auch sein sollte). Wissen kannst natürlich nur Du es und überprüfen ganz einfach mit .... phpinfo();

Warum meine Vermutung? Weil Du gesagt hast, daß der Zugriff mit $_FILES funktioniert jedoch nicht funktioniert wenn Du die Variable $datei_1 übergibst.

Dabei stellt sich mir gleich die Frage: Warum Du überhaupt versuchst den Zugriff über die Super-Globals zu vermeiden?
Naja, seis drum.

Jedenfalls würde ich an Deiner Stelle die Übergabe mit der Super-Globalen machen, also:

checkFile ($_FILES["datei_1"]);

Dann solltest Du natürlich auch in der Funktion mit der richtigen Variablen arbeiten, also:

function checkFile( $file ) {

$type = $file['type'];
$size = $file['size'];

echo " SIZE : $size\n <br> ";
echo " TYPE : $type\n <br> ";


if( $type != "image/gif" && $type != "image/jpeg") {
echo "Nur .gif und .jpg Dateien erlaubt!";
return 0;
}


if( $size > "200000" ) {
echo "Die Datei ist zu gross!<br>
Maximale Dateigrosse beträgt 200 KB!";
return 0;
}

return 1;
}

Dann sollte es natürlich auch mit den anderen Dateien funktionieren, also:

checkFile($_FILES["datei_2"]);
checkFile($_FILES["datei_3"]);

Pingu

Spreeatom
20-03-2005, 17:33
Yes Mann,

das war es:

checkFile( $_FILES["datei_1"] )


Es hat also mur an $_FILES[...] gelegen.
habe auch kein Problem mit ner globalen Variable zu arbeiten.
Möchte nur jede Datei in ein und der selben Funktion überprüfen.

Bin als Anfänger nur davon ausgegegangen, dass wenn $datei_1 in der von
'submit' aufgerufenen Datei gesetzt ist, ich auch so ohne weiteres
checkFile( $datei_1 ) aufrufen kann. Aber so kann man sich täuschen...

Also:
if( $datei_1 != "" ) {

ist hier True! bzw. wie beschrieben , die selben Kontrollanweisungen in dieser Datei haben auch Ergebnisse gebracht. Was vermutlich auch Indiz darauf ist, dass register_globals=On ist. Aber korrigiere mich wenn nötig.

Vielen Dank für deine Hilfe! :)

Pingu
20-03-2005, 17:45
Bin als Anfänger nur davon ausgegegangen, dass wenn $datei_1 in der von
'submit' aufgerufenen Datei gesetzt ist,
Sorry, aber den Satz verstehe ich nicht.

ich auch so ohne weiteres
checkFile( $datei_1 ) aufrufen kann. Aber so kann man sich täuschen...
Wenn die Variable gesetzt ist, geht auch dieser Aufruf.


Also:
if( $datei_1 != "" ) {

ist hier True!
Egal wie man es betrachtet, das ist richtig. Wenn die Variable durch einen Fileupload richtig gesetzt ist, ist diese Aussage richtig, da dann die Variable ein Array ist udn ein Array ist ungleich "". Auch Wenn die Variable nicht gesetzt ist, ist diese Aussage richtig, denn eine nicht gesetzte Variable ist ebenso ungleich "".

bzw. wie beschrieben , die selben Kontrollanweisungen in dieser Datei haben auch Ergebnisse gebracht. Was vermutlich auch Indiz darauf ist, dass register_globals=On ist. Aber korrigiere mich wenn nötig.
Wozu brauchst Du Indizien. Warum schaust Du nicht einfach nach? Erster Punkt wo es steht ist die php.ini. Es könnte beim Indianer (Apache) aber auch zentral in der httpd.conf und auch lokal in einer .htaccess entsprechend gesetzt sein. Jedenfalls, die einfachste Überprüfung ist immernoch phpinfo(); (http://www.php.net/phpinfo) Nicht umsonst werden da alle Konfigurationsoptionen aufgeführt.

Pingu

Spreeatom
20-03-2005, 18:06
Also register_globals ist ON!

Aber mir ist beim posten meiner checkFile() Funktion ein Fehler unterlaufen.
War noch Testcode unter Verwendung der globalen Variabel.

So war es gedacht und so funktioniert es nicht:



function checkFile( $file ) {



$type = $_FILES['file']['type'];
$size = $_FILES['file']['size'];

echo " SIZE : $size\n <br> ";
echo " TYPE : $type\n <br> ";


if( $type != "image/gif" && $type != "image/jpeg") {
echo "Nur .gif und .jpg Dateien erlaubt!";
return 0;
}


if( $size > "200000" ) {
echo "Die Datei ist zu gross!<br>
Maximale Dateigrosse beträgt 200 KB!";
return 0;
}

return 1;
}


ob nun mit dem Aufruf



checkFile( $_FILES["datei_1"] )


der dem:



checkFile( $datei_1 )


JA woran liegt es?

Pingu
20-03-2005, 18:39
Das kann ja auch nicht gehen.

Vielleicht machst Du Dich allgemein noch einmal mit der Definition von Funktionen vertraut.

In der Deklaration Deiner Funktion steht:
function checkFile( $file ) D. H. bei Aufruf der Funktion, kannst Du eine Variable übergeben. Die Daten dieser Variablen werden innerhalb der Funktion über die Variable $file referenziert. Die Variable $file benutzt Du aber gar nicht in Deiner Funktionen. Dort greifst Du nur auf eine Array-Element (speziell das Element mit dem Schlüssel "file") der Super-Globalen $_FILES zu. Dieses Array-Element existiert wahrscheinlich gar nicht. Also ist auch nichts gesetzt.

Unabhängig davon rate ich Dir sofort register_globals auszuschalten, da dies bei schlechter Programmierung und bei jedem Anfänger eigentlich nur ein Sicherheitsrisiko ist. Wenn Du schon programmieren lernst, dann gleich richtig und das heißt nun mal: register_globals = off.

Pingu

Spreeatom
20-03-2005, 19:26
Habe mich mal mit der Deklaration von Arrays in PHP auseinandergesetzt und
meine Lösung gefunden!

Der Funktionsaufruf:


checkFile( $_FILES["datei_1"] );


Die Funktion:



function checkFile( $file ) {

$type = $file['type'];
$size = $file['size'];



if( $type != "image/gif" && $type != "image/jpeg") {
echo "Nur .gif und .jpg Dateien erlaubt!";
return 0;
}


if( $size > "200000" ) {
echo "Die Datei ist zu gross!<br>
Maximale Dateigrosse beträgt 200 KB!";
return 0;
}


return 1;
}



Ich würde mal sagen Ende gut alles gut.

Aber mit dem "Ausschalten" von register_globals kann ich mich nicht
einverstanden erklären....


Wünsche eine angenehme Woche

Pingu
20-03-2005, 19:44
Aber mit dem "Ausschalten" von register_globals kann ich mich nicht
einverstanden erklären....
Dann lies Dir das Manual durch: http://de2.php.net/manual/de/security.globals.php

Oder auf Deine Anwendung gemünzt. Was machst Du wenn Du $datei_1 anstatt von $_FILES["datei_1"] verwendest und ich Dir folgenden Aufruf unterjubel:

script.php?datei_1[tmp_name]=/etc/passwd&datei_1[name]=mein.spezielles.jpg&datei_1[type]=image/jpeg&datei_1[size]=5
oder

script.php?datei_1[tmp_name]=./.htaccess&datei_1[name]=mein.spezielles.jpg&datei_1[type]=image/jpeg&datei_1[size]=5

Wobei der genau Pfad läßt sich immer durch herausprobieren herausfinden.

Wenn Du jetzt sagst, daß Du eh $_FILES["datei_1"] nimmst, dann sage ich Dir, daß Du auch kein register_globals=on brauchst.

Pingu

EDIT: Zusammengfasst kann ich zu register_globals nur eines sagen: Wer schlechten Code schreibt, braucht unbedingt register_globals=off, um wenigstens vor den gröbsten Fehlern geschützt zu sein. Wer sauberen Code schreibt, braucht auch kein register_globals=on. Auf der anderen Seite, wer sagt, er braucht register_globals=on, der schreibt auch schlechten Code.

Glow
04-04-2005, 17:44
Du schaffst dir UNGLAUBLICHE Sicherheitslücken, wenn du einfachso mit Globalen um dich herumschmeisst!

Bei dir möchte ich kein Passwort liegen haben und deine Scripte würde ich auch sehr einfach missbrauchen können (auf einmal hast du 1000 Posts im Gästebuch, etc.)