Schrift
[thread]290[/thread]

Mailmodul: Alternative zu Mime::Lite? (Seite 3)

Leser: 2


<< |< 1 2 3 >| >> 25 Einträge, 3 Seiten
Dubu
 2004-06-13 02:23
#2851 #2851
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
@[E|B]: Hast recht, der Fehler ist mir gar nicht mal aufgefallen.

@jemand: Dann sag uns doch mal, was in dateischreiber.cgi in Zeile 35 steht! (Im Zusammenhang, bitte)
jemand
 2004-06-13 17:18
#2852 #2852
User since
2004-05-14
231 Artikel
BenutzerIn
[default_avatar]
hier ist der ganze dateischreiber so dass der zusammenhang auf jeden fall da ist:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#!Perl -w
##zusatz

use CGI::Carp qw(fatalsToBrowser);

$datens = &CGIDlesen;
%dat = &CGIDaufbereiter($datens);
if($dat{func} eq ''){ first(); }
if($dat{func}eq 'writes'){ writes($dat{datei}); }
if($dat{func} eq 'writed'){ writed($dat{datei}, $dat{text}); }

sub first{
printhead('Datenschreiber');
print 'In welche Datei soll geschrieben werden?<form name="form" method="get" action="dateischreiber.cgi"><input name="datei" size="40"><input type="hidden" name="func" value="writes"><input type="submit" value="Senden"></form>';
printfoot();
}

sub writes{
open(DATEI, "<$_[0]");
@zeilen = <DATEI>;
close(DATEI);
printhead('Datenschreiber');
print 'In der Datei "'.$_[0].'" steht folgendes:<br><br>';
my $i = 0;
foreach(@zeilen){
$i++;
my $einz = $_;
print "$einz".'<br>';
}
print '<br><br>Wollen sie etwas schreiben so geben sie es hier ein:<br><br><form name="form" method="get" action="dateischreiber.cgi"><textarea cols="40" rows="10" wrap=virtual name="text"></textarea><br><input type="hidden" name="func" value="writed"><input type="hidden" name="datei" value="'.$_[0].'"><input type="submit" value="Speichern"><input type="reset" value="Löschen"></form>';
printfoot();
}

sub writed{
open(DATS, ">>$_[0]");
print DATS "$_[1]";
close(DATS);
printhead('Datenschreiber');
$_[1] =~ s/\n/<br>/go;
print '<body><h1>Scheiben erfolgreich!</h1>In die Datei "'.$_[0].'" wurde folgendes geschrieben:<br><br>';
print $_[1];
printfoot();
}

sub CGIDlesen
{
local $cgidaten;
if( $ENV{REQUEST_METHOD} eq 'POST')
{
read(STDIN, $cgidaten , $ENV{'CONTENT_LENGHT'});
}
else
{
$cgidaten = $ENV{QUERY_STRING};
}
return $cgidaten;
}

sub printhead
{
local $title = $_[0];
print "Content-type: text/html\n\n";
print '<html>';
print '<head>';
print '<title>';
print $title;
print '</title>';
print '</head>';
}

sub printfoot
{
print '</body>';
print '</html>';
}

sub CGIDaufbereiter
{
local ($cgidatenskalar, $name, $daten);
local @cgidatenliste;
local %cgidatenhash;
if( $_[0] )
{
$cgidatenskalar = $_[0];
@cgidatenliste = split(/[&;]/ , $cgidatenskalar);
foreach $listeneintrag (@cgidatenliste)
{
$listeneintrag =~ s/\+/ /go;
($name, $daten) = split( /=/ , $listeneintrag );
$name =~ s/\%(..)/pack("c",hex($1))/ge;
$daten =~ s/\%(..)/pack("c",hex($1))/ge;
$cgidatenhash{$name} = $daten;
} }
return %cgidatenhash;
}

war gedacht um zeilenumbrüche erst auf dem server zu ersetzen und nochmal zu schauen ob in der datei das richtige steht und eventuell zu verbessern ohne erst hochladen zu müssen
print uc 'i',chr(29*4).q+'s +.++($_=q-m-),++$_;
print chr for 116,$_[0],97,$_[0],98;
print 'ug,',chr(), scalar reverse qq?!erutaef a s'ti?;
Crian
 2004-06-13 19:04
#2853 #2853
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Müssen wir da jetzt echt bis 35 zählen? oO
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
jemand
 2004-06-13 20:26
#2854 #2854
User since
2004-05-14
231 Artikel
BenutzerIn
[default_avatar]
uups
sub writed entspricht Zeile 34!
also das zwiete open insgesamt
print uc 'i',chr(29*4).q+'s +.++($_=q-m-),++$_;
print chr for 116,$_[0],97,$_[0],98;
print 'ug,',chr(), scalar reverse qq?!erutaef a s'ti?;
Dubu
 2004-06-13 20:37
#2855 #2855
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Perl beklagt sich darueber, dass du ungeprueft Benutzerdaten fuer das open(DATS, ">>$_[0]") in writed() benutzt. Mit dieser Zeile kann ich an jede Datei auf dem Server Daten anhaengen, fuer die der User, unter dem das Skript laeuft, Schreibrechte hat! Und die Funktion writes() reicht mir schon, um mir jede Datei anzeigen zu lassen. (Was Perl zwar per se nicht als unsicher ansieht, aber darueber kann man geteilter Meinung sein.)

Beispiel:
Code: (dl )
http://dein.server.tld/pfad/zum/skript?func=writes&datei=/etc/passwd

Was macht diese URL wohl, wenn der Server unter Linux/Unix laeuft?

Offensichtlich laeuft dein Skript unter Taint-Mode (gut!) und hat deshalb zumindest etwas gehobenere Sicherheitsansprueche.
Abhilfe: Entferne mit einer Regex alles aus den Benutzerparametern, was dort nicht hingehoert, z.B. Pfadangaben.

Noch ein paar Anmerkungen:
- Woher hast du diese Syntax mit "local"? Ersetze bitte alle "local variablenname" durch "my variablenname", falls du nicht ein uraltes Perl (< 5.0) benutzt.
- CGI-Parameter von Hand auszuwerten ist fehlertraechtig. Es gibt CGI.pm, und das ist bei Perl dabei.

Hier mal ein Vorschlag, wie man das mit CGI.pm schreiben koennte:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#!/usr/bin/perl -T

use strict;
use warnings;
use CGI;
use CGI::Carp qw(fatalsToBrowser);

my $FilePath = '/home/username/public_html/files/';
my $Cgi = CGI->new;

my %Dat = $Cgi->Vars;

if (exists $Dat{func} && $Dat{func} eq 'writes') {
   writes ($Dat{datei});
} elsif (exists $Dat{func} && $Dat{func} eq 'writed') {
   writed ($Dat{datei}, $Dat{text});
} else {
   first();
}

sub first{
 printhead('Datenschreiber');
 print $Cgi->p('In welche Datei soll geschrieben werden?'),
   $Cgi->start_form,
   $Cgi->textfield (-name => 'datei', -size => 40),
   $Cgi->hidden (-name => 'func', -default => 'writes'),
   $Cgi->submit (-value => 'Senden'),
   $Cgi->end_form;
 printfoot();
}

sub writes{
 my ($file) = @_;
 if ($file =~ /([.\w-]+)/) {   # nur Folgen von A-Z, a-z, 0-9, ., - oder _ zulassen
     $file = $1;
 } else {
     $file = 'test.dat';       # Fallback
 }

 open(DATEI, '<', $FilePath . $file) or die "Kann Datei $file nicht lesen: $!";
 my @zeilen = <DATEI>;
 close DATEI;

 printhead('Datenschreiber');
 print $Cgi->p("In der Datei $file steht Folgendes:"),
   $Cgi->p(join '<br />', @zeilen);

 print $Cgi->p('Wollen Sie etwas schreiben, so geben Sie es hier ein:'),
   $Cgi->start_form,
   $Cgi->textarea (-name => 'text', -rows => 10, -columns => 40, -wrap => 'virtual'),
   $Cgi->br,
   $Cgi->hidden (-name => 'func', -default => 'writed'),
   $Cgi->hidden (-name => 'datei', -default => $file),
   $Cgi->submit (-value => 'Speichern'),
   $Cgi->reset (),
   $Cgi->end_form;
 printfoot();
}

sub writed{
 my ($file, $text) = @_;
 if ($file =~ /([.\w-]+)/) {   # nur Folgen von A-Z, a-z, 0-9, ., - oder _ zulassen
     $file = $1;
 } else {
     $file = 'test.dat';       # Fallback
 }

 open(DATS, '>>', $FilePath . $file) or die "Kann Datei $file nicht schreiben: $!";
 print DATS $text;
 close(DATS);
 printhead('Datenschreiber');
 $text =~ s/\n/<br>/g;
 print $Cgi->h1("Schreiben erfolgreich!"),
   $Cgi->p("In die Datei $file wurde Folgendes geschrieben:"),
   $Cgi->p($text);
 printfoot();
}

sub printhead
{
 my ($title) = @_;
 print $Cgi->header(),
   $Cgi->start_html($title);
}

sub printfoot
{
 print $Cgi->end_html;
}


Ob man CGI.pm auch fuer den HTML-Code benutzt ist Geschmackssache, aber zumindest fuer Header und Formulare ist es anzuraten.
<< |< 1 2 3 >| >> 25 Einträge, 3 Seiten



View all threads created 2004-06-11 00:26.