Perl でパスワードZipを求められた際の対応方法
前提
Perl は初めて触りました。
対応を求められたサーバの環境は古いです。
$ perl -v This is perl, v5.10.1 (*) built for x86_64-linux-thread-multi
QBK (急にボールが来たので)
他にヘルプできそうな人間がいなかったということで、触ったことのない Perl のソースコード修正を求められました。
内容は、Webフォームに添付されたデータをメールで送信するシステムの添付ファイルをパスワードZipで圧縮すること。
Perl 触ったこともないので、極力他に影響を与えたくない一心で対応しました。
調べてみると、Perl の標準モジュールに「Archive::Zip」というものがあるのですが、これはパスワードZipに対応していませんでした。。。
どうしようかなー、と悩んだのですが、Perl からコマンドが呼び出せるらしいので、コマンドでパスワードZipを作成し、それを添付することにしました。
ということで対応したコードが以下。
#----------------------------------------------------------- # パスワードzip生成 # 引数: ファイル名 # 備考: $cf{upldir} には、ファイルの保管場所ディレクトリパスが入っている #----------------------------------------------------------- sub zip { my $ZIP_CMD = "/usr/bin/zip"; my $ZIP_PASSWD = "************"; my ($origin_name) = @_; my $zip_name = "$origin_name.zip"; my $cmd = "$ZIP_CMD -jP $ZIP_PASSWD $cf{upldir}/$zip_name $cf{upldir}/$origin_name"; # パスワードzipの生成コマンド system($cmd); # コマンドの実行 }
で、これをメール送信処理中の添付ファイルをセットする前に
&zip($fname); # $fname には対象となるファイル名が格納されている
と呼び出して、生成したファイルを添付することで対応しました。
今回はパスワード自体をランダム化する必要が無いという要件だったので、ソースコード内にパスワードを埋め込んでいますが、あまりよろしくないという認識はあります。
また、system関数は便利な半面、セキュリティリスクになりそうなので、使い所を見極めて使う必要がありますね。