O'Reillyの「Classic Shell Scripting」を読んだ結果、潜在的に悪意のあるまたは他の誤った入力を防ぐために、各シェルスクリプトの先頭で入力フィールド区切り文字IFSを改行、スペース、およびタブにリセットしたいようです。
これは実際にすべてのシェルスクリプトのベストプラクティスですか?すべてのシェルスクリプトにこれを含めることは私にとっては実用的ではないようです。
IFS='
'
ベストアンサー1
最近のベストプラクティスに必ずしも必要ではなく、ただ混乱しているだけです。歴史的に、これは疑問の余地があります。
歴史
歴史的に、shのいくつかの実装はIFS
他の変数と同様に環境から継承されていましたが、他の実装ではデフォルト値(space-tab-newline)に強制されていました。ほとんどの21世紀の貝は後者です。
POSIX両方の動作を許可するために使用されます。
実装では、シェルが呼び出されたときに環境のIFS値を無視して、IFSを未設定として処理できます。
「IFS を未設定として扱う」では、実際にはフィールド分割に設定解除と同じ効果がある値に設定する一般的な動作については説明しません。これはで議論されました。オースティングループ改善依頼096フレーズを変更しますが、それでも維持または上書きを許可しますIFS
。
数年前からこのように変わりました。オースティングループ欠陥0000884開始時に「IFSを次に設定するにはshが必要です<space><tab><newline>
。」このプロポーザルは2015年に提出され、2016年バージョンに採用されました。POSIX:2008それでは、次を宣言してください。
シェルは
<space> <tab> <newline>
呼び出されたときにIFSを設定する必要があります。
IFS
その根拠は、信頼できないソースで設定されている可能性がある環境でスクリプトが設定および実行されないときに頻繁に発生する望ましくない動作を回避することです。
したがって、最近では、以前のIFS
シェルを使用する場合は明示的にデフォルト値を設定するだけで、標準的な慣行とは異なるバリエーションが必要になることがあります。
これはベストプラクティスですか?
スクリプトが信頼できないソースから環境変数を継承すると、多くの問題が発生する可能性があります。IFS
これは多くの潜在的な問題の1つです。そしてPATH
、、、、、、、、...すべて設定することができますかLD_LIBRARY_PATH
?覚えていますか? ? ?PYTHONPATH
PERLLIB
PERL5LIB
RUBYPATH
LD_PRELOAD
TEXINPUTS
RSYNC_RSH
一部の変数の名前には以下が含まれます。()
?
スクリプトが任意の名前の環境変数を継承する場合それ問題なので、スクリプト内で変更できません。攻撃者が制限なく環境の変数名を解決できるようにするシェルスクリプトを実行しないでください。だからこそSudoホワイトリスト環境変数名のみが許可されます。
歴史的に、これは主に問題でした。コンピュータグラフィックス画像処理環境変数名をフィルタリングしないインターフェイス。使用される通信事業者の1つです。シェルショック。良い最新のCGIのようなシステムは、すべての変数の前にプレフィックスを付け、変数名がASCII英数字と下線のみで構成されるようにします。