JPCERT コーディネーションセンター

IDS09-J. 適切なロケールを指定せずに、ロケール依存メソッドをロケール依存データに対して使用しない

ロケールを指定せずに、ロケールに依存するメソッドをロケールに依存するデータに適用すると、予期せぬ結果が得られる可能性がある。プログラミング言語の識別子、プロトコルキー、HTMLタグなどはしばしば特定のロケールで記述されるが、一般的にはLocale.ENGLISHが用いられる。デフォルトのロケールを変更することでロケールに依存するメソッドの動作が変わり、その結果入力フィルタが回避されてしまうかもしれない。たとえば、大文字に変換した文字列は有効であると判定されるのに、その後に小文字に変換するとブラックリストに登録された文字列になってしまう、といったことがあり得る。

信頼できないデータに対してロケール依存のメソッドを使用するプログラムは、ロケールを明示的に指定しなくてはならない。

違反コード

以下の違反コード例では、HTMLタグを大文字に変換するためにロケール依存のメソッドであるString.toUpperCase()を使っている。英語ロケールでは "title" は "TITLE" に変換されるが、トルコ語のロケールでは "T?TLE" に変換されてしまう。この '?' はラテン大文字 'I' の上部にドットが1つついた文字である[API 2006]。

"title".toUpperCase();
適合コード (明示的にロケールを指定)

以下の適合コードでは、ロケールを明示的に英語に設定し、予期せぬ動作の発生を防いでいる。

"title".toUpperCase(Locale.ENGLISH);

このルールは String.equalsIgnoreCase() メソッドにも適用される。

適合コード (デフォルトのロケールを設定)

以下の適合コードでは、文字列操作を行う前にデフォルトのロケールを英語に設定している。

Locale.setDefault(Locale.ENGLISH);
"title".toUpperCase();
リスク評価
ルール 深刻度 可能性 修正コスト 優先度 レベル
IDS09-J P8 L2
参考文献
[API 2006]Class String
翻訳元

これは以下のページを翻訳したものです。

IDS09-J. Do not use locale-dependent methods on locale-sensitive data without specifying the appropriate locale (revision 52)

Top へ

Topへ
最新情報(RSSメーリングリストTwitter