Next: , Previous: , Up: List of Programming Languages   [Contents][Index]


15.5.3 bash - Bourne-Againシェルスクリプト

GNU bash 2.0以降には、変数の中の文字列を翻訳して置き換えるための特別な略記法$"msgid"があります。しかし、これによりもたらされるセキュリティーホールと可搬性の問題により、この機能の使用には 賛成できません。

$"..."によるセキュリティーホールとは、その文字列にたいする翻訳を検索した後、‘eval’が2重引用符に囲まれた文字列や$ 記号、バッククォートされた文字列にたいして行うのと同様なことをbashが行う点にあります。

  1. エンコーディングがBIG5、BIG5-HKSCS、GBK、GB18030、SHIFT_JIS、JOHABのいずれかを使うlocaleでは、2byte文字の2byte目が0x60の文字が存在します。たとえば、これらのlocaleでは\xe0\x60というバイト並びは1つの文字です。bashの多くのバージョン(bash-2.05以降、およびmbsrtowcs()関数を持たないプラットフォーム向けの新しいバージョン)は、文字境界を認識しないので、特定のChinese文字をバッククォートと認識します。このため翻訳の一部がコマンドリストとして実行されてしまうことが起こり得るのです。この状況は翻訳者が気をつけていても起こり得ます。翻訳者が翻訳をUTF-8エンコーディングで提供したとしても、その翻訳はgettext()関数によって翻訳者のエンコーディングからユーザーのlocaleのエンコーディングに変換され、その変換によって"危険な"\x60というバイトが生成される可能性があるからです。
  2. 故意にせよ不注意にせよ、翻訳者は翻訳の中にバッククォート"`...`"や、$カッコ"$(...)"を使用することもあり得るので、それらに囲まれた文字列はコマンドリストとしてシェルにより実行されてしまいます。

可搬性の問題とは、bashをインターナショナリゼーションのサポート付きでビルドしなければならないことです。これはlibcにgettext()関数がないシステムでは、通常できません。