Perl 5.26への@INC問題にアップグレード前に対処しておきましょう

Perl 5.26では、セキュリティ上の問題で、モジュールのインクルードパスから「.」(カレントディレクトリ)が取り除かれます。

この問題についてはcharsbarさんの記事が詳しいです。

Perl 5.26にアップグレードする前にこの問題に対処しておく

CPANモジュールについては、この問題については対処してくれるようですので、修正の必要があるのは、自社で使っているスクリプトです

僕の会社でも、古いCGIスクリプトが一部現役で動いていたりします。ちょっと調べてみると、Perl 5.26にアップグレードする前には、スクリプトを一部修正する必要があるようでした。jcode.plやcgi-lib.plが読み込まれているものがちらほらとあります。

そこで、以下のようにfindといくつかのコマンドを組み合わせて、修正の必要がある箇所を表示できるコマンドを作ってみました。

find . \( -name \*.pl -or -name \*.pm -or -name \*.cgi \) | xargs grep -e require -e do[^a-zA-Z];

Perlスクリプトが存在するディレクトリの一番上の階層で上記のコマンドを実行すると、拡張子が「.pl」「.pm」「.cgi」のスクリプトの中にある「require」と「do」を使っている場所をすべて抽出できます。

たとえば以下のような行が出力されるでしょう。

require "mylib.pl";
do "myconf.pl";

こういう場所が見つかった場合は、スクリプトの先頭に、次のように追加しましょう。スクリプトが存在するディレクトリの絶対パスが、モジュールのインクルードパスに追加されます。

use FindBin;
use lib $FindBin::Bin;

(参考)FindBin

アップグレードしてから対処するよりも、アップグレード前に対処しておくと楽です。

追記

何回も「.」が@INCの先頭に追加されていると書いてきましたが、「.」が末尾に追加されているの間違いでした。Twitterで指摘をもらいました。

業務に役立つPerl

Perlテキスト処理のエッセンス

PerlでポータブルなLinuxファイル管理入門

ITエンジニアの求人情報など

 ITエンジニアの求人情報・Webサービス・ソフトウェア・スクールなどの情報。

システム開発のお問い合わせ