Ein Lösungsweg
bearbeitet von woodfighterTach,
> Ein paar Fehler der Fingerübung (überflüssige/falsche Zeilenumbrüche im Ergebnis) entfernt, strict hinzugefügt, mehr Tests. Verschönert.
>
> ~~~perl
> #!/usr/bin/perl
> use strict;
>
> sub htpasswd_wrapper {
> ## return a fine hashed password for Apache 2.4 oder 2.2
> ## usage htpasswd_wrapper($passwd_clear, '2.4')
> ## or htpasswd_wrapper($passwd_clear, '2.2')
>
> my $passwd_clear = shift;
> my $version = shift;
> my $sys = '';
> my $passwd_hash = '';
> $passwd_clear =~ s/\"/\\\"/g;
> $passwd_clear =~ s/\`/\\\`/g;
>
> if ( $version eq "2.2" ) {
> $sys = "echo \"$passwd_clear\" | /usr/bin/htpasswd -in \"USER\";";
> } elsif ( $version eq "2.4" ) {
> $sys = "echo \"$passwd_clear\" | /usr/bin/htpasswd -Bin \"USER\";";
> }
>
> if ($sys) {
> $passwd_hash = `$sys`;
> $passwd_hash =~ s/\s+$//;
> $passwd_hash =~ s/^USER://;
> return $passwd_hash;
> } else {
> return '';
> }
> }
>
> ## Tests:
> my $passwd_hash;
> $passwd_hash = htpasswd_wrapper("hallo", '2.4');
> print $passwd_hash . "\n";
> $passwd_hash = htpasswd_wrapper("hallo", '2.4');
> print $passwd_hash . "\n";
> print '-' x 60 . "\n";
> $passwd_hash = htpasswd_wrapper("ha'llo", '2.4');
> print $passwd_hash . "\n";
> $passwd_hash = htpasswd_wrapper('ha"llo', '2.4');
> print $passwd_hash . "\n";
> $passwd_hash = htpasswd_wrapper('ha`ll`o', '2.4');
> print $passwd_hash . "\n";
> $passwd_hash = htpasswd_wrapper('ha` | less`o', '2.4');
> print $passwd_hash . "\n";
> ~~~
zu versuchen, escaping selber zu machen, ist eine sehr blöde Idee; ohne es gerade testen zu können dürfte hier ein PW in der Form $(/bin/evil) ausreichen.
mfg\\
Woodfighter