[Vienna-pm] Escapen von Shellparametern

Josef Schmid e9427749 at stud4.tuwien.ac.at
Mon Apr 28 11:18:56 PDT 2008


Stefan Weiss schrieb:
> On 2008-04-28 18:20, Josef Schmid wrote:
>> 1) Hmm, ich würde es als Array system() oder open() übergeben,
> 
> [...]open(): Das war mir noch gar nicht bekannt, dass das überhaupt 
> unterstützt wird. Das könnte eine wirklich interessante Lösung sein. Ist 
> das ein neueres Feature?

ich glaub ab 5.6 (oder ab 5.8?)
my $result=do {
   open(my $fh,'-|','faxjob','--from',$from,'--faxnum',$num,...) or die;
   local $/; <$fh>
};

>> 2) quotemeta ist für RE gedacht, müsste man sich durchdenken.
>>     ala ´´ etc. Adererseits alles mit '' einschliessen, dann
>>     reicht vielleicht schon "'" => "\'"

Ok quotemeta scheint sehr grosszügig mit '\' zu sein.
Aber auf charset muss man dann trotzdem noch aufpassen.
Da manche Kodierungen aus mehreren Bytes bestehen, wenn
sich da beide Seiten ¬ einig sind.
...
> 
> Zeichen in quoted-Strings zu escapen (gerade ' und ") ist in der Bash 
> umständlicher als ohne Quotes. Probier mal
>      echo 'foo\'bar'
> (und dann echo 'foo'"'"'bar')

Dafür scheint's das einzige zu sein, was man 'quoten' muss,
und sub qesc($){ (my $t=shift)=~s{'}{'\\''}g; "'$t'" }
ist auch wieder ¬ so kompliziert.
Allerdings was ist wenn's dann eine andere Shell ist...


>> 3) Offensichtlich handelt es sich bei $from und $num
>>     um speziellere Datentypen, deshalb sollte auch eingeschränkter
>>     geprüft werden: z.B. $num nur erlaubt wenn !/\D/
>>     Möglicherweise gefällt Dir eins der unzähligen Validierungs-
>>     module auf CPAN.
> 
> Das funktioniert nur für einfache Parameter. Was ich validieren kann, 
> habe ich validiert. Sobald man aber einen user-definierten Textinhalt 
> mitgeben möchte, muss man trotzdem richtig escapen.

Oder per IO übergeben ala -from-file - oder -from-file /dev/fd/3.
Oder 'named pipes'
Insbesondere da man wenn man komplette zu faxende Texte angibt,
riskiert irgendwann Bekanntschaft mit der maximalen Befehlszeilen-
länge zu machen.

Gibt's auch einiges auf CPAN. Halte nach IPC::* Ausschau.


>> 4) wenn schon unsicher, dann so dass man jemand anderen die
>>     Schuld zuschieben kann. ;-)
>>     use Shell;
> 
> Auch interessant, habe ich auch noch nicht gekannt. Lohnt sich ja doch, 
> zur Sicherheit auf der vienna.pm Liste nachzufragen =)
> 
> Wobei mich die Manpage von Shell.pm ein bißchen abschreckt:
> 
>   | This package is included as a show case, illustrating a few Perl
>   | features. It shouldn’t be used for production programs.[¹]
> 
> Ich nehme an, es wird schon richtig funktionieren, aber wenn nicht, und 
> jemand diese Passage liest, bekomm erst recht wieder ich eine auf den 
> Deckel :-)

that's life,
   Josef

ad 1) Ach würd ich ¬ so eng sehen, ist doch eh Standardtext so ziemlich
       jeder Lizenz ;-)
btw&ps: für alles was ich so von mir gegeben hab & geb, gilt:
         | This is included as a show case, illustrating a few Perl
         | features. It shouldn’t be used for production programs.[¹]



More information about the Vienna-pm mailing list