Perlゼミ

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 第7版

    Perl入門 定番の一冊
  • 業務に役立つPerl

    ログ解析など日本語を含むテキスト処理の実践!
  • 詳説 正規表現

    正規表現の詳細な解説
  • Perlの書籍販売 14冊 »
自己紹介
木本裕紀(きもとゆうき)

Twitter

フォロー、いいね、リツート、コメント歓迎

Youtube

チャンネル登録、いいね、コメント歓迎
Perlの求人広告募集中