Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [CGI] Zeile an Datei anhängen (https://www.delphipraxis.net/14684-%5Bcgi%5D-zeile-datei-anhaengen.html)

Luckie 14. Jan 2004 04:28


[CGI] Zeile an Datei anhängen
 
Hallo. Ich habe mir das mit meiner HP ja schon realtiv einfach gemacht. Ich lasse die Seiten eigentlich weitgehen vom Apache Server selber generieren. Besonders deutlich wird das wohl hier: www.luckie-online.de/downloads . Die Tabelle wird automatisch vom Server generiert. Man kann sie mittels einer .htaccess-datei noch etwas formatiren. Für den Ordner sähe das ungefähr so aus:
Code:
FancyIndexing on

IndexOptions NameWidth=25 DescriptionWidth=500 IconHeight=15 IconWidth=15 SuppressHTMLPreamble FoldersFirst
IndexIgnore license.txt *.exe
HeaderName /includes/headdownloads.shtml
ReadmeName /includes/foot.html

AddIcon /pics/folder.png screenshots

AddDescription "Screenshots der Programme" screenshots
AddDescription "Spielt MP, OGG und CDA Formate ab. Mit Playliste. [unfertig]" AudioPlayer*.zip
So, um das ganze jetzt noch etwas bequemer für mich zu machen und um eventuell von wo anders Dateien von mir hochladen zu können, habe ich mir ein CGI-Script geschrieben, welches für mich einen Web-Upload macht. Geht auch schon ganz gut, die Datei landet da wo sie hin soll:
Code:
#!/usr/bin/perl -w

use strict;
use CGI; # Modul fuer CGI-Programme

my $cgi = new CGI; # neues Objekt erstellen

# die datei-daten holen
my $file = $cgi->param("myfile");
my $dir = $cgi->param("dir");
my $comment = $cgi->param("comment");

# Content-type fuer die Ausgabe
# print $cgi->header(-type => 'text/html');

# dateinamen erstellen und die datei auf dem server speichern
my $fullpath = $cgi->param("myfile");
my $index = rindex($fullpath, "\\");
my $filename = substr($fullpath, ($index + 1));
my $fname = lc('../'.$dir.'/'.$filename);
open DAT,'>'.$fname or die 'Error processing file: ',$!;

# Dateien in den Binaer-Modus schalten
binmode $file;
binmode DAT;

my $data;
while(read $file,$data,1024) {
  print DAT $data;
}
close DAT;

my $databasefile = '.htaccess';
my $newline = 'AddDescription "'.$comment.'" '.$filename;
open(FILE, "'../'.$dir.'/'.$databasefile") || die Can't locate database file $!;
print FILE "\n$newline";
close(FILE);

print "Content-Type: text/html\n\n";
print "<head><title>Homepage von Michael Puff - Datei-Uploadbestätigung</title></head>";
print "<html><body>";
print "<h1>Datei-Uploadbestätigung</h1>";
print "<hr>";
print "Datei [b]".$filename."[/b] erfolgreich nach [b]http://www.luckie-online.de/".$dir."/[/b] hochgeladen.

";
print "<a href=\"http://www.luckie-online.de/sitemanager\">Zurück</a>";
print "</body></html>";
Das einzige woran es hapert ist das Hinzufügen der Beschreibung in der .htaccess-Datei. Und das darf natürlich nur geschehen, wenn es sie auch wirklich gibt, nicht in allen Verzeichnissen habe ich eine. Der Upload geht, wie gesagt, nur danach bekomme ich einen Fehler 500 vom Server. Syntaktisch ist das Script OK, das habe ich schon geprüft. Ich nehme mal stark an, es liegt am Pfad zur .htaccess-Datei. Nur leider weiß ich nicht, wie ich das debuggen kann.

Ich habe es auch schon so probiert:
Code:
my $databasefile = '../'.$dir.'/.htaccess';
my $newline = 'AddDescription "'.$comment.'" '.$filename;
#open(FILE, "$databasefile") || die Can't locate database file $!;
#print FILE "\n$newline";
#close(FILE);

print $databasefile;
print "Content-Type: text/html\n\n";
print "<head><title>Homepage von Michael Puff - Datei-Uploadbestätigung</title></head>";
...;
Aber ich bekomme den Wert von $databasefile gar nicht zu sehen, da vorher schon der Fehler 500 vom Server kommt.

Wer kann mir helfen, das Problem zu lösen. Ich muss dazu sagen, dass ich nicht sehr viel von CGI/Perl verstehen, das habe ich mir so alles zusammengeklaut. Es wäre also ganz nett, wen mir da jemand die entsprechenden Zeilen korrigieren könnte, ich habe nämnlich nicht vor wegen diesem einem Script die ganze Sprache zu lernen. :roll: Danke schon mal im voraus.

Luckie 14. Jan 2004 04:39

Re: [CGI] Zeile an Datei anhängen
 
So, habe es jetzt soweit. Mit:
Code:
my $databasefile = 'http://www.luckie-online.de/'.$dir.'/.htaccess';
my $newline = 'AddDescription "'.$comment.'" '.$filename;
#open(FILE, "$databasefile") || die Can't locate database file $!;
#print FILE "\n$newline";
#close(FILE);

print "Content-Type: text/html\n\n";
print "<head><title>Homepage von Michael Puff - Datei-Uploadbestätigung</title></head>";
print "<html><body>";
print "<h1>Datei-Uploadbestätigung</h1>";
print "<hr>";
print $databasefile."
";
print $newline."
";
Gibt er mir aus:
Zitat:

http://www.luckie-online.de/downloads/.htaccess
AddDescription "dfydsf" Luckie.bmp
Aber so bald ich diese Zeile
Code:
open(FILE, "$databasefile") || die Can't locate database file $!;
Mit reinnehme kommt der Serverfehler, obwohl der Pfad doch stimmt. :gruebel:

Luckie 14. Jan 2004 07:38

Re: [CGI] Zeile an Datei anhängen
 
So bin wieder etwas weiter:

Can't locate object method "database" via package "file" (perhaps you forgot to load "file"?) at uploadfile.cgi line 36.

Sagt er mir jetzt.

Code:
my $databasefile = 'http://www.luckie-online.de/'.$dir.'/.htaccess';
my $newline = 'AddDescription "'.$comment.'" '.$filename;
open(FILE, "$databasefile") || die Can't locate database file $!;
print FILE "\n$newline";
close(FILE);
Zeile 36 ist die Zeile mit open. Was bedeutet das denn jetzt?

MathiasSimmack 14. Jan 2004 08:05

Re: [CGI] Zeile an Datei anhängen
 
Ich glaube, du musst den echten Pfad angeben. Und der ist auf dem Linux-Server ja nicht "http://www." sondern so was wie "/docs/www" o.ä. Kommt auf den Hoster an. Evtl. mal nachfragen.

Ich glaube irgendwie nicht, dass man mit einem HTTP-Zugriff an die ".htaccess" rankommt. Wenn ja, dann wäre das eine Möglichkeit, die Datei z.B. runterzuladen und die Benutzernamen zu erfahren. Ob man das Pwd knacken kann oder nicht, spielt keine Rolle. Wenn man überhaupt an die Datei rankommt (und bspw. seinen eigenen Benutzer anhängt), dann wäre das ein echtes Sicherheitsproblem.

Luckie 14. Jan 2004 08:20

Re: [CGI] Zeile an Datei anhängen
 
Hm. hast irgendwie recht. Wäre auch zu schön gewesen. :?

MathiasSimmack 14. Jan 2004 08:47

Re: [CGI] Zeile an Datei anhängen
 
Upps, ich meine natürlich die ".htpasswd", die die Benutzernamen und Passworte enthält. Aber das Prinzip dürfte auch bei der ".htaccess" das gleiche sein. Guck doch mal, ob du mit dem kompletten Pfad was anfangen kannst.

Wenn du die beiden Dateien für den Verzeichnisschutz nimmst, dann enthält doch die ".htaccess" den kompletten Pfad zur ".htpasswd". Versuche doch mal "$database" mit diesem Pfad und dem Namen ".htaccess" zu füttern. Evtl. geht´s ja dann.

Luckie 14. Jan 2004 09:20

Re: [CGI] Zeile an Datei anhängen
 
Code:
#!/usr/bin/perl -w

use strict;
use CGI; # Modul fuer CGI-Programme
use CGI::Carp qw(fatalsToBrowser);

my $cgi = new CGI; # neues Objekt erstellen

# die datei-daten holen
my $file = $cgi->param("myfile");
my $dir = $cgi->param("dir");
my $comment = $cgi->param("comment");

# Content-type fuer die Ausgabe
# print $cgi->header(-type => 'text/html');

# dateinamen erstellen und die datei auf dem server speichern
my $fullpath = $cgi->param("myfile");
my $index = rindex($fullpath, "\\");
my $filename = substr($fullpath, ($index + 1));
my $fname = '../'.$dir.'/'.$filename;
open DAT,'>'.$fname or die 'Error processing file: ',$!;

# Dateien in den Binaer-Modus schalten
binmode $file;
binmode DAT;

my $data;
while(read $file,$data,1024) {
  print DAT $data;
}
close DAT;

my $haccessfile = '../'.$dir.'/.htaccess';
my $newline = 'AddDescription "'.$comment.'" '.$filename;
open(FILE, "$haccessfile") || die 'Cannot locate database file: '. $haccessfile.'!';
print FILE "\n$newline";
close(FILE);

print "Content-Type: text/html\n\n";
print "<head><title>Homepage von Michael Puff - Datei-Uploadbestätigung</title></head>";
print "<html><body>";
print "<h1>Datei-Uploadbestätigung</h1>";
print "<hr>";
print $haccessfile."
";
print $newline."
";
print "Datei [b]".$filename."[/b] erfolgreich nach [b]http://www.luckie-online.de/".$dir."/[/b] hochgeladen.

";
print "<a href=\"http://www.luckie-online.de/sitemanager\">Zurück</a>";
print "</body></html>";
So geht es fehlerfrei. Nur wird die Zeile nicht an die .htaccess Datei angehangen.

choose 14. Jan 2004 09:31

Re: [CGI] Zeile an Datei anhängen
 
Wenn Du den absoluten Pfad aus sicht des Interpreterprozesses angegeben hast und Du die Datei trotzdem nicht verändern kannst, könnte es noch an den Benutzerrechten liegen.
Ich bin mir nicht sicher, in welchem Kontext Dein CGI-Modul ausgeführt wird, hielte es aber für kritisch, wenn das standardmäßig root-Rechte währen... Vielmehr wird das ein spezieller Indianer-User sein, für den zu klären ist, ob er Schreibrechte an Deiner .htaccess besitzt.

BTW: Es ist defnitiv nicht vorgesehen, dass die .htaccess "von außen" gelesen oder verändert werden kann.

choose 14. Jan 2004 09:43

Re: [CGI] Zeile an Datei anhängen
 
Es ist etwas her, dass ich Perl geschrieben habe, aber überprüfe einmal, ob close fehlerfrei durchgeführt wird.
Darüber hinaus solltest Du die Datei exklusiv (flock) und war da nicht auch was mit ">>", wenn Du Dateien anhängen willst?
Der folgende Code ist nicht getestet:
Code:
open (FILE,">>$filename")|| die "error opening file"
flock(FILE, LOCK_EX) || die "error locking file"
# maybe someone edited the file while waiting...
seek(FILE, 0, 2);

print FILE "$line\n";

flock(FILE, LOCK_UN);
close (FILE);
Eine gute Einführung in die Perl-Funktionen findest Du bei SELFHTML.

Alibi 14. Jan 2004 12:13

Re: [CGI] Zeile an Datei anhängen
 
Sehr zu empfehlen als Referenz ist "Programmieren mit Perl":
http://www.amazon.de/exec/obidos/ASI...777269-6890460
Und als Einstieg:
http://www.amazon.de/exec/obidos/ASI...777269-6890460


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:35 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz