国際化について語るとき、セキュリティは見落とされがちですが、留意すべき重要なことがいくつかあります。
スパムやその他の悪意ある文字列のチェック
翻訳者がローカライズを提出する際には、翻訳にスパムやその他の悪意ある単語が含まれていないか、必ず確認してください。原文の文字列と翻訳した文字列を簡単に比較できるように、Google 翻訳を使って翻訳者の翻訳をあなたの母国語に翻訳し直すことができます。
国際化された文字列のエスケープ
翻訳者がローカライズに良性のテキストだけを加えるとは限りません。その気になれば、悪意ある JavaScript やその他のコードも追加できます。そのような事態から守るためには、国際化された文字列を、他の信頼できない入力と同じように扱うことが重要です。
文字列を出力するのであれば、エスケープすべきです。
危険
_e( 'The REST API content endpoints were added in WordPress 4.7.', 'your-text-domain' );
安全
esc_html_e( 'The REST API content endpoints were added in WordPress 4.7.', 'your-text-domain' );
もしくは、コードにエスケープを追加するのではなく、翻訳検証メカニズムに依存することを選択する人もいます。検証メカニズムの一例として、WordPress Polyglots チームが translate.wordpress.org で使用しているエディターの役割があります。これにより、信頼されていない貢献者によって投稿された翻訳が受理される前に、信頼されたエディターによって検証されることが保証されます。
URL にプレースホルダーの使用
悪意ある翻訳者が、別の URL を指すように変えてしまう可能性があるため、国際化された文字列には URL を含めないでください。代わりに、printf()
または sprintf()
のプレースホルダーを使用してください。
危険
_e(
'Please <a href="https://login.wordpress.org/register"> register for a WordPress.org account</a>.',
'your-text-domain'
);
安全
printf(
esc_html__( 'Please %1$s register for a WordPress.org account %2$s.', 'your-text-domain' ),
'<a href="https://login.wordpress.org/register">',
'</a>'
);
独自 .mo バイナリのコンパイル
しばしば、翻訳者はコンパイルした .mo ファイルをプレーンテキストの .po ファイルと一緒に送って来ますが、その .mo ファイルが対応する .po ファイルからコンパイルされたものなのか、それとも別のものなのかを知る術がないため、その .mo ファイルは破棄して自分でコンパイルすべきです。それが別のものに対してコンパイルされたものであれば、あなたの知らないうちにスパムやその他の悪意ある文字列が含まれている可能性があります。
PoEdit を使ってバイナリを生成すると、.po ファイルのヘッダーが上書きされてしまうので、コマンドラインからコンパイルするほうが良いです:
msgfmt -cv -o /path/to/output.mo /path/to/input.po