Du vertraust darauf, dass der inhalt der CGI Variable gewährleistet ist?
Warum und wodurch sollte dieser verändert werden?
Das ist nicht die Frage. Das CGI Modul gibt dir böse Rohdaten.
In Perl gibt es genau einen Standardprozess, wie du Userdaten untaintest.
Das Prinzip ist
$InputRohdaten{feld1} =~ /(x|y|z)/ and $InputUntainted{feld1} = $1;
Das ist der einzige Weg, Userinput zu untainten.
Um das etwas zu rationalisieren:
foreach( %InputRohdaten ){
/^feld1$/
and $InputRohdaten{$_} =~ /(x|y|z)/
and $InputUntainted{$_} = $1
and next;
/^feld2$/
and $InputRohdaten{$_} =~ /(\d{1,3})/
and $InputUntainted{$_} = $1
and next;
/^feld3$/ and
$InputRohdaten{$_} =~ /([\w-]{10,32})/
and $InputUntainted{$_} = $1
and next;
}
%InputRohdaten = (); # brauchen wir nicht mehr...
Überlege dir den Vorteil, Funktionen in Modulen (und auch in anderen Subs) stets eine Hashreferenz zu übergeben.
modul_func( { key => $val1, key2 => $val2, } )
Dann kann aus dem externen Unterprogramm über diese Referenz auf die z.T. lokalen (my) Variablen im Hauptprogramm zugegriffen werden?
Ja, übergibst du eine Referenz, arbetest du auf dem Original.
Normaler Hash
my %hash = ( key => $val1, key2 => $val2, );
some_func_in_some_package( %hash );
Referenz eines Anonymen hashes mit Klammer {}
my $anonhashref = { key => $val1, key2 => $val2, };
some_func_in_some_package( $anonhashref );
Für mich erschliesst sich übrigens der Sinn von ausgelagerten Funktionen nicht, es sei denn, diese sind nach Modulrichtilinien mit dokumentierter API versehen.
Ich möchte erstens keine riesigen Programme und zweitens nicht in jedem Programm z.B. die gleiche Fehlerroutine schreiben.
Der Programmumfang ist die Summe der Ressourcen.
Mehr Komplexität, mehr Chaos, schlechteres Debugging.
In meinem 5500++ Zeilenprogramm habe ich gerade mal 10 Zeilen Code für Errormessages, die zudem nie innerhalb des letzten Jahres ausgeführt wurden.
Das sollte dir etwas sagen. Musst du Errormessages ausgeben, machst du etwas falsch.
mfg Beat;