Perlでコーディングするときに本当に外部コマンドを使用する必要がありますか?私はそれのいくつかの不利な点を見ます。これはシステムに依存しないだけでなく、セキュリティリスクも存在する可能性があります。どう思いますか?方法がなく、Perlのシェルコマンドを使用する必要がある場合、その特定のコマンドを実行するための最も安全な方法は何ですか(pid、uidなどのチェックなど)?
3 に答える
これは、Perlで機能を複製するのがどれほど難しいかによって異なります。マクロプロセッサを何かで実行する必要がある場合m4
、Perlでその機能を自分で複製しようとは思いません。また、http://search.cpan.org/に適切と思われるモジュールがないため、他のモジュールのように見えます。私に同意します。その場合、外部プログラムを使用するのが賢明です。一方、ディレクトリの内容を読み取る必要がある場合は、readdir()
et al plusstat()
またはlstat()
Perl内での組み合わせは、の出力をいじくり回すよりも賢明ですls
。
コマンドを実行する必要がある場合は、コマンドの呼び出し方法について慎重に検討してください。特に、シェルが引数を解釈するのを避けたい場合は、コマンドと引数に単一の文字列ではなく、system
(も参照)などの配列形式を使用します(つまり、シェルはコマンドラインの処理に使用されます) exec
。
外部コマンドの実行は、新しいプロセスをフォークし、必要に応じてその出力を監視する必要があるため、コストがかかる可能性があります。
おそらくもっと重要なことは、何らかの理由で外部プロセスが失敗した場合、スクリプトを使用して何が起こったのかを理解するのが難しい場合があります。さらに悪いことに、驚くべきことに、外部プロセスが永久にスタックする可能性があるため、スクリプトもスタックします。パイプを開いたり、ループ内の出力を監視したりするなどの特別なトリックを使用できますが、これ自体はエラーが発生しやすくなります。
Perlは多くのことを行うことができます。したがって、Perlのネイティブ構造とモジュールのみを使用してタスクを実行する場合は、フォークしないため高速になるだけでなく、によって返されるネイティブのPerlオブジェクトと構造を調べることで、より信頼性が高く、エラーをキャッチしやすくなります。ライブラリルーチン。そしてもちろん、それはさまざまなプラットフォームに自動的に移植可能になります。
スクリプトを昇格された権限(rootやsudoなど)で実行する場合は、実行する外部プログラムに十分注意する必要があります。基本的なセキュリティを確保する簡単な方法の1つは、コマンドを常に/ usr / bin / grepのようにフルネームで指定することです(ただし、それでもよく考えて、Perl自体でgrepを実行してください!)。ただし、攻撃者がLD_PRELOADメカニズムを使用して不正な共有ライブラリを挿入している場合は、これでも十分ではない可能性があります。
非常に安全を確保したい場合は、次のように-Tフラグを使用して汚染されたチェックを使用することをお勧めします。
#!/usr/bin/perl -T
スクリプトが異なる実際の有効なユーザーIDまたはグループIDを持っていると判断された場合、汚染フラグもPerlによって自動的に有効になります。
汚染されたモードは、Perlが文句を言わずに多くのこと(system()呼び出しなど)を実行する能力を大幅に制限します-詳細についてはhttp://perldoc.perl.org/perlsec.html#Taint-modeを参照してください。セキュリティの信頼。
Perlでコーディングするときに本当に外部コマンドを使用する必要がありますか?
この質問に対する単一の答えはありません。それはすべて、Perlの幅広い潜在的な使用法の中で何をしているかに依存します。
ローカルマシンで栄光のシェルスクリプトとしてPerlを使用していますか、それとも問題の迅速で汚い解決策を見つけようとしていますか?その場合、それがタスクを実行する最も簡単な方法である場合は、システムコマンドを実行することは非常に理にかなっています。セキュリティと速度はそれほど重要ではありません。重要なのは、すばやくコーディングできることです。
一方、制作プログラムを書いていますか?その場合、安全で、移植性があり、効率的なコードが必要です。多くの場合、外部プログラムを呼び出すよりも、Perlで機能を記述する(またはモジュールを使用する)方が望ましいです。少なくとも、メリットとデメリットについて真剣に考える必要があります。