4

require 'lib/file.pl'私は最近、自分のシステムではで実行しているときは不可能であることに気付きました-Tが、require './lib/file.pl'動作します。

$ perl -wT -e 'require "lib/file.pl";'
Can't locate lib/file.pl in @INC (@INC contains: /usr/lib/perl5/site_perl/5.14.2/x86_64-linux-thread-multi /usr/lib/perl5/site_perl/5.14.2 /usr/lib/perl5/vendor_perl/5.14.2/x86_64-linux-thread-multi /usr/lib/perl5/vendor_perl/5.14.2 /usr/lib/perl5/5.14.2/x86_64-linux-thread-multi /usr/lib/perl5/5.14.2 /usr/lib/perl5/site_perl/5.14.2/x86_64-linux-thread-multi /usr/lib/perl5/site_perl/5.14.2 /usr/lib/perl5/site_perl)

$ perl -wT -e 'require "lib/file.pl"'

$ perl -w -e 'require "lib/ file.pl -T"' $ perl -w -e 'require "./lib/file.pl"'

taint モードで.は、 の一部ではありません@INC

perl -w -e 'print "@INC"'
[..snip..] /usr/lib/perl5/site_perl/5.14.2 /usr/lib/perl5/site_perl .
perl -wT -e 'print "@INC"'
[..snip..] /usr/lib/perl5/site_perl/5.14.2 /usr/lib/perl5/site_perl

ドキュメントでその動作を見つけることができませんでした。これがどこに文書化されているか、またはlibディレクトリとして-T好きではない理由を教えてください。.

4

1 に答える 1

12

えーと...これは実際には十分に文書化されています、私は推測します:

汚染モード(-T)が有効な場合、「。」ディレクトリは@INCから削除され、環境変数PERL5LIBおよびPERLLIBはPerlによって無視されます。perlrunで説明されているように、-Iコマンドラインオプションを使用して、プログラムの外部から@INCを調整することもできます。

...しかし、それは答えの半分に過ぎないと思います。そのような決定の背後にある理由はここに与えられています:

... @INCの問題は、実際にはCGIスクリプトよりもSUIDスクリプトの問題です。別のユーザー(rootなど)の権限で実行できるSUIDスクリプトがある場合、Perlは自動的に汚染モードになります。

このSUIDスクリプトの場合、ユーザーの現在のディレクトリからライブラリをロードする機能を使用すると、セキュリティが大幅に侵害されます。ライブラリが通常のディレクトリパスに見つからないというバグがスクリプトに発生した場合、ユーザーは独自の悪意のあるバージョンのライブラリを作成し、それを現在のディレクトリに配置して、からSUIDスクリプトを実行することでこれを悪用する可能性があります。それらの現在のディレクトリ。

ただし、これはCGIスクリプトの場合と実際には同じ問題ではありません。ユーザーが任意のディレクトリからスクリプトを実行していません。Webサーバーは、スクリプトが呼び出されるディレクトリを制御します。だから「。」を維持する @INCでの処理は、汚染モードで自動的に動作するSUIDスクリプトと比較して実際には問題ではありません。

于 2012-07-03T10:53:41.593 に答える