Schrift
[thread]7083[/thread]

Merkwürdige Einträge im Error Log.



<< |< 1 2 >| >> 14 Einträge, 2 Seiten
cbxk1xg
 2005-06-28 18:19
#55774 #55774
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
Hallo Freunde der Sonne!

Ich dachte eigentlich das ich mit -T, strict und warnings auf der sicheren Seite sein sollte. Was die Ausführung des Skripts betrifft, stimmt das auch. Der Interpreter beschwert sich nicht. Daher dachte ich, es ist alles in Ordnung. Nach dem ich gerade mal das Error Log des Servers aufgerufen habe, bin ich mir da nicht mehr so sicher.

Eigentlich sollte innerhalb einer SUB eine Vordeklarierung mit my doch eigentlich dafür sorgen, dass alles glatt geht, oder? Stattdessen spammed mir Perl das Error Log voll.

Das man das Parsen auch eleganter mit einem Modul, lösen kann, weiss ich. Darum geht es aber nicht. Die Fehlermeldungen ziehen sich durch das ganze Skript. Diese Sub ist nur wesentlich übersichtlicher als die anderen.

Hat jemand eine Idee, was das verursacht???

Code: (dl )
1
2
3
4
5
6
7
8
9
10
# Error Log des Servers (Apache) - Nur ein Auszug
[Tue Jun 28 15:12:11 2005] MyScript.pl: Use of uninitialized value in transliteration (tr///) at MyScript.pl line 891.
[Tue Jun 28 15:12:11 2005] MyScript.pl: Use of uninitialized value in substitution (s///) at MyScript.pl line 892.
[Tue Jun 28 15:12:11 2005] MyScript.pl: Use of uninitialized value in substitution (s///) at MyScript.pl line 893.
[Tue Jun 28 15:12:11 2005] MyScript.pl: Use of uninitialized value in substitution (s///) at MyScript.pl line 894.
[Tue Jun 28 15:12:11 2005] MyScript.pl: Use of uninitialized value in substitution (s///) at MyScript.pl line 895.
[Tue Jun 28 15:12:11 2005] MyScript.pl: Use of uninitialized value in substitution (s///) at MyScript.pl line 896.
[Tue Jun 28 15:12:11 2005] MyScript.pl: Use of uninitialized value in substitution (s///) at MyScript.pl line 897.
[Tue Jun 28 15:12:11 2005] MyScript.pl: Use of uninitialized value in substitution (s///) at MyScript.pl line 898.
[Tue Jun 28 15:12:11 2005] MyScript.pl: Use of uninitialized value in substitution (s///) at MyScript.pl line 899.


Code (perl): (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
#!/usr/bin/perl -T
use strict;
use warnings;
use CGI::Carp qw(fatalsToBrowser);
# Das ist nur ein Auszug aus einem großen Skript!

sub ParseGet
{
my $buffer = $ENV{QUERY_STRING};
my @pairs = split(/\s/, $buffer);
my %FORM = ();

    for my $pair (@pairs)
    {
    my ($name, $value) = split(/=/, $pair);
    # Line 891 -> 899
    $value =~ tr/+/ /;
    $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
    $value =~ s/<;!--(.|\n)*-->;//g;
    $value =~ s/\s-\w.+//g;
    $value =~ s/system\(.+//g;
    $value =~ s/grep//g;
    $value =~ s/\srm\s//g;
    $value =~ s/\srf\s//g;
    $value =~ s/\.\.([\/\:]|$)//g;
    # Line 899 <- 891
    $FORM{$name} = $value;
    }
}
Ronnie
 2005-06-28 18:25
#55775 #55775
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
du könntest hinter jedes Statement if $value schreiben, oder einen ganzen Block entsprechend klammern. Die Fehler tauchen in der Regel auf, wenn du versuchst mit einer leeren Variablen zu arbeiten.
Strat
 2005-06-28 18:30
#55776 #55776
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
es scheint wohl $value undef zu sein... kann passieren, wenn z.B. 'irgendwas=' ohne wert aufgerufen wurde
Loesung:

1. erschiess den programmierer, der diesen parameterscanner verbrochen hat.

2. ueberpruefe $value auf definedness, oder schreib mal mindestens:
Code: (dl )
my ($name, $value) = split(/=/, $pair, 2);

dann wird $value in so einem fall zumindest eine leere zeichenkette, und auch was in der form 'a=b=c' verliert das =c nicht

3. Ersetze den ganzen krempel durch CGI, und sag fuer jede variable, was drinnen sein darf und nicht, was nicht drinnen sein darf. da vergisst man naemlich ganz schnell was und handelt sich voellig unnoetige sicherheitsluecken ein
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
cbxk1xg
 2005-06-28 18:50
#55777 #55777
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
> 1. erschiess den programmierer, der diesen parameterscanner verbrochen hat.
Meinst du die SUB? Was ist daran so schlimm? Es werden doch fast alle bösen Sachen rausgefiltert.
Crian
 2005-06-28 19:04
#55778 #55778
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
z.b. "\srm" was ist bei "rm -rf /"? Da greift es nicht. -> \brm hilft weiter, aber das ist Symptomkaschoierung... wie Strat schon schrieb, verwende CGI und leg fest was erlaubt ist, zu sagen, was verboten ist, ist der falsche™ Weg...
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
Strat
 2005-06-28 19:18
#55779 #55779
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
was daran so schlimm ist? reicht punkt 2 nicht?
was geschieht, wenn ploetzlich jemand auf die idee kommt, da ein paar checkboxen mit demselben namen zu verwenden? dann bekommst du nur einen wert, und die anderen verschwinden im nirvana, oder du musst den parser aendern

auf was matcht eigentlich:
Code: (dl )
$value =~ s/<;!--(.| )*-->;//g;

space ist in . schon drinnen, also ist die alteration unnoetig
* bzw. + matcht auf 0 bzw. 1 oder mehrere vorkommen des vorherigen ausdruckes, aber moeglichst viele... meistens matcht es auf mehr als man geplant hat

wofuer system/grep/...? es gibt noch viele andere boese kommandos...

warum nicht einfach was verwenden, was von zig tausend programmierern schon getestet wurde?
Code: (dl )
1
2
3
use CGI;
my $cgi = CGI->new();
my %params = $cgi->Vars();

dann jeden parameter darauf testen, ob da wirklich nur erlaubtes vorkommen darf (oft vereinfacht dies das die modulgruppe Regexp::Common).

Und Input stillschweigend zu verwerfen finde ich persoenlich nicht toll; wenn was kommt, was nicht erlaubt ist, besser einen fehler/warnung usw. ausgeben, und den user die daten nochmal eingeben lassen.  und wenn du global grep entfernst und der parameterscanner wird fuer ein perl- oder unix-forum verwendet, dann verstuemmelst du unnoetigerweise vielleicht doch nicht voellig unwichtige daten...

nebenbei: my hilft nur gegen strict... use of initialized value wird von warnings ausgegeben\n\n

<!--EDIT|Strat|1119972159-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
cbxk1xg
 2005-06-28 20:25
#55780 #55780
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
[quote=Crian,28.06.2005, 17:04]z.b. "\srm" was ist bei "rm -rf /"? Da greift es nicht. -> \brm hilft weiter, aber das ist Symptomkaschoierung... wie Strat schon schrieb, verwende CGI und leg fest was erlaubt ist, zu sagen, was verboten ist, ist der falsche&™ Weg...[/quote]
OK überzeugt. Ich mag nur keinen übermäßigen Einsatz von Modulen. Das ist oft nicht unbedingt der performanteste Weg.

Kann man Module auch wieder aus dem Speicher killen, wenn sie Ihre Arbeit getan haben?
pq
 2005-06-28 22:21
#55781 #55781
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=cbxk1xg,28.06.2005, 18:25]Kann man Module auch wieder aus dem Speicher killen, wenn sie Ihre Arbeit getan haben?[/quote]
wieso solltest du sowas tun wollen? entweder du hast ein CGI-skript, da verschwindet ja sowieso alles nach dem request, da das skript sich beendet,
oder du nimmst mod_perl, da sollte dich das nicht stören, da das modul
nur einmal geladen wird und dann hoffentlich im shared memory liegt.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Heromaster
 2005-06-28 22:31
#55782 #55782
User since
2003-08-05
220 Artikel
BenutzerIn
[default_avatar]
Es gibt auch CGI::Lite, welches genau für Leute für Dich sicherlich geeignet ist wenn es nur ums Parsen von POST- & GET-Requests geht.
Wenn es Dir darum geht Performance zu erhöhen, gibt es andere Mittel als auf Module zu verzichten, die einem das Leben erleichtern :)
Derjenige, der zwei Hasen jagt, lässt einen zurück und verliert den anderen.
supersucker
 2005-06-29 00:12
#55783 #55783
User since
2005-03-17
118 Artikel
BenutzerIn
[default_avatar]
Quote
Kann man Module auch wieder aus dem Speicher killen, wenn sie Ihre Arbeit getan haben?


geht meines wissens nach nicht, der von einem script / programm allokierte speicher kann nicht während der programm-ausführung an den speicherpool des betriebssystems zurückgegeben werden, da das kein betriebssystem unterstützt.
<< |< 1 2 >| >> 14 Einträge, 2 Seiten



View all threads created 2005-06-28 18:19.